22import RSS from 'rss' ;
33import { getPageMap } from '@theguild/components/server' ;
44import { AuthorId , authors } from '../../../authors' ;
5- import { coerceCaseStudiesToBlogs } from '../../case-studies/coerce-case-studies-to-blogs' ;
5+ import { pagesDepthFirst } from '../../../mdx-types' ;
6+ import { coerceCaseStudyToBlog } from '../../case-studies/coerce-case-studies-to-blogs' ;
67import { isCaseStudy } from '../../case-studies/isCaseStudyFile' ;
7- import { BlogFrontmatter , isBlogPost } from '../blog-types' ;
8+ import { BlogFrontmatter , BlogPostFile , isBlogPost } from '../blog-types' ;
89
910function getAuthor ( frontmatterAuthors : BlogFrontmatter [ 'authors' ] ) : string {
1011 const first = Array . isArray ( frontmatterAuthors ) ? frontmatterAuthors [ 0 ] : frontmatterAuthors ;
@@ -17,32 +18,30 @@ function getAuthor(frontmatterAuthors: BlogFrontmatter['authors']): string {
1718 return first . name ;
1819}
1920
21+ export const dynamic = 'force-static' ;
22+ export const config = { runtime : 'edge' } ;
23+
2024export async function GET ( ) {
2125 let allPosts : RSS . ItemOptions [ ] = [ ] ;
2226
23- // TODO: This needs a refactor: one `getPageMap` call,
24- // iterating over all items and pushing to `allPosts` in a coerced form.
25- const [ , , ...blogs ] = await getPageMap ( '/blog' ) ;
26- const [ , , ...studies ] = await getPageMap ( '/case-studies' ) ;
27- const [ , , ...updates ] = await getPageMap ( '/product-updates' ) ;
28-
29- const studiesAsBlogs = coerceCaseStudiesToBlogs ( studies . filter ( isCaseStudy ) ) ;
27+ const [ _meta , _indexPage , ...pages ] = await getPageMap ( '/' ) ;
28+ for ( const page of pagesDepthFirst ( pages ) ) {
29+ const route = ( page && 'route' in page && page . route ) || '' ;
30+ const [ dir , name ] = route . split ( '/' ) . filter ( Boolean ) ;
31+ if ( ! name ) continue ;
32+ switch ( dir ) {
33+ case 'blog' :
34+ case 'product-updates' :
35+ if ( isBlogPost ( page ) ) allPosts . push ( toRssItem ( page ) ) ;
36+ break ;
37+ case 'case-studies' :
38+ if ( isCaseStudy ( page ) ) allPosts . push ( toRssItem ( coerceCaseStudyToBlog ( page ) ) ) ;
39+ break ;
40+ }
41+ }
3042
31- for ( const items of [ blogs . filter ( isBlogPost ) , updates . filter ( isBlogPost ) , studiesAsBlogs ] ) {
32- allPosts = allPosts . concat (
33- items . map (
34- ( item ) : RSS . ItemOptions => ( {
35- title : item . frontMatter . title ,
36- date : new Date ( item . frontMatter . date ) ,
37- url : `https://the-guild.dev/graphql/hive${ item . route } ` ,
38- description : item . frontMatter . description ?? '' ,
39- author : getAuthor ( item . frontMatter . authors ) ,
40- categories : Array . isArray ( item . frontMatter . tags )
41- ? item . frontMatter . tags
42- : [ item . frontMatter . tags ] ,
43- } ) ,
44- ) ,
45- ) ;
43+ if ( allPosts . length === 0 ) {
44+ throw new Error ( 'No blog posts found for RSS feed' ) ;
4645 }
4746
4847 allPosts = allPosts . sort ( ( a , b ) => new Date ( b . date ) . getTime ( ) - new Date ( a . date ) . getTime ( ) ) ;
@@ -64,5 +63,15 @@ export async function GET() {
6463 } ) ;
6564}
6665
67- export const dynamic = 'force-static' ;
68- export const config = { runtime : 'edge' } ;
66+ function toRssItem ( blogPost : BlogPostFile ) : RSS . ItemOptions {
67+ return {
68+ title : blogPost . frontMatter . title ,
69+ date : new Date ( blogPost . frontMatter . date ) ,
70+ url : `https://the-guild.dev/graphql/hive${ blogPost . route } ` ,
71+ description : blogPost . frontMatter . description ?? '' ,
72+ author : getAuthor ( blogPost . frontMatter . authors ) ,
73+ categories : Array . isArray ( blogPost . frontMatter . tags )
74+ ? blogPost . frontMatter . tags
75+ : [ blogPost . frontMatter . tags ] ,
76+ } ;
77+ }
0 commit comments