11import * as v from 'valibot'
22import { PackageRouteParamsSchema } from '#shared/schemas/package'
33import { 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
611const CACHE_HEADER = 's-maxage=3600, stale-while-revalidate=86400'
712
@@ -28,6 +33,49 @@ const CACHE_HEADER = 's-maxage=3600, stale-while-revalidate=86400'
2833export 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