nx/nx-dev/models-document/src/lib/related-documents.utils.ts
2023-07-24 14:20:48 +00:00

68 lines
1.6 KiB
TypeScript

import { RelatedDocument } from './documents.models';
interface RelatedDocumentsCategory {
id: string;
/**
* Matcher that will be evaluated against a path.
*/
matchers: string[];
name: string;
relatedDocuments: RelatedDocument[];
}
export function categorizeRelatedDocuments(
items: RelatedDocument[]
): RelatedDocumentsCategory[] {
const categories: RelatedDocumentsCategory[] = [
{
id: 'concepts',
name: 'Concepts',
matchers: ['/concepts/', '/concepts/more-concepts/'],
relatedDocuments: [],
},
{
id: 'recipes',
name: 'Recipes',
matchers: ['/recipes/'],
relatedDocuments: [],
},
{
id: 'reference',
name: 'Reference',
matchers: ['/workspace/', '/packages/'],
relatedDocuments: [],
},
{
id: 'see-also',
name: 'See also',
matchers: ['/see-also/'],
relatedDocuments: [],
},
];
items.forEach((i) =>
categories.forEach((c) => {
if (c.matchers.some((m) => i.path.includes(m)))
c.relatedDocuments.push(i);
})
);
return categories.filter((c) => !!c.relatedDocuments.length);
}
export function generateRelatedDocumentsTemplate(
relatedDocumentCategories: RelatedDocumentsCategory[]
): string {
if (!relatedDocumentCategories.length) return '';
const template = relatedDocumentCategories.map((c) => {
const header = `### ${c.name}`;
const template = c.relatedDocuments
.map((d) => `- [${d.name}](${d.path})`)
.join('\n');
return [header, template].join('\n');
});
return ['\n## Related Documentation\n', ...template].join('\n');
}