UNPKG

@analogjs/content

Version:

Content Rendering for Analog

85 lines (80 loc) 2.77 kB
import { resource, inject, computed } from '@angular/core'; import { injectContentListLoader, parseRawContentFile, injectContentFileLoader } from '@analogjs/content'; import { ActivatedRoute } from '@angular/router'; import { toSignal } from '@angular/core/rxjs-interop'; import { from } from 'rxjs'; import { map } from 'rxjs/operators'; function contentFilesResource(filterFn) { const contentListLoader = injectContentListLoader(); const contentList = contentListLoader().then((items) => filterFn ? items.filter(filterFn) : items); return resource({ loader: () => contentList, }); } async function getContentFile(contentFiles, slug, fallback) { const filePath = `/src/content/${slug}`; const contentFile = contentFiles[`${filePath}.md`] ?? contentFiles[`${filePath}.agx`]; if (!contentFile) { return { filename: filePath, attributes: {}, slug: '', content: fallback, }; } return contentFile().then((contentFile) => { if (typeof contentFile === 'string') { const { content, attributes } = parseRawContentFile(contentFile); return { filename: filePath, slug, attributes, content, }; } return { filename: filePath, slug, attributes: contentFile.metadata, content: contentFile.default, }; }); } /** * Resource for requesting an individual content file * * @param params * @param fallback * @returns */ function contentFileResource(params, fallback = 'No Content Found') { const loaderPromise = injectContentFileLoader(); const contentFilesMap = toSignal(from(loaderPromise())); const input = params || toSignal(inject(ActivatedRoute).paramMap.pipe(map((params) => params.get('slug'))), { requireSync: true }); return resource({ params: computed(() => ({ input: input(), files: contentFilesMap() })), loader: async ({ params }) => { const { input: param, files } = params; if (typeof param === 'string') { if (param) { return getContentFile(files, param, fallback); } return { filename: '', slug: '', attributes: {}, content: fallback, }; } else { return getContentFile(files, param.customFilename, fallback); } }, }); } /** * Generated bundle index. Do not edit. */ export { contentFileResource, contentFilesResource }; //# sourceMappingURL=analogjs-content-resources.mjs.map