-
-
Notifications
You must be signed in to change notification settings - Fork 323
Expand file tree
/
Copy pathdocs.ts
More file actions
119 lines (103 loc) · 2.9 KB
/
docs.ts
File metadata and controls
119 lines (103 loc) · 2.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import {
extractFrontMatter,
fetchApiContents,
fetchRepoFile,
} from '~/utils/documents.server'
import removeMarkdown from 'remove-markdown'
import { notFound } from '@tanstack/react-router'
import { createServerFn } from '@tanstack/react-start'
import * as v from 'valibot'
import { setResponseHeader } from '@tanstack/react-start/server'
export const loadDocs = async ({
repo,
branch,
docsPath,
}: {
repo: string
branch: string
docsPath: string
}) => {
if (!branch || !docsPath) {
throw notFound({
data: {
message: 'No doc was found here!',
},
})
}
const filePath = `${docsPath}.md`
return await fetchDocs({
data: {
repo,
branch,
filePath,
},
})
}
export const fetchDocs = createServerFn({ method: 'POST' })
.inputValidator(
v.object({ repo: v.string(), branch: v.string(), filePath: v.string() }),
)
.handler(async ({ data: { repo, branch, filePath } }) => {
const file = await fetchRepoFile(repo, branch, filePath)
if (!file) {
throw notFound()
}
const frontMatter = extractFrontMatter(file)
const description = removeMarkdown(frontMatter.excerpt ?? '')
// Cache for 5 minutes on shared cache
// Revalidate in the background
setResponseHeader('Cache-Control', 'public, max-age=0, must-revalidate')
setResponseHeader(
'CDN-Cache-Control',
'max-age=300, stale-while-revalidate=300, durable',
)
return {
title: frontMatter.data?.title,
description,
filePath,
content: frontMatter.content,
frontmatter: frontMatter.data,
}
})
export const fetchFile = createServerFn({ method: 'POST' })
.inputValidator(
v.object({ repo: v.string(), branch: v.string(), filePath: v.string() }),
)
.handler(async ({ data: { repo, branch, filePath } }) => {
const file = await fetchRepoFile(repo, branch, filePath)
if (!file) {
throw notFound()
}
// Cache for 60 minutes on shared cache
// Revalidate in the background
setResponseHeader('Cache-Control', 'public, max-age=0, must-revalidate')
setResponseHeader(
'CDN-Cache-Control',
'max-age=3600, stale-while-revalidate=3600, durable',
)
return file
})
export const fetchRepoDirectoryContents = createServerFn({
method: 'POST',
})
.inputValidator(
v.object({
repo: v.string(),
branch: v.string(),
startingPath: v.string(),
}),
)
.handler(async ({ data: { repo, branch, startingPath } }) => {
const githubContents = await fetchApiContents(repo, branch, startingPath)
if (!githubContents) {
throw notFound()
}
// Cache for 60 minutes on shared cache
// Revalidate in the background
setResponseHeader('Cache-Control', 'public, max-age=0, must-revalidate')
setResponseHeader(
'CDN-Cache-Control',
'max-age=3600, stale-while-revalidate=3600, durable',
)
return githubContents
})