Skip to content

Commit a481b82

Browse files
committed
feat(llm-docs): handle .md routes in middleware
1 parent 05b7bec commit a481b82

1 file changed

Lines changed: 49 additions & 1 deletion

File tree

server/middleware/llm-docs.ts

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
import * as v from 'valibot'
22
import { PackageRouteParamsSchema } from '#shared/schemas/package'
33
import { handleApiError } from '#server/utils/error-handler'
4-
import { handleLlmsTxt, handleOrgLlmsTxt, generateRootLlmsTxt } from '#server/utils/llm-docs'
4+
import {
5+
handleLlmsTxt,
6+
handleOrgLlmsTxt,
7+
generateRootLlmsTxt,
8+
handlePackageMd,
9+
} from '#server/utils/llm-docs'
510

611
const CACHE_HEADER = 's-maxage=3600, stale-while-revalidate=86400'
712

@@ -28,6 +33,49 @@ const CACHE_HEADER = 's-maxage=3600, stale-while-revalidate=86400'
2833
export default defineEventHandler(async event => {
2934
const path = event.path.split('?')[0] ?? '/'
3035

36+
// Handle .md routes — raw README markdown
37+
if (path.startsWith('/package/') && path.endsWith('.md')) {
38+
const inner = path.slice('/package/'.length, -'.md'.length)
39+
40+
let rawPackageName: string
41+
let rawVersion: string | undefined
42+
43+
if (inner.includes('/v/')) {
44+
if (inner.startsWith('@')) {
45+
const match = inner.match(/^(@[^/]+\/[^/]+)\/v\/(.+)$/)
46+
if (!match?.[1] || !match[2]) return
47+
rawPackageName = match[1]
48+
rawVersion = match[2]
49+
} else {
50+
const match = inner.match(/^([^/]+)\/v\/(.+)$/)
51+
if (!match?.[1] || !match[2]) return
52+
rawPackageName = match[1]
53+
rawVersion = match[2]
54+
}
55+
} else {
56+
rawPackageName = inner
57+
}
58+
59+
if (!rawPackageName) return
60+
61+
try {
62+
const { packageName, version } = v.parse(PackageRouteParamsSchema, {
63+
packageName: rawPackageName,
64+
version: rawVersion,
65+
})
66+
67+
const content = await handlePackageMd(packageName, version)
68+
setHeader(event, 'Content-Type', 'text/markdown; charset=utf-8')
69+
setHeader(event, 'Cache-Control', CACHE_HEADER)
70+
return content
71+
} catch (error: unknown) {
72+
handleApiError(error, {
73+
statusCode: 502,
74+
message: 'Failed to generate package markdown.',
75+
})
76+
}
77+
}
78+
3179
if (!path.endsWith('/llms.txt') && !path.endsWith('/llms_full.txt')) return
3280

3381
const full = path.endsWith('/llms_full.txt')

0 commit comments

Comments
 (0)