@ethlete/contentful 0.1.0-next.2 → 0.1.0-next.3
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/esm2020/lib/components/audio/contentful-audio.component.mjs +12 -5
- package/esm2020/lib/components/file/contentful-file.component.mjs +12 -5
- package/esm2020/lib/components/image/contentful-image.component.mjs +12 -5
- package/esm2020/lib/components/rich-text-renderer/index.mjs +2 -0
- package/esm2020/lib/components/rich-text-renderer/public-api.mjs +3 -2
- package/esm2020/lib/components/rich-text-renderer/rich-text-renderer.component.mjs +15 -9
- package/esm2020/lib/components/rich-text-renderer/rich-text-renderer.constants.mjs +3 -0
- package/esm2020/lib/components/rich-text-renderer/rich-text-renderer.types.mjs +1 -1
- package/esm2020/lib/components/rich-text-renderer/rich-text-renderer.util.mjs +43 -15
- package/esm2020/lib/components/video/contentful-video.component.mjs +12 -5
- package/esm2020/lib/contentful.module.mjs +4 -4
- package/esm2020/lib/types/contentful.types.mjs +1 -1
- package/fesm2015/ethlete-contentful.mjs +173 -112
- package/fesm2015/ethlete-contentful.mjs.map +1 -1
- package/fesm2020/ethlete-contentful.mjs +170 -111
- package/fesm2020/ethlete-contentful.mjs.map +1 -1
- package/lib/components/audio/contentful-audio.component.d.ts +4 -1
- package/lib/components/file/contentful-file.component.d.ts +4 -1
- package/lib/components/image/contentful-image.component.d.ts +4 -1
- package/lib/components/rich-text-renderer/index.d.ts +1 -0
- package/lib/components/rich-text-renderer/public-api.d.ts +2 -1
- package/lib/components/rich-text-renderer/rich-text-renderer.constants.d.ts +2 -0
- package/lib/components/rich-text-renderer/rich-text-renderer.types.d.ts +6 -0
- package/lib/components/rich-text-renderer/rich-text-renderer.util.d.ts +5 -3
- package/lib/components/video/contentful-video.component.d.ts +4 -1
- package/lib/types/contentful.types.d.ts +14 -2
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ethlete-contentful.mjs","sources":["../../../../libs/contentful/src/lib/components/audio/contentful-audio.component.ts","../../../../libs/contentful/src/lib/components/file/contentful-file.component.ts","../../../../libs/contentful/src/lib/components/image/contentful-image.component.ts","../../../../libs/contentful/src/lib/constants/contentful.constants.ts","../../../../libs/contentful/src/lib/utils/contentful-config.ts","../../../../libs/contentful/src/lib/utils/contentful.util.ts","../../../../libs/contentful/src/lib/components/video/contentful-video.component.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.module.ts","../../../../libs/contentful/src/ethlete-contentful.ts"],"sourcesContent":["import { NgClass, NgIf } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';\nimport { NgClassType } from '@ethlete/core';\nimport { ContentfulAsset } from '../../types';\n\n@Component({\n selector: 'et-contentful-audio',\n template: `\n <figure *ngIf=\"data\" [ngClass]=\"figureClass\">\n <figcaption [ngClass]=\"figcaptionClass\">{{ data.title }}</figcaption>\n <audio [ngClass]=\"audioClass\" controls src=\"{{ data.url }}\"></audio>\n </figure>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgIf, NgClass],\n})\nexport class ContentfulAudioComponent {\n @Input()\n get data() {\n return this._data;\n }\n set data(v: ContentfulAsset | null | undefined) {\n if (v && !v.contentType) {\n this._data = null;\n\n console.warn('The provided asset is invalid', v);\n\n return;\n }\n\n if (v && !v.contentType.startsWith('audio/')) {\n throw new Error('The provided asset is not an audio');\n }\n\n this._data = v ?? null;\n }\n private _data: ContentfulAsset | null = null;\n\n @Input()\n audioClass: NgClassType = null;\n\n @Input()\n figureClass: NgClassType = null;\n\n @Input()\n figcaptionClass: NgClassType = null;\n}\n","import { NgClass, NgIf } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';\nimport { NgClassType } from '@ethlete/core';\nimport { ContentfulAsset } from '../../types';\n\n@Component({\n selector: 'et-contentful-file',\n template: `\n <a *ngIf=\"data\" [href]=\"data.url\" [ngClass]=\"fileClass\" class=\"underline\" target=\"_blank\">\n {{ data.title }} ({{ data.size }} Bytes)\n </a>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgIf, NgClass],\n})\nexport class ContentfulFileComponent {\n @Input()\n get data() {\n return this._data;\n }\n set data(v: ContentfulAsset | null | undefined) {\n if (v && !v.contentType) {\n this._data = null;\n\n console.warn('The provided asset is invalid', v);\n\n return;\n }\n\n this._data = v ?? null;\n }\n private _data: ContentfulAsset | null = null;\n\n @Input()\n fileClass: NgClassType = null;\n}\n","import { NgClass, NgIf } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';\nimport { NgClassType } from '@ethlete/core';\nimport { ContentfulAsset } from '../../types';\n\n@Component({\n selector: 'et-contentful-image',\n template: `\n <picture *ngIf=\"data\" [ngClass]=\"pictureClass\">\n <source srcset=\"{{ data.url }}?fm=avif\" />\n <source srcset=\"{{ data.url }}?fm=webp\" />\n <source srcset=\"{{ data.url }}?fm=jpg\" />\n <img\n [attr.alt]=\"data.description ?? undefined\"\n [attr.width]=\"data.width ?? undefined\"\n [attr.height]=\"data.height ?? undefined\"\n [ngClass]=\"imgClass\"\n src=\"{{ data.url }}\"\n />\n </picture>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgIf, NgClass],\n})\nexport class ContentfulImageComponent {\n @Input()\n get data() {\n return this._data;\n }\n set data(v: ContentfulAsset | null | undefined) {\n if (v && !v.contentType) {\n this._data = null;\n\n console.warn('The provided asset is invalid', v);\n\n return;\n }\n\n if (v && !v.contentType.startsWith('image/')) {\n throw new Error('The provided asset is not an image');\n }\n\n this._data = v ?? null;\n }\n private _data: ContentfulAsset | null = null;\n\n @Input()\n imgClass: NgClassType = null;\n\n @Input()\n pictureClass: NgClassType = null;\n}\n","import { InjectionToken } from '@angular/core';\nimport { ContentfulConfig } from '../utils';\n\nexport const CONTENTFUL_CONFIG = new InjectionToken<ContentfulConfig>('TooltipConfig');\n","import { ComponentType } from '@angular/cdk/portal';\nimport {\n ContentfulAudioComponent,\n ContentfulFileComponent,\n ContentfulImageComponent,\n ContentfulVideoComponent,\n} from '../components';\nimport { ContentfulAsset } from '../types';\n\ntype ComponentLikeWithAsset = ComponentType<{ data: ContentfulAsset | null | undefined }>;\n\nexport interface ContentfulAssetComponents {\n file: ComponentLikeWithAsset;\n image: ComponentLikeWithAsset;\n video: ComponentLikeWithAsset;\n audio: ComponentLikeWithAsset;\n}\n\nexport class ContentfulConfig {\n /**\n * Default components for rendering contentful assets\n */\n components?: Partial<ContentfulAssetComponents> = {\n file: ContentfulFileComponent,\n image: ContentfulImageComponent,\n video: ContentfulVideoComponent,\n audio: ContentfulAudioComponent,\n };\n\n /**\n * Component for rendering embedded entries\n */\n customComponents?: Record<string, ComponentType<unknown>>;\n\n /**\n * Determines if the contentful rich text renderer should render the contentful rich text with tailwind css classes\n */\n useTailwindClasses = false;\n}\n","import { CONTENTFUL_CONFIG } from '../constants';\nimport { ContentfulConfig } from './contentful-config';\n\nexport const provideContentfulConfig = (contentfulConfig: ContentfulConfig) => {\n return { provide: CONTENTFUL_CONFIG, useValue: contentfulConfig };\n};\n","import { NgClass, NgIf } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';\nimport { NgClassType } from '@ethlete/core';\nimport { ContentfulAsset } from '../../types';\n\n@Component({\n selector: 'et-contentful-video',\n template: `\n <video *ngIf=\"data\" [ngClass]=\"videoClass\" controls>\n <source src=\"{{ data.url }}\" type=\"{{ data.contentType }}\" />\n </video>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgIf, NgClass],\n})\nexport class ContentfulVideoComponent {\n @Input()\n get data() {\n return this._data;\n }\n set data(v: ContentfulAsset | null | undefined) {\n if (v && !v.contentType) {\n this._data = null;\n\n console.warn('The provided asset is invalid', v);\n\n return;\n }\n\n if (v && !v.contentType.startsWith('video/')) {\n throw new Error('The provided asset is not an video');\n }\n\n this._data = v ?? null;\n }\n private _data: ContentfulAsset | null = null;\n\n @Input()\n videoClass: NgClassType = null;\n}\n","import { ComponentType } from '@angular/cdk/portal';\nimport { Block, BLOCKS, Inline, INLINES, Mark, Text } from '@contentful/rich-text-types';\nimport { RichTextResponse, ContentfulAsset } from '../../types';\nimport { ContentfulAssetComponents, ContentfulConfig } from '../../utils';\nimport { ContentfulAudioComponent } from '../audio';\nimport { ContentfulFileComponent } from '../file';\nimport { ContentfulImageComponent } from '../image';\nimport { ContentfulVideoComponent } from '../video';\nimport { RichTextRenderCommand } from './rich-text-renderer.types';\n\nexport const createRenderCommandsFromContentfulRichText = (options: {\n data: RichTextResponse;\n config: ContentfulConfig;\n}) => {\n const { data, config } = options;\n\n const commands: RichTextRenderCommand[] = [];\n const assetMap = new Map<string, ContentfulAsset>();\n\n const assetComponents = getAssetComponentsFromConfig(config);\n\n for (const asset of data.links.assets.block) {\n assetMap.set(asset.sys.id, asset);\n }\n\n createContentfulRenderCommand(\n data.json,\n { children: commands, payload: data.json.nodeType },\n assetMap,\n config.useTailwindClasses,\n assetComponents,\n config.customComponents,\n );\n\n return commands;\n};\n\nexport const createContentfulRenderCommand = (\n node: Block | Inline | Text,\n parent: RichTextRenderCommand,\n assetMap: Map<string, ContentfulAsset>,\n useTailwindClasses: boolean,\n assetComponents: ContentfulAssetComponents,\n customComponents: Record<string, ComponentType<unknown>> | undefined,\n) => {\n const { nodeType, data: nodeData } = node;\n\n const { children, marks, value } = getContentfulNodeProps(node);\n\n const command: RichTextRenderCommand = {\n payload: translateContentfulNodeTypeToHtmlTag(nodeType),\n data: value,\n attributes: {\n ...(marks\n ? {\n class: transformContentfulMarks(marks, useTailwindClasses),\n }\n : {}),\n ...(nodeData['uri'] ? { href: nodeData['uri'], target: '_blank' } : {}),\n },\n children: [],\n };\n\n if (nodeType === BLOCKS.EMBEDDED_ASSET) {\n const asset = assetMap.get(nodeData['target']?.sys?.id);\n\n if (asset) {\n const isImage = asset.contentType.startsWith('image/');\n const isVideo = asset.contentType.startsWith('video/');\n const isAudio = asset.contentType.startsWith('audio/');\n\n command.data = asset;\n\n if (isImage) {\n command.payload = assetComponents.image;\n } else if (isVideo) {\n command.payload = assetComponents.video;\n } else if (isAudio) {\n command.payload = assetComponents.audio;\n } else {\n command.payload = assetComponents.file;\n }\n }\n } else if (nodeType === BLOCKS.EMBEDDED_ENTRY || nodeType === INLINES.EMBEDDED_ENTRY) {\n const componentId = nodeData['target']?.sys?.contentType?.sys?.id;\n const component = customComponents?.[componentId];\n\n if (component) {\n command.payload = component;\n command.data = nodeData['target']?.fields;\n } else {\n command.data = `No component found for embedded entry ${componentId} as ${nodeType}!`;\n }\n }\n\n if (children && (children.length !== 1 || children[0].nodeType !== 'text')) {\n children.forEach((child) => {\n createContentfulRenderCommand(child, command, assetMap, useTailwindClasses, assetComponents, customComponents);\n });\n }\n\n parent.children.push(command);\n\n return command;\n};\n\nexport const getContentfulNodeProps = (node: Block | Inline | Text) => {\n const children = 'content' in node ? node.content : null;\n let marks: Mark[] | null = null;\n let value: string | null = null;\n\n if (children && children.length === 1 && children[0].nodeType === 'text') {\n marks = children[0].marks?.length ? children[0].marks : null;\n value = children[0].value;\n } else {\n marks = 'marks' in node ? (node.marks?.length ? node.marks : null) : null;\n value = 'value' in node ? node.value : null;\n }\n\n return {\n children,\n marks,\n value,\n };\n};\n\nexport const getAssetComponentsFromConfig = (config: ContentfulConfig) => {\n return {\n file: config.components?.file ?? ContentfulFileComponent,\n image: config.components?.image ?? ContentfulImageComponent,\n video: config.components?.video ?? ContentfulVideoComponent,\n audio: config.components?.audio ?? ContentfulAudioComponent,\n };\n};\n\nexport const transformContentfulMarks = (marks: Mark[], useTailwindClasses: boolean) => {\n return marks\n .map((mark) => {\n switch (mark.type) {\n case 'bold':\n return useTailwindClasses ? 'font-bold' : mark.type;\n case 'italic':\n return useTailwindClasses ? 'italic' : mark.type;\n case 'underline':\n return useTailwindClasses ? 'underline' : mark.type;\n case 'code':\n return useTailwindClasses ? 'font-mono' : mark.type;\n default:\n return mark.type;\n }\n })\n .join(' ');\n};\n\nexport const translateContentfulNodeTypeToHtmlTag = (nodeType: 'text' | BLOCKS | INLINES) => {\n switch (nodeType) {\n case BLOCKS.HEADING_1:\n return 'h1';\n case BLOCKS.HEADING_2:\n return 'h2';\n case BLOCKS.HEADING_3:\n return 'h3';\n case BLOCKS.HEADING_4:\n return 'h4';\n case BLOCKS.HEADING_5:\n return 'h5';\n case BLOCKS.HEADING_6:\n return 'h6';\n case BLOCKS.PARAGRAPH:\n return 'p';\n case BLOCKS.UL_LIST:\n return 'ul';\n case BLOCKS.OL_LIST:\n return 'ol';\n case BLOCKS.LIST_ITEM:\n return 'li';\n case BLOCKS.HR:\n return 'hr';\n case BLOCKS.QUOTE:\n return 'blockquote';\n case BLOCKS.TABLE:\n return 'table';\n case BLOCKS.TABLE_ROW:\n return 'tr';\n case BLOCKS.TABLE_CELL:\n return 'td';\n case BLOCKS.TABLE_HEADER_CELL:\n return 'th';\n case BLOCKS.EMBEDDED_ASSET:\n return 'div';\n\n case INLINES.HYPERLINK:\n return 'a';\n case INLINES.ENTRY_HYPERLINK:\n return 'a';\n case INLINES.ASSET_HYPERLINK:\n return 'a';\n\n case 'text':\n return 'span';\n\n // Will be ignored by the renderer\n case 'document':\n return 'document';\n\n // TODO(TRB): These should render components\n case BLOCKS.EMBEDDED_ENTRY:\n return 'div';\n case INLINES.EMBEDDED_ENTRY:\n return 'div';\n\n default:\n return 'div';\n }\n};\n","import { ComponentPortal, DomPortalOutlet } from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport {\n ApplicationRef,\n ChangeDetectionStrategy,\n Component,\n ComponentFactoryResolver,\n ElementRef,\n inject,\n Injector,\n Input,\n Renderer2,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { CONTENTFUL_CONFIG } from '../../constants';\nimport { RichTextResponse } from '../../types';\nimport { ContentfulConfig } from '../../utils';\nimport { RichTextRenderCommand } from './rich-text-renderer.types';\nimport { createRenderCommandsFromContentfulRichText } from './rich-text-renderer.util';\n\n@Component({\n selector: 'et-contentful-rich-text-renderer',\n template: ``,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n host: {\n class: 'et-contentful-rich-text-renderer',\n },\n})\nexport class ContentfulRichTextRendererComponent {\n @Input()\n get richText() {\n return this._richText;\n }\n set richText(v: RichTextResponse | null | undefined) {\n this._richText = v ?? null;\n\n // clear the element\n this._viewContainerRef.clear();\n\n if (!v) {\n return;\n }\n\n const commands = createRenderCommandsFromContentfulRichText({ data: v, config: this._config });\n\n this._render(commands);\n }\n private _richText: RichTextResponse | null = null;\n\n private _renderer = inject(Renderer2);\n private _elementRef = inject(ElementRef);\n private _viewContainerRef = inject(ViewContainerRef);\n private _componentFactoryResolver = inject(ComponentFactoryResolver);\n private _document = inject<Document>(DOCUMENT);\n private _appRef = inject(ApplicationRef);\n private _injector = inject(Injector);\n private _config = inject(CONTENTFUL_CONFIG, { optional: true }) ?? new ContentfulConfig();\n\n private _render(commands: RichTextRenderCommand[]) {\n // create a document fragment to hold the elements while we create them\n const fragment = document.createDocumentFragment();\n\n const hostCommand: RichTextRenderCommand = {\n payload: 'document',\n children: commands,\n };\n\n // loop over the commands\n this._executeCommand({ command: hostCommand, parent: fragment });\n\n // append the fragment to the host element\n this._renderer.appendChild(this._elementRef.nativeElement, fragment);\n }\n\n private _executeCommand(data: { command: RichTextRenderCommand; parent: Element | DocumentFragment }) {\n const { command, parent } = data;\n\n let element: Element | null = null;\n if (command.payload !== 'document') {\n if (typeof command.payload === 'string') {\n element = this._renderer.createElement(command.payload);\n\n if (command.data) {\n this._renderer.setProperty(element, 'innerText', command.data);\n }\n\n if (command.attributes) {\n for (const [name, value] of Object.entries(command.attributes)) {\n this._renderer.setAttribute(element, name, value);\n }\n }\n\n this._renderer.appendChild(parent, element);\n } else {\n const portal = new DomPortalOutlet(\n parent as Element,\n this._componentFactoryResolver,\n this._appRef,\n this._injector,\n this._document,\n );\n\n const comp = new ComponentPortal(command.payload);\n const ref = comp.attach(portal);\n\n if (command.data) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (ref.instance as any).data = command.data;\n }\n\n element = ref.location.nativeElement;\n }\n }\n\n // loop over the commands\n for (const childCommand of command.children) {\n this._executeCommand({ command: childCommand, parent: element ?? parent });\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport {\n ContentfulAudioComponent,\n ContentfulFileComponent,\n ContentfulImageComponent,\n ContentfulRichTextRendererComponent,\n ContentfulVideoComponent,\n} from './public-api';\n\n@NgModule({\n imports: [\n ContentfulAudioComponent,\n ContentfulFileComponent,\n ContentfulImageComponent,\n ContentfulVideoComponent,\n ContentfulRichTextRendererComponent,\n ],\n exports: [\n ContentfulAudioComponent,\n ContentfulFileComponent,\n ContentfulImageComponent,\n ContentfulVideoComponent,\n ContentfulRichTextRendererComponent,\n ],\n})\nexport class ContentfulModule {}\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/constants/contentful.constants.ts","../../../../libs/contentful/src/lib/utils/contentful-config.ts","../../../../libs/contentful/src/lib/utils/contentful.util.ts","../../../../libs/contentful/src/lib/components/rich-text-renderer/rich-text-renderer.constants.ts","../../../../libs/contentful/src/lib/components/file/contentful-file.component.ts","../../../../libs/contentful/src/lib/components/image/contentful-image.component.ts","../../../../libs/contentful/src/lib/components/video/contentful-video.component.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/audio/contentful-audio.component.ts","../../../../libs/contentful/src/lib/contentful.module.ts","../../../../libs/contentful/src/ethlete-contentful.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { ContentfulConfig } from '../utils';\n\nexport const CONTENTFUL_CONFIG = new InjectionToken<ContentfulConfig>('TooltipConfig');\n","import { ComponentType } from '@angular/cdk/portal';\nimport {\n ContentfulAudioComponent,\n ContentfulFileComponent,\n ContentfulImageComponent,\n ContentfulVideoComponent,\n} from '../components';\nimport { ContentfulAsset } from '../types';\n\ntype ComponentLikeWithAsset = ComponentType<{ data: ContentfulAsset | null | undefined }>;\n\nexport interface ContentfulAssetComponents {\n file: ComponentLikeWithAsset;\n image: ComponentLikeWithAsset;\n video: ComponentLikeWithAsset;\n audio: ComponentLikeWithAsset;\n}\n\nexport class ContentfulConfig {\n /**\n * Default components for rendering contentful assets\n */\n components?: Partial<ContentfulAssetComponents> = {\n file: ContentfulFileComponent,\n image: ContentfulImageComponent,\n video: ContentfulVideoComponent,\n audio: ContentfulAudioComponent,\n };\n\n /**\n * Component for rendering embedded entries\n */\n customComponents?: Record<string, ComponentType<unknown>>;\n\n /**\n * Determines if the contentful rich text renderer should render the contentful rich text with tailwind css classes\n */\n useTailwindClasses = false;\n}\n","import { CONTENTFUL_CONFIG } from '../constants';\nimport { ContentfulConfig } from './contentful-config';\n\nexport const provideContentfulConfig = (contentfulConfig: ContentfulConfig) => {\n return { provide: CONTENTFUL_CONFIG, useValue: contentfulConfig };\n};\n","import { InjectionToken } from '@angular/core';\n\nexport const RICH_TEXT_RENDERER_COMPONENT_DATA = new InjectionToken<unknown>('RICH_TEXT_RENDERER_COMPONENT_DATA');\n","import { NgClass, NgIf } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, Input, OnInit, ViewEncapsulation } from '@angular/core';\nimport { NgClassType } from '@ethlete/core';\nimport { ContentfulAsset } from '../../types';\nimport { RICH_TEXT_RENDERER_COMPONENT_DATA } from '../rich-text-renderer';\n\n@Component({\n selector: 'et-contentful-file',\n template: `\n <a *ngIf=\"data\" [href]=\"data.url\" [ngClass]=\"fileClass\" class=\"underline\" target=\"_blank\">\n {{ data.title }} ({{ data.size }} Bytes)\n </a>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgIf, NgClass],\n})\nexport class ContentfulFileComponent implements OnInit {\n private _richTextData = inject<ContentfulAsset>(RICH_TEXT_RENDERER_COMPONENT_DATA, { optional: true });\n\n @Input()\n get data() {\n return this._data;\n }\n set data(v: ContentfulAsset | null | undefined) {\n if (v && !v.contentType) {\n this._data = null;\n\n console.warn('The provided asset is invalid', v);\n\n return;\n }\n\n this._data = v ?? null;\n }\n private _data: ContentfulAsset | null = null;\n\n @Input()\n fileClass: NgClassType = null;\n\n ngOnInit(): void {\n if (this._richTextData) {\n this.data = this._richTextData;\n }\n }\n}\n","import { NgClass, NgIf } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, Input, OnInit, ViewEncapsulation } from '@angular/core';\nimport { NgClassType } from '@ethlete/core';\nimport { ContentfulAsset } from '../../types';\nimport { RICH_TEXT_RENDERER_COMPONENT_DATA } from '../rich-text-renderer';\n\n@Component({\n selector: 'et-contentful-image',\n template: `\n <picture *ngIf=\"data\" [ngClass]=\"pictureClass\">\n <source srcset=\"{{ data.url }}?fm=avif\" />\n <source srcset=\"{{ data.url }}?fm=webp\" />\n <source srcset=\"{{ data.url }}?fm=jpg\" />\n <img\n [attr.alt]=\"data.description ?? undefined\"\n [attr.width]=\"data.width ?? undefined\"\n [attr.height]=\"data.height ?? undefined\"\n [ngClass]=\"imgClass\"\n src=\"{{ data.url }}\"\n />\n </picture>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgIf, NgClass],\n})\nexport class ContentfulImageComponent implements OnInit {\n private _richTextData = inject<ContentfulAsset>(RICH_TEXT_RENDERER_COMPONENT_DATA, { optional: true });\n\n @Input()\n get data() {\n return this._data;\n }\n set data(v: ContentfulAsset | null | undefined) {\n if (v && !v.contentType) {\n this._data = null;\n\n console.warn('The provided asset is invalid', v);\n\n return;\n }\n\n if (v && !v.contentType.startsWith('image/')) {\n throw new Error('The provided asset is not an image');\n }\n\n this._data = v ?? null;\n }\n private _data: ContentfulAsset | null = null;\n\n @Input()\n imgClass: NgClassType = null;\n\n @Input()\n pictureClass: NgClassType = null;\n\n ngOnInit(): void {\n if (this._richTextData) {\n this.data = this._richTextData;\n }\n }\n}\n","import { NgClass, NgIf } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, Input, OnInit, ViewEncapsulation } from '@angular/core';\nimport { NgClassType } from '@ethlete/core';\nimport { ContentfulAsset } from '../../types';\nimport { RICH_TEXT_RENDERER_COMPONENT_DATA } from '../rich-text-renderer';\n\n@Component({\n selector: 'et-contentful-video',\n template: `\n <video *ngIf=\"data\" [ngClass]=\"videoClass\" controls>\n <source src=\"{{ data.url }}\" type=\"{{ data.contentType }}\" />\n </video>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgIf, NgClass],\n})\nexport class ContentfulVideoComponent implements OnInit {\n private _richTextData = inject<ContentfulAsset>(RICH_TEXT_RENDERER_COMPONENT_DATA, { optional: true });\n\n @Input()\n get data() {\n return this._data;\n }\n set data(v: ContentfulAsset | null | undefined) {\n if (v && !v.contentType) {\n this._data = null;\n\n console.warn('The provided asset is invalid', v);\n\n return;\n }\n\n if (v && !v.contentType.startsWith('video/')) {\n throw new Error('The provided asset is not an video');\n }\n\n this._data = v ?? null;\n }\n private _data: ContentfulAsset | null = null;\n\n @Input()\n videoClass: NgClassType = null;\n\n ngOnInit(): void {\n if (this._richTextData) {\n this.data = this._richTextData;\n }\n }\n}\n","import { ComponentType } from '@angular/cdk/portal';\nimport { Block, BLOCKS, Inline, INLINES, Mark, Text } from '@contentful/rich-text-types';\nimport { ContentfulAsset, ContentfulEntryBase, RichTextResponse } from '../../types';\nimport { ContentfulAssetComponents, ContentfulConfig } from '../../utils';\nimport { ContentfulAudioComponent } from '../audio';\nimport { ContentfulFileComponent } from '../file';\nimport { ContentfulImageComponent } from '../image';\nimport { ContentfulVideoComponent } from '../video';\nimport { ContentfulResourceMap, RichTextRenderCommand } from './rich-text-renderer.types';\n\nexport const createRenderCommandsFromContentfulRichText = (options: {\n data: RichTextResponse;\n config: ContentfulConfig;\n}) => {\n const { data, config } = options;\n\n const commands: RichTextRenderCommand[] = [];\n const assetComponents = getAssetComponentsFromConfig(config);\n const resourceMap = createContentfulResourceMap(data.links);\n\n createContentfulRenderCommand(\n data.json,\n { children: commands, payload: data.json.nodeType },\n resourceMap,\n config.useTailwindClasses,\n assetComponents,\n config.customComponents,\n );\n\n return commands;\n};\n\nexport const createContentfulRenderCommand = (\n node: Block | Inline | Text,\n parent: RichTextRenderCommand,\n resourceMap: ContentfulResourceMap,\n useTailwindClasses: boolean,\n assetComponents: ContentfulAssetComponents,\n customComponents: Record<string, ComponentType<unknown>> | undefined,\n) => {\n const { nodeType, data: nodeData } = node;\n\n const { children, marks, value } = getContentfulNodeProps(node);\n\n const command: RichTextRenderCommand = {\n payload: translateContentfulNodeTypeToHtmlTag(nodeType),\n data: value,\n attributes: {\n ...(marks\n ? {\n class: transformContentfulMarks(marks, useTailwindClasses),\n }\n : {}),\n ...(nodeData['uri'] ? { href: nodeData['uri'], target: '_blank' } : {}),\n },\n children: [],\n };\n\n const entryId = nodeData['target']?.sys?.id;\n\n if (nodeType === BLOCKS.EMBEDDED_ASSET) {\n const asset = resourceMap.assetsBlock.get(entryId);\n\n if (asset) {\n const isImage = asset.contentType.startsWith('image/');\n const isVideo = asset.contentType.startsWith('video/');\n const isAudio = asset.contentType.startsWith('audio/');\n\n command.data = asset;\n\n if (isImage) {\n command.payload = assetComponents.image;\n } else if (isVideo) {\n command.payload = assetComponents.video;\n } else if (isAudio) {\n command.payload = assetComponents.audio;\n } else {\n command.payload = assetComponents.file;\n }\n } else {\n console.warn(`No asset found for entry id \"${entryId}\"!`, nodeData);\n }\n } else if (nodeType === BLOCKS.EMBEDDED_ENTRY || nodeType === INLINES.EMBEDDED_ENTRY) {\n const entry = resourceMap.entriesBlock.get(entryId) ?? resourceMap.entriesInline.get(entryId);\n\n if (entry) {\n const type = entry?.__typename ?? 'ET_UNKNOWN';\n const component = customComponents?.[type];\n\n if (component) {\n command.payload = component;\n command.data = entry;\n } else {\n command.data = `ERROR: No component found for embedded entry \"${type}\" as \"${nodeType}\"!`;\n }\n } else {\n console.warn(`No entry found for entry id \"${entryId}\"!`, nodeData);\n }\n }\n\n if (children && (children.length !== 1 || children[0].nodeType !== 'text')) {\n children.forEach((child) => {\n createContentfulRenderCommand(child, command, resourceMap, useTailwindClasses, assetComponents, customComponents);\n });\n }\n\n parent.children.push(command);\n\n return command;\n};\n\nexport const getContentfulNodeProps = (node: Block | Inline | Text) => {\n const children = 'content' in node ? node.content : null;\n let marks: Mark[] | null = null;\n let value: string | null = null;\n\n if (children && children.length === 1 && children[0].nodeType === 'text') {\n marks = children[0].marks?.length ? children[0].marks : null;\n value = children[0].value;\n } else {\n marks = 'marks' in node ? (node.marks?.length ? node.marks : null) : null;\n value = 'value' in node ? node.value : null;\n }\n\n return {\n children,\n marks,\n value,\n };\n};\n\nexport const getAssetComponentsFromConfig = (config: ContentfulConfig) => {\n return {\n file: config.components?.file ?? ContentfulFileComponent,\n image: config.components?.image ?? ContentfulImageComponent,\n video: config.components?.video ?? ContentfulVideoComponent,\n audio: config.components?.audio ?? ContentfulAudioComponent,\n };\n};\n\nexport const transformContentfulMarks = (marks: Mark[], useTailwindClasses: boolean) => {\n return marks\n .map((mark) => {\n switch (mark.type) {\n case 'bold':\n return useTailwindClasses ? 'font-bold' : mark.type;\n case 'italic':\n return useTailwindClasses ? 'italic' : mark.type;\n case 'underline':\n return useTailwindClasses ? 'underline' : mark.type;\n case 'code':\n return useTailwindClasses ? 'font-mono' : mark.type;\n default:\n return mark.type;\n }\n })\n .join(' ');\n};\n\nexport const translateContentfulNodeTypeToHtmlTag = (nodeType: 'text' | BLOCKS | INLINES) => {\n switch (nodeType) {\n case BLOCKS.HEADING_1:\n return 'h1';\n case BLOCKS.HEADING_2:\n return 'h2';\n case BLOCKS.HEADING_3:\n return 'h3';\n case BLOCKS.HEADING_4:\n return 'h4';\n case BLOCKS.HEADING_5:\n return 'h5';\n case BLOCKS.HEADING_6:\n return 'h6';\n case BLOCKS.PARAGRAPH:\n return 'p';\n case BLOCKS.UL_LIST:\n return 'ul';\n case BLOCKS.OL_LIST:\n return 'ol';\n case BLOCKS.LIST_ITEM:\n return 'li';\n case BLOCKS.HR:\n return 'hr';\n case BLOCKS.QUOTE:\n return 'blockquote';\n case BLOCKS.TABLE:\n return 'table';\n case BLOCKS.TABLE_ROW:\n return 'tr';\n case BLOCKS.TABLE_CELL:\n return 'td';\n case BLOCKS.TABLE_HEADER_CELL:\n return 'th';\n case BLOCKS.EMBEDDED_ASSET:\n return 'div';\n\n case INLINES.HYPERLINK:\n return 'a';\n case INLINES.ENTRY_HYPERLINK:\n return 'a';\n case INLINES.ASSET_HYPERLINK:\n return 'a';\n\n case 'text':\n return 'span';\n\n // Will be ignored by the renderer\n case 'document':\n return 'document';\n\n // TODO(TRB): These should render components\n case BLOCKS.EMBEDDED_ENTRY:\n return 'div';\n case INLINES.EMBEDDED_ENTRY:\n return 'div';\n\n default:\n return 'div';\n }\n};\n\nexport const createContentfulResourceMap = (links: RichTextResponse['links']): ContentfulResourceMap => {\n const resourceMap = {\n assetsBlock: createContentfulMap<ContentfulAsset>(links?.assets?.block),\n entriesInline: createContentfulMap(links?.entries?.inline),\n entriesBlock: createContentfulMap(links?.entries?.block),\n } as const;\n\n return resourceMap;\n};\n\nexport const createContentfulMap = <T extends ContentfulEntryBase>(links: Array<T> | null | undefined) => {\n const assetMap = new Map<string, T>();\n\n if (links) {\n for (const link of links) {\n if (!link?.sys?.id) {\n console.warn('Link has no sys.id property. Please include it inside your query.', link);\n continue;\n }\n\n assetMap.set(link.sys.id, link);\n }\n }\n\n return assetMap;\n};\n","import { ComponentPortal, DomPortalOutlet } from '@angular/cdk/portal';\nimport { DOCUMENT } from '@angular/common';\nimport {\n ApplicationRef,\n ChangeDetectionStrategy,\n Component,\n ComponentFactoryResolver,\n ElementRef,\n inject,\n Injector,\n Input,\n Renderer2,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { CONTENTFUL_CONFIG } from '../../constants';\nimport { RichTextResponse } from '../../types';\nimport { ContentfulConfig } from '../../utils';\nimport { RICH_TEXT_RENDERER_COMPONENT_DATA } from './rich-text-renderer.constants';\nimport { RichTextRenderCommand } from './rich-text-renderer.types';\nimport { createRenderCommandsFromContentfulRichText } from './rich-text-renderer.util';\n\n@Component({\n selector: 'et-contentful-rich-text-renderer',\n template: ``,\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n host: {\n class: 'et-contentful-rich-text-renderer',\n },\n})\nexport class ContentfulRichTextRendererComponent {\n @Input()\n get richText() {\n return this._richText;\n }\n set richText(v: RichTextResponse | null | undefined) {\n this._richText = v ?? null;\n\n // clear the element\n this._viewContainerRef.clear();\n\n if (!v) {\n return;\n }\n\n const commands = createRenderCommandsFromContentfulRichText({ data: v, config: this._config });\n\n this._render(commands);\n }\n private _richText: RichTextResponse | null = null;\n\n private _renderer = inject(Renderer2);\n private _elementRef = inject(ElementRef);\n private _viewContainerRef = inject(ViewContainerRef);\n private _componentFactoryResolver = inject(ComponentFactoryResolver);\n private _document = inject<Document>(DOCUMENT);\n private _appRef = inject(ApplicationRef);\n private _injector = inject(Injector);\n private _config = inject(CONTENTFUL_CONFIG, { optional: true }) ?? new ContentfulConfig();\n\n private _render(commands: RichTextRenderCommand[]) {\n // create a document fragment to hold the elements while we create them\n const fragment = document.createDocumentFragment();\n\n const hostCommand: RichTextRenderCommand = {\n payload: 'document',\n children: commands,\n };\n\n // loop over the commands\n this._executeCommand({ command: hostCommand, parent: fragment });\n\n // append the fragment to the host element\n this._renderer.appendChild(this._elementRef.nativeElement, fragment);\n }\n\n private _executeCommand(data: { command: RichTextRenderCommand; parent: Element | DocumentFragment }) {\n const { command, parent } = data;\n\n let element: Element | null = null;\n if (command.payload !== 'document') {\n if (typeof command.payload === 'string') {\n element = this._renderer.createElement(command.payload);\n\n if (command.data) {\n this._renderer.setProperty(element, 'innerText', command.data);\n }\n\n if (command.attributes) {\n for (const [name, value] of Object.entries(command.attributes)) {\n this._renderer.setAttribute(element, name, value);\n }\n }\n\n this._renderer.appendChild(parent, element);\n } else {\n const injector = Injector.create({\n providers: [\n {\n provide: RICH_TEXT_RENDERER_COMPONENT_DATA,\n useValue: data,\n },\n ],\n parent: this._injector,\n });\n\n const portal = new DomPortalOutlet(\n parent as Element,\n this._componentFactoryResolver,\n this._appRef,\n injector,\n this._document,\n );\n\n const comp = new ComponentPortal(command.payload);\n const ref = comp.attach(portal);\n element = ref.location.nativeElement;\n }\n }\n\n // loop over the commands\n for (const childCommand of command.children) {\n this._executeCommand({ command: childCommand, parent: element ?? parent });\n }\n }\n}\n","import { NgClass, NgIf } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, Input, OnInit, ViewEncapsulation } from '@angular/core';\nimport { NgClassType } from '@ethlete/core';\nimport { ContentfulAsset } from '../../types';\nimport { RICH_TEXT_RENDERER_COMPONENT_DATA } from '../rich-text-renderer';\n\n@Component({\n selector: 'et-contentful-audio',\n template: `\n <figure *ngIf=\"data\" [ngClass]=\"figureClass\">\n <figcaption [ngClass]=\"figcaptionClass\">{{ data.title }}</figcaption>\n <audio [ngClass]=\"audioClass\" controls src=\"{{ data.url }}\"></audio>\n </figure>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n standalone: true,\n imports: [NgIf, NgClass],\n})\nexport class ContentfulAudioComponent implements OnInit {\n private _richTextData = inject<ContentfulAsset>(RICH_TEXT_RENDERER_COMPONENT_DATA, { optional: true });\n\n @Input()\n get data() {\n return this._data;\n }\n set data(v: ContentfulAsset | null | undefined) {\n if (v && !v.contentType) {\n this._data = null;\n\n console.warn('The provided asset is invalid', v);\n\n return;\n }\n\n if (v && !v.contentType.startsWith('audio/')) {\n throw new Error('The provided asset is not an audio');\n }\n\n this._data = v ?? null;\n }\n private _data: ContentfulAsset | null = null;\n\n @Input()\n audioClass: NgClassType = null;\n\n @Input()\n figureClass: NgClassType = null;\n\n @Input()\n figcaptionClass: NgClassType = null;\n\n ngOnInit(): void {\n if (this._richTextData) {\n this.data = this._richTextData;\n }\n }\n}\n","import { NgModule } from '@angular/core';\nimport {\n ContentfulAudioComponent,\n ContentfulFileComponent,\n ContentfulImageComponent,\n ContentfulRichTextRendererComponent,\n ContentfulVideoComponent,\n} from './public-api';\n\n@NgModule({\n imports: [\n ContentfulAudioComponent,\n ContentfulFileComponent,\n ContentfulImageComponent,\n ContentfulVideoComponent,\n ContentfulRichTextRendererComponent,\n ],\n exports: [\n ContentfulAudioComponent,\n ContentfulFileComponent,\n ContentfulImageComponent,\n ContentfulVideoComponent,\n ContentfulRichTextRendererComponent,\n ],\n})\nexport class ContentfulModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,65 +1,38 @@
|
|
|
1
1
|
import { NgIf, NgClass, DOCUMENT } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { Component, ChangeDetectionStrategy, ViewEncapsulation, Input,
|
|
3
|
+
import { InjectionToken, inject, Component, ChangeDetectionStrategy, ViewEncapsulation, Input, Renderer2, ElementRef, ViewContainerRef, ComponentFactoryResolver, ApplicationRef, Injector, NgModule } from '@angular/core';
|
|
4
4
|
import { DomPortalOutlet, ComponentPortal } from '@angular/cdk/portal';
|
|
5
5
|
import { BLOCKS, INLINES } from '@contentful/rich-text-types';
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
const CONTENTFUL_CONFIG = new InjectionToken('TooltipConfig');
|
|
8
|
+
|
|
9
|
+
class ContentfulConfig {
|
|
8
10
|
constructor() {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
this.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
if (v && !v.contentType.startsWith('audio/')) {
|
|
24
|
-
throw new Error('The provided asset is not an audio');
|
|
25
|
-
}
|
|
26
|
-
this._data = v ?? null;
|
|
11
|
+
/**
|
|
12
|
+
* Default components for rendering contentful assets
|
|
13
|
+
*/
|
|
14
|
+
this.components = {
|
|
15
|
+
file: ContentfulFileComponent,
|
|
16
|
+
image: ContentfulImageComponent,
|
|
17
|
+
video: ContentfulVideoComponent,
|
|
18
|
+
audio: ContentfulAudioComponent,
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Determines if the contentful rich text renderer should render the contentful rich text with tailwind css classes
|
|
22
|
+
*/
|
|
23
|
+
this.useTailwindClasses = false;
|
|
27
24
|
}
|
|
28
25
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
`, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
36
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.6", ngImport: i0, type: ContentfulAudioComponent, decorators: [{
|
|
37
|
-
type: Component,
|
|
38
|
-
args: [{
|
|
39
|
-
selector: 'et-contentful-audio',
|
|
40
|
-
template: `
|
|
41
|
-
<figure *ngIf="data" [ngClass]="figureClass">
|
|
42
|
-
<figcaption [ngClass]="figcaptionClass">{{ data.title }}</figcaption>
|
|
43
|
-
<audio [ngClass]="audioClass" controls src="{{ data.url }}"></audio>
|
|
44
|
-
</figure>
|
|
45
|
-
`,
|
|
46
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
47
|
-
encapsulation: ViewEncapsulation.None,
|
|
48
|
-
standalone: true,
|
|
49
|
-
imports: [NgIf, NgClass],
|
|
50
|
-
}]
|
|
51
|
-
}], propDecorators: { data: [{
|
|
52
|
-
type: Input
|
|
53
|
-
}], audioClass: [{
|
|
54
|
-
type: Input
|
|
55
|
-
}], figureClass: [{
|
|
56
|
-
type: Input
|
|
57
|
-
}], figcaptionClass: [{
|
|
58
|
-
type: Input
|
|
59
|
-
}] } });
|
|
26
|
+
|
|
27
|
+
const provideContentfulConfig = (contentfulConfig) => {
|
|
28
|
+
return { provide: CONTENTFUL_CONFIG, useValue: contentfulConfig };
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const RICH_TEXT_RENDERER_COMPONENT_DATA = new InjectionToken('RICH_TEXT_RENDERER_COMPONENT_DATA');
|
|
60
32
|
|
|
61
33
|
class ContentfulFileComponent {
|
|
62
34
|
constructor() {
|
|
35
|
+
this._richTextData = inject(RICH_TEXT_RENDERER_COMPONENT_DATA, { optional: true });
|
|
63
36
|
this._data = null;
|
|
64
37
|
this.fileClass = null;
|
|
65
38
|
}
|
|
@@ -74,14 +47,19 @@ class ContentfulFileComponent {
|
|
|
74
47
|
}
|
|
75
48
|
this._data = v ?? null;
|
|
76
49
|
}
|
|
50
|
+
ngOnInit() {
|
|
51
|
+
if (this._richTextData) {
|
|
52
|
+
this.data = this._richTextData;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
77
55
|
}
|
|
78
|
-
ContentfulFileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.
|
|
79
|
-
ContentfulFileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.
|
|
56
|
+
ContentfulFileComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentfulFileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
57
|
+
ContentfulFileComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.9", type: ContentfulFileComponent, isStandalone: true, selector: "et-contentful-file", inputs: { data: "data", fileClass: "fileClass" }, ngImport: i0, template: `
|
|
80
58
|
<a *ngIf="data" [href]="data.url" [ngClass]="fileClass" class="underline" target="_blank">
|
|
81
59
|
{{ data.title }} ({{ data.size }} Bytes)
|
|
82
60
|
</a>
|
|
83
61
|
`, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
84
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.
|
|
62
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentfulFileComponent, decorators: [{
|
|
85
63
|
type: Component,
|
|
86
64
|
args: [{
|
|
87
65
|
selector: 'et-contentful-file',
|
|
@@ -103,6 +81,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.6", ngImpor
|
|
|
103
81
|
|
|
104
82
|
class ContentfulImageComponent {
|
|
105
83
|
constructor() {
|
|
84
|
+
this._richTextData = inject(RICH_TEXT_RENDERER_COMPONENT_DATA, { optional: true });
|
|
106
85
|
this._data = null;
|
|
107
86
|
this.imgClass = null;
|
|
108
87
|
this.pictureClass = null;
|
|
@@ -121,9 +100,14 @@ class ContentfulImageComponent {
|
|
|
121
100
|
}
|
|
122
101
|
this._data = v ?? null;
|
|
123
102
|
}
|
|
103
|
+
ngOnInit() {
|
|
104
|
+
if (this._richTextData) {
|
|
105
|
+
this.data = this._richTextData;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
124
108
|
}
|
|
125
|
-
ContentfulImageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.
|
|
126
|
-
ContentfulImageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.
|
|
109
|
+
ContentfulImageComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentfulImageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
110
|
+
ContentfulImageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.9", type: ContentfulImageComponent, isStandalone: true, selector: "et-contentful-image", inputs: { data: "data", imgClass: "imgClass", pictureClass: "pictureClass" }, ngImport: i0, template: `
|
|
127
111
|
<picture *ngIf="data" [ngClass]="pictureClass">
|
|
128
112
|
<source srcset="{{ data.url }}?fm=avif" />
|
|
129
113
|
<source srcset="{{ data.url }}?fm=webp" />
|
|
@@ -137,7 +121,7 @@ ContentfulImageComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0
|
|
|
137
121
|
/>
|
|
138
122
|
</picture>
|
|
139
123
|
`, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
140
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.
|
|
124
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentfulImageComponent, decorators: [{
|
|
141
125
|
type: Component,
|
|
142
126
|
args: [{
|
|
143
127
|
selector: 'et-contentful-image',
|
|
@@ -168,32 +152,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.6", ngImpor
|
|
|
168
152
|
type: Input
|
|
169
153
|
}] } });
|
|
170
154
|
|
|
171
|
-
const CONTENTFUL_CONFIG = new InjectionToken('TooltipConfig');
|
|
172
|
-
|
|
173
|
-
class ContentfulConfig {
|
|
174
|
-
constructor() {
|
|
175
|
-
/**
|
|
176
|
-
* Default components for rendering contentful assets
|
|
177
|
-
*/
|
|
178
|
-
this.components = {
|
|
179
|
-
file: ContentfulFileComponent,
|
|
180
|
-
image: ContentfulImageComponent,
|
|
181
|
-
video: ContentfulVideoComponent,
|
|
182
|
-
audio: ContentfulAudioComponent,
|
|
183
|
-
};
|
|
184
|
-
/**
|
|
185
|
-
* Determines if the contentful rich text renderer should render the contentful rich text with tailwind css classes
|
|
186
|
-
*/
|
|
187
|
-
this.useTailwindClasses = false;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const provideContentfulConfig = (contentfulConfig) => {
|
|
192
|
-
return { provide: CONTENTFUL_CONFIG, useValue: contentfulConfig };
|
|
193
|
-
};
|
|
194
|
-
|
|
195
155
|
class ContentfulVideoComponent {
|
|
196
156
|
constructor() {
|
|
157
|
+
this._richTextData = inject(RICH_TEXT_RENDERER_COMPONENT_DATA, { optional: true });
|
|
197
158
|
this._data = null;
|
|
198
159
|
this.videoClass = null;
|
|
199
160
|
}
|
|
@@ -211,14 +172,19 @@ class ContentfulVideoComponent {
|
|
|
211
172
|
}
|
|
212
173
|
this._data = v ?? null;
|
|
213
174
|
}
|
|
175
|
+
ngOnInit() {
|
|
176
|
+
if (this._richTextData) {
|
|
177
|
+
this.data = this._richTextData;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
214
180
|
}
|
|
215
|
-
ContentfulVideoComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.
|
|
216
|
-
ContentfulVideoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.
|
|
181
|
+
ContentfulVideoComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentfulVideoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
182
|
+
ContentfulVideoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.9", type: ContentfulVideoComponent, isStandalone: true, selector: "et-contentful-video", inputs: { data: "data", videoClass: "videoClass" }, ngImport: i0, template: `
|
|
217
183
|
<video *ngIf="data" [ngClass]="videoClass" controls>
|
|
218
184
|
<source src="{{ data.url }}" type="{{ data.contentType }}" />
|
|
219
185
|
</video>
|
|
220
186
|
`, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
221
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.
|
|
187
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentfulVideoComponent, decorators: [{
|
|
222
188
|
type: Component,
|
|
223
189
|
args: [{
|
|
224
190
|
selector: 'et-contentful-video',
|
|
@@ -241,15 +207,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.6", ngImpor
|
|
|
241
207
|
const createRenderCommandsFromContentfulRichText = (options) => {
|
|
242
208
|
const { data, config } = options;
|
|
243
209
|
const commands = [];
|
|
244
|
-
const assetMap = new Map();
|
|
245
210
|
const assetComponents = getAssetComponentsFromConfig(config);
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
}
|
|
249
|
-
createContentfulRenderCommand(data.json, { children: commands, payload: data.json.nodeType }, assetMap, config.useTailwindClasses, assetComponents, config.customComponents);
|
|
211
|
+
const resourceMap = createContentfulResourceMap(data.links);
|
|
212
|
+
createContentfulRenderCommand(data.json, { children: commands, payload: data.json.nodeType }, resourceMap, config.useTailwindClasses, assetComponents, config.customComponents);
|
|
250
213
|
return commands;
|
|
251
214
|
};
|
|
252
|
-
const createContentfulRenderCommand = (node, parent,
|
|
215
|
+
const createContentfulRenderCommand = (node, parent, resourceMap, useTailwindClasses, assetComponents, customComponents) => {
|
|
253
216
|
const { nodeType, data: nodeData } = node;
|
|
254
217
|
const { children, marks, value } = getContentfulNodeProps(node);
|
|
255
218
|
const command = {
|
|
@@ -265,8 +228,9 @@ const createContentfulRenderCommand = (node, parent, assetMap, useTailwindClasse
|
|
|
265
228
|
},
|
|
266
229
|
children: [],
|
|
267
230
|
};
|
|
231
|
+
const entryId = nodeData['target']?.sys?.id;
|
|
268
232
|
if (nodeType === BLOCKS.EMBEDDED_ASSET) {
|
|
269
|
-
const asset =
|
|
233
|
+
const asset = resourceMap.assetsBlock.get(entryId);
|
|
270
234
|
if (asset) {
|
|
271
235
|
const isImage = asset.contentType.startsWith('image/');
|
|
272
236
|
const isVideo = asset.contentType.startsWith('video/');
|
|
@@ -285,21 +249,30 @@ const createContentfulRenderCommand = (node, parent, assetMap, useTailwindClasse
|
|
|
285
249
|
command.payload = assetComponents.file;
|
|
286
250
|
}
|
|
287
251
|
}
|
|
252
|
+
else {
|
|
253
|
+
console.warn(`No asset found for entry id "${entryId}"!`, nodeData);
|
|
254
|
+
}
|
|
288
255
|
}
|
|
289
256
|
else if (nodeType === BLOCKS.EMBEDDED_ENTRY || nodeType === INLINES.EMBEDDED_ENTRY) {
|
|
290
|
-
const
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
257
|
+
const entry = resourceMap.entriesBlock.get(entryId) ?? resourceMap.entriesInline.get(entryId);
|
|
258
|
+
if (entry) {
|
|
259
|
+
const type = entry?.__typename ?? 'ET_UNKNOWN';
|
|
260
|
+
const component = customComponents?.[type];
|
|
261
|
+
if (component) {
|
|
262
|
+
command.payload = component;
|
|
263
|
+
command.data = entry;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
command.data = `ERROR: No component found for embedded entry "${type}" as "${nodeType}"!`;
|
|
267
|
+
}
|
|
295
268
|
}
|
|
296
269
|
else {
|
|
297
|
-
|
|
270
|
+
console.warn(`No entry found for entry id "${entryId}"!`, nodeData);
|
|
298
271
|
}
|
|
299
272
|
}
|
|
300
273
|
if (children && (children.length !== 1 || children[0].nodeType !== 'text')) {
|
|
301
274
|
children.forEach((child) => {
|
|
302
|
-
createContentfulRenderCommand(child, command,
|
|
275
|
+
createContentfulRenderCommand(child, command, resourceMap, useTailwindClasses, assetComponents, customComponents);
|
|
303
276
|
});
|
|
304
277
|
}
|
|
305
278
|
parent.children.push(command);
|
|
@@ -405,6 +378,27 @@ const translateContentfulNodeTypeToHtmlTag = (nodeType) => {
|
|
|
405
378
|
return 'div';
|
|
406
379
|
}
|
|
407
380
|
};
|
|
381
|
+
const createContentfulResourceMap = (links) => {
|
|
382
|
+
const resourceMap = {
|
|
383
|
+
assetsBlock: createContentfulMap(links?.assets?.block),
|
|
384
|
+
entriesInline: createContentfulMap(links?.entries?.inline),
|
|
385
|
+
entriesBlock: createContentfulMap(links?.entries?.block),
|
|
386
|
+
};
|
|
387
|
+
return resourceMap;
|
|
388
|
+
};
|
|
389
|
+
const createContentfulMap = (links) => {
|
|
390
|
+
const assetMap = new Map();
|
|
391
|
+
if (links) {
|
|
392
|
+
for (const link of links) {
|
|
393
|
+
if (!link?.sys?.id) {
|
|
394
|
+
console.warn('Link has no sys.id property. Please include it inside your query.', link);
|
|
395
|
+
continue;
|
|
396
|
+
}
|
|
397
|
+
assetMap.set(link.sys.id, link);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return assetMap;
|
|
401
|
+
};
|
|
408
402
|
|
|
409
403
|
class ContentfulRichTextRendererComponent {
|
|
410
404
|
constructor() {
|
|
@@ -460,13 +454,18 @@ class ContentfulRichTextRendererComponent {
|
|
|
460
454
|
this._renderer.appendChild(parent, element);
|
|
461
455
|
}
|
|
462
456
|
else {
|
|
463
|
-
const
|
|
457
|
+
const injector = Injector.create({
|
|
458
|
+
providers: [
|
|
459
|
+
{
|
|
460
|
+
provide: RICH_TEXT_RENDERER_COMPONENT_DATA,
|
|
461
|
+
useValue: data,
|
|
462
|
+
},
|
|
463
|
+
],
|
|
464
|
+
parent: this._injector,
|
|
465
|
+
});
|
|
466
|
+
const portal = new DomPortalOutlet(parent, this._componentFactoryResolver, this._appRef, injector, this._document);
|
|
464
467
|
const comp = new ComponentPortal(command.payload);
|
|
465
468
|
const ref = comp.attach(portal);
|
|
466
|
-
if (command.data) {
|
|
467
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
468
|
-
ref.instance.data = command.data;
|
|
469
|
-
}
|
|
470
469
|
element = ref.location.nativeElement;
|
|
471
470
|
}
|
|
472
471
|
}
|
|
@@ -476,9 +475,9 @@ class ContentfulRichTextRendererComponent {
|
|
|
476
475
|
}
|
|
477
476
|
}
|
|
478
477
|
}
|
|
479
|
-
ContentfulRichTextRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.
|
|
480
|
-
ContentfulRichTextRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.
|
|
481
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.
|
|
478
|
+
ContentfulRichTextRendererComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentfulRichTextRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
479
|
+
ContentfulRichTextRendererComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.9", type: ContentfulRichTextRendererComponent, isStandalone: true, selector: "et-contentful-rich-text-renderer", inputs: { richText: "richText" }, host: { classAttribute: "et-contentful-rich-text-renderer" }, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
480
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentfulRichTextRendererComponent, decorators: [{
|
|
482
481
|
type: Component,
|
|
483
482
|
args: [{
|
|
484
483
|
selector: 'et-contentful-rich-text-renderer',
|
|
@@ -494,10 +493,70 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.6", ngImpor
|
|
|
494
493
|
type: Input
|
|
495
494
|
}] } });
|
|
496
495
|
|
|
496
|
+
class ContentfulAudioComponent {
|
|
497
|
+
constructor() {
|
|
498
|
+
this._richTextData = inject(RICH_TEXT_RENDERER_COMPONENT_DATA, { optional: true });
|
|
499
|
+
this._data = null;
|
|
500
|
+
this.audioClass = null;
|
|
501
|
+
this.figureClass = null;
|
|
502
|
+
this.figcaptionClass = null;
|
|
503
|
+
}
|
|
504
|
+
get data() {
|
|
505
|
+
return this._data;
|
|
506
|
+
}
|
|
507
|
+
set data(v) {
|
|
508
|
+
if (v && !v.contentType) {
|
|
509
|
+
this._data = null;
|
|
510
|
+
console.warn('The provided asset is invalid', v);
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
if (v && !v.contentType.startsWith('audio/')) {
|
|
514
|
+
throw new Error('The provided asset is not an audio');
|
|
515
|
+
}
|
|
516
|
+
this._data = v ?? null;
|
|
517
|
+
}
|
|
518
|
+
ngOnInit() {
|
|
519
|
+
if (this._richTextData) {
|
|
520
|
+
this.data = this._richTextData;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
ContentfulAudioComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentfulAudioComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
525
|
+
ContentfulAudioComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.9", type: ContentfulAudioComponent, isStandalone: true, selector: "et-contentful-audio", inputs: { data: "data", audioClass: "audioClass", figureClass: "figureClass", figcaptionClass: "figcaptionClass" }, ngImport: i0, template: `
|
|
526
|
+
<figure *ngIf="data" [ngClass]="figureClass">
|
|
527
|
+
<figcaption [ngClass]="figcaptionClass">{{ data.title }}</figcaption>
|
|
528
|
+
<audio [ngClass]="audioClass" controls src="{{ data.url }}"></audio>
|
|
529
|
+
</figure>
|
|
530
|
+
`, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
531
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentfulAudioComponent, decorators: [{
|
|
532
|
+
type: Component,
|
|
533
|
+
args: [{
|
|
534
|
+
selector: 'et-contentful-audio',
|
|
535
|
+
template: `
|
|
536
|
+
<figure *ngIf="data" [ngClass]="figureClass">
|
|
537
|
+
<figcaption [ngClass]="figcaptionClass">{{ data.title }}</figcaption>
|
|
538
|
+
<audio [ngClass]="audioClass" controls src="{{ data.url }}"></audio>
|
|
539
|
+
</figure>
|
|
540
|
+
`,
|
|
541
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
542
|
+
encapsulation: ViewEncapsulation.None,
|
|
543
|
+
standalone: true,
|
|
544
|
+
imports: [NgIf, NgClass],
|
|
545
|
+
}]
|
|
546
|
+
}], propDecorators: { data: [{
|
|
547
|
+
type: Input
|
|
548
|
+
}], audioClass: [{
|
|
549
|
+
type: Input
|
|
550
|
+
}], figureClass: [{
|
|
551
|
+
type: Input
|
|
552
|
+
}], figcaptionClass: [{
|
|
553
|
+
type: Input
|
|
554
|
+
}] } });
|
|
555
|
+
|
|
497
556
|
class ContentfulModule {
|
|
498
557
|
}
|
|
499
|
-
ContentfulModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.
|
|
500
|
-
ContentfulModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.
|
|
558
|
+
ContentfulModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentfulModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
559
|
+
ContentfulModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.2.9", ngImport: i0, type: ContentfulModule, imports: [ContentfulAudioComponent,
|
|
501
560
|
ContentfulFileComponent,
|
|
502
561
|
ContentfulImageComponent,
|
|
503
562
|
ContentfulVideoComponent,
|
|
@@ -506,12 +565,12 @@ ContentfulModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", versio
|
|
|
506
565
|
ContentfulImageComponent,
|
|
507
566
|
ContentfulVideoComponent,
|
|
508
567
|
ContentfulRichTextRendererComponent] });
|
|
509
|
-
ContentfulModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.
|
|
568
|
+
ContentfulModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentfulModule, imports: [ContentfulAudioComponent,
|
|
510
569
|
ContentfulFileComponent,
|
|
511
570
|
ContentfulImageComponent,
|
|
512
571
|
ContentfulVideoComponent,
|
|
513
572
|
ContentfulRichTextRendererComponent] });
|
|
514
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.
|
|
573
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.9", ngImport: i0, type: ContentfulModule, decorators: [{
|
|
515
574
|
type: NgModule,
|
|
516
575
|
args: [{
|
|
517
576
|
imports: [
|
|
@@ -535,5 +594,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.6", ngImpor
|
|
|
535
594
|
* Generated bundle index. Do not edit.
|
|
536
595
|
*/
|
|
537
596
|
|
|
538
|
-
export { CONTENTFUL_CONFIG, ContentfulAudioComponent, ContentfulConfig, ContentfulFileComponent, ContentfulImageComponent, ContentfulModule, ContentfulRichTextRendererComponent, ContentfulVideoComponent, createContentfulRenderCommand, createRenderCommandsFromContentfulRichText, getAssetComponentsFromConfig, getContentfulNodeProps, provideContentfulConfig, transformContentfulMarks, translateContentfulNodeTypeToHtmlTag };
|
|
597
|
+
export { CONTENTFUL_CONFIG, ContentfulAudioComponent, ContentfulConfig, ContentfulFileComponent, ContentfulImageComponent, ContentfulModule, ContentfulRichTextRendererComponent, ContentfulVideoComponent, RICH_TEXT_RENDERER_COMPONENT_DATA, createContentfulMap, createContentfulRenderCommand, createContentfulResourceMap, createRenderCommandsFromContentfulRichText, getAssetComponentsFromConfig, getContentfulNodeProps, provideContentfulConfig, transformContentfulMarks, translateContentfulNodeTypeToHtmlTag };
|
|
539
598
|
//# sourceMappingURL=ethlete-contentful.mjs.map
|