Skip to content

Commit 00f0380

Browse files
committed
wip
1 parent 6ae3bd4 commit 00f0380

File tree

2 files changed

+45
-11
lines changed

2 files changed

+45
-11
lines changed

src/routeTree.gen.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import { Route as rootRouteImport } from './routes/__root'
1212
import { Route as SponsorsEmbedRouteImport } from './routes/sponsors-embed'
13+
import { Route as RssDotxmlRouteImport } from './routes/rss[.]xml'
1314
import { Route as PartnersEmbedRouteImport } from './routes/partners-embed'
1415
import { Route as MerchRouteImport } from './routes/merch'
1516
import { Route as LlmsDottxtRouteImport } from './routes/llms[.]txt'
@@ -106,6 +107,11 @@ const SponsorsEmbedRoute = SponsorsEmbedRouteImport.update({
106107
path: '/sponsors-embed',
107108
getParentRoute: () => rootRouteImport,
108109
} as any)
110+
const RssDotxmlRoute = RssDotxmlRouteImport.update({
111+
id: '/rss.xml',
112+
path: '/rss.xml',
113+
getParentRoute: () => rootRouteImport,
114+
} as any)
109115
const PartnersEmbedRoute = PartnersEmbedRouteImport.update({
110116
id: '/partners-embed',
111117
path: '/partners-embed',
@@ -587,6 +593,7 @@ export interface FileRoutesByFullPath {
587593
'/llms.txt': typeof LlmsDottxtRoute
588594
'/merch': typeof MerchRoute
589595
'/partners-embed': typeof PartnersEmbedRoute
596+
'/rss.xml': typeof RssDotxmlRoute
590597
'/sponsors-embed': typeof SponsorsEmbedRoute
591598
'/$libraryId/$version': typeof LibraryIdVersionRouteWithChildren
592599
'/account': typeof LibrariesAccountRouteWithChildren
@@ -677,6 +684,7 @@ export interface FileRoutesByTo {
677684
'/llms.txt': typeof LlmsDottxtRoute
678685
'/merch': typeof MerchRoute
679686
'/partners-embed': typeof PartnersEmbedRoute
687+
'/rss.xml': typeof RssDotxmlRoute
680688
'/sponsors-embed': typeof SponsorsEmbedRoute
681689
'/$libraryId/$version': typeof LibraryIdVersionRouteWithChildren
682690
'/ads': typeof LibrariesAdsRoute
@@ -768,6 +776,7 @@ export interface FileRoutesById {
768776
'/llms.txt': typeof LlmsDottxtRoute
769777
'/merch': typeof MerchRoute
770778
'/partners-embed': typeof PartnersEmbedRoute
779+
'/rss.xml': typeof RssDotxmlRoute
771780
'/sponsors-embed': typeof SponsorsEmbedRoute
772781
'/$libraryId/$version': typeof LibraryIdVersionRouteWithChildren
773782
'/_libraries/account': typeof LibrariesAccountRouteWithChildren
@@ -862,6 +871,7 @@ export interface FileRouteTypes {
862871
| '/llms.txt'
863872
| '/merch'
864873
| '/partners-embed'
874+
| '/rss.xml'
865875
| '/sponsors-embed'
866876
| '/$libraryId/$version'
867877
| '/account'
@@ -952,6 +962,7 @@ export interface FileRouteTypes {
952962
| '/llms.txt'
953963
| '/merch'
954964
| '/partners-embed'
965+
| '/rss.xml'
955966
| '/sponsors-embed'
956967
| '/$libraryId/$version'
957968
| '/ads'
@@ -1042,6 +1053,7 @@ export interface FileRouteTypes {
10421053
| '/llms.txt'
10431054
| '/merch'
10441055
| '/partners-embed'
1056+
| '/rss.xml'
10451057
| '/sponsors-embed'
10461058
| '/$libraryId/$version'
10471059
| '/_libraries/account'
@@ -1136,6 +1148,7 @@ export interface RootRouteChildren {
11361148
LlmsDottxtRoute: typeof LlmsDottxtRoute
11371149
MerchRoute: typeof MerchRoute
11381150
PartnersEmbedRoute: typeof PartnersEmbedRoute
1151+
RssDotxmlRoute: typeof RssDotxmlRoute
11391152
SponsorsEmbedRoute: typeof SponsorsEmbedRoute
11401153
ApiUploadthingRoute: typeof ApiUploadthingRoute
11411154
AuthSignoutRoute: typeof AuthSignoutRoute
@@ -1161,6 +1174,13 @@ declare module '@tanstack/react-router' {
11611174
preLoaderRoute: typeof SponsorsEmbedRouteImport
11621175
parentRoute: typeof rootRouteImport
11631176
}
1177+
'/rss.xml': {
1178+
id: '/rss.xml'
1179+
path: '/rss.xml'
1180+
fullPath: '/rss.xml'
1181+
preLoaderRoute: typeof RssDotxmlRouteImport
1182+
parentRoute: typeof rootRouteImport
1183+
}
11641184
'/partners-embed': {
11651185
id: '/partners-embed'
11661186
path: '/partners-embed'
@@ -2025,6 +2045,7 @@ const rootRouteChildren: RootRouteChildren = {
20252045
LlmsDottxtRoute: LlmsDottxtRoute,
20262046
MerchRoute: MerchRoute,
20272047
PartnersEmbedRoute: PartnersEmbedRoute,
2048+
RssDotxmlRoute: RssDotxmlRoute,
20282049
SponsorsEmbedRoute: SponsorsEmbedRoute,
20292050
ApiUploadthingRoute: ApiUploadthingRoute,
20302051
AuthSignoutRoute: AuthSignoutRoute,
Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { createAPIFileRoute } from '@tanstack/react-start/api'
1+
import { createFileRoute } from '@tanstack/react-router'
2+
import { setResponseHeader } from '@tanstack/react-start/server'
23
import { getPublishedPosts, formatAuthors } from '~/utils/blog'
34

45
function escapeXml(unsafe: string): string {
@@ -20,12 +21,14 @@ function generateRSSFeed() {
2021
const postUrl = `${siteUrl}/blog/${post.slug}`
2122
const pubDate = new Date(post.published).toUTCString()
2223
const author = formatAuthors(post.authors)
23-
24+
2425
// Use excerpt if available, otherwise try to get first paragraph from content
2526
let description = post.excerpt || ''
2627
if (!description && post.content) {
2728
// Extract first paragraph after frontmatter
28-
const contentWithoutFrontmatter = post.content.replace(/^---[\s\S]*?---/, '').trim()
29+
const contentWithoutFrontmatter = post.content
30+
.replace(/^---[\s\S]*?---/, '')
31+
.trim()
2932
const firstParagraph = contentWithoutFrontmatter.split('\n\n')[0]
3033
description = firstParagraph.replace(/!\[[^\]]*\]\([^)]*\)/g, '') // Remove images
3134
}
@@ -57,15 +60,25 @@ function generateRSSFeed() {
5760
</rss>`
5861
}
5962

60-
export const APIRoute = createAPIFileRoute('/rss.xml')({
61-
GET: async () => {
62-
const rss = generateRSSFeed()
63+
export const Route = createFileRoute('/rss.xml')({
64+
// @ts-ignore server property not in route types yet
65+
server: {
66+
handlers: {
67+
GET: async () => {
68+
const content = generateRSSFeed()
69+
70+
setResponseHeader('Content-Type', 'application/xml; charset=utf-8')
71+
setResponseHeader(
72+
'Cache-Control',
73+
'public, max-age=300, must-revalidate',
74+
)
75+
setResponseHeader(
76+
'CDN-Cache-Control',
77+
'max-age=3600, stale-while-revalidate=3600',
78+
)
6379

64-
return new Response(rss, {
65-
headers: {
66-
'Content-Type': 'application/xml; charset=utf-8',
67-
'Cache-Control': 'public, max-age=300, s-maxage=3600',
80+
return new Response(content)
6881
},
69-
})
82+
},
7083
},
7184
})

0 commit comments

Comments
 (0)