Skip to content

Commit 594b42d

Browse files
committed
feat(llms-txt): replace API route with file-based server routes
Use Nitro server routes at /package/.../llms.txt instead of an API route with middleware rewriting. Single handler re-exported across four route files for unscoped, scoped, and versioned URL patterns.
1 parent c6be6cf commit 594b42d

File tree

5 files changed

+20
-12
lines changed

5 files changed

+20
-12
lines changed

nuxt.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ export default defineNuxtConfig({
112112
'/api/registry/file/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } },
113113
'/api/registry/provenance/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } },
114114
'/api/registry/files/**': { isr: true, cache: { maxAge: 365 * 24 * 60 * 60 } },
115+
'/package/**/llms.txt': { isr: 3600 },
115116
'/api/registry/package-meta/**': { isr: 300 },
116117
'/:pkg/.well-known/skills/**': { isr: 3600 },
117118
'/:scope/:pkg/.well-known/skills/**': { isr: 3600 },

server/api/registry/llms-txt/[...pkg].get.ts renamed to server/routes/package/[name]/llms.txt.get.ts

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,24 @@ import { handleApiError } from '#server/utils/error-handler'
55
import { handleLlmsTxt } from '#server/utils/llms-txt'
66

77
/**
8-
* Serves llms.txt for an npm package — a single LLM-friendly markdown document
9-
* aggregating README and agent instruction files (CLAUDE.md, AGENTS.md, etc.).
8+
* Serves llms.txt for an npm package.
109
*
11-
* URL patterns:
12-
* - /api/registry/llms-txt/nuxt → latest version
13-
* - /api/registry/llms-txt/@nuxt/kit → scoped, latest
14-
* - /api/registry/llms-txt/nuxt/v/3.12.0 → specific version
15-
* - /api/registry/llms-txt/@nuxt/kit/v/1.0.0 → scoped, specific version
10+
* Handles all URL shapes via re-exports:
11+
* - /package/:name/llms.txt
12+
* - /package/:org/:name/llms.txt
13+
* - /package/:name/v/:version/llms.txt
14+
* - /package/:org/:name/v/:version/llms.txt
1615
*/
1716
export default defineCachedEventHandler(
1817
async event => {
19-
const pkgParamSegments = getRouterParam(event, 'pkg')?.split('/') ?? []
20-
if (pkgParamSegments.length === 0) {
18+
const org = getRouterParam(event, 'org')
19+
const name = getRouterParam(event, 'name')
20+
const rawVersion = getRouterParam(event, 'version')
21+
if (!name) {
2122
throw createError({ statusCode: 404, message: 'Package name is required.' })
2223
}
2324

24-
const { rawPackageName, rawVersion } = parsePackageParams(pkgParamSegments)
25+
const rawPackageName = org ? `${org}/${name}` : name
2526

2627
try {
2728
const { packageName, version } = v.parse(PackageRouteParamsSchema, {
@@ -43,8 +44,11 @@ export default defineCachedEventHandler(
4344
maxAge: CACHE_MAX_AGE_ONE_HOUR,
4445
swr: true,
4546
getKey: event => {
46-
const pkg = getRouterParam(event, 'pkg') ?? ''
47-
return `llms-txt:${pkg.replace(/\/+$/, '').trim()}`
47+
const org = getRouterParam(event, 'org')
48+
const name = getRouterParam(event, 'name')
49+
const version = getRouterParam(event, 'version')
50+
const pkg = org ? `${org}/${name}` : name
51+
return version ? `llms-txt:${pkg}@${version}` : `llms-txt:${pkg}`
4852
},
4953
},
5054
)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from '../../llms.txt.get'
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from '../../[name]/llms.txt.get'
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from '../../../../[name]/llms.txt.get'

0 commit comments

Comments
 (0)