@analogjs/content
Version:
Content Rendering for Analog
85 lines (80 loc) • 2.77 kB
JavaScript
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