-
Notifications
You must be signed in to change notification settings - Fork 29
Expand file tree
/
Copy pathroute.ts
More file actions
90 lines (72 loc) · 3 KB
/
route.ts
File metadata and controls
90 lines (72 loc) · 3 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
import fs from 'node:fs';
import path from 'node:path';
import { type NextRequest, NextResponse } from 'next/server';
import { docsVersions, latestVersion } from '@repo/utils';
import matter from 'gray-matter';
import { getAllTrees } from '../../lib/get-all-trees';
import { getFlatTree } from '../../lib/get-flat-tree';
import {
resolveDocForLLM,
resolveVersionFromSlug,
} from '../../lib/resolve-doc-for-llm';
import { findDocFile } from '../../lib/get-page';
import { getLlmsBannerLines } from '../../lib/get-llms-banner-lines';
export const dynamic = 'force-dynamic';
export function GET(request: NextRequest) {
const renderer = request.nextUrl.searchParams.get('renderer') ?? 'react';
const language = request.nextUrl.searchParams.get('language') ?? 'ts';
const codeOnly = request.nextUrl.searchParams.get('codeOnly') === 'true';
const versionSlug = request.nextUrl.searchParams.get('version') ?? undefined;
const versionId = resolveVersionFromSlug(versionSlug);
const version = docsVersions.find((v) => v.id === versionId);
const listOfTrees = getAllTrees();
const tree = listOfTrees.find((t) => t.name === versionId);
const flatTree = tree?.children ? getFlatTree({ tree: tree.children }) : [];
const baseUrl = 'https://storybook.js.org';
// Collect all renderers and languages across all pages
const globalRenderers = new Set<string>();
const globalLanguages = new Set<string>();
const pageSections: string[] = [];
const isLatest = versionId === latestVersion.id;
const versionInSlug = version?.inSlug ?? versionId;
for (const node of flatTree) {
// Strip /docs/ prefix and version slug (e.g. /docs/9/writing-stories → writing-stories)
let docPath = node.slug.replace(/^\/docs\/?/, '');
if (!isLatest) {
docPath = docPath.replace(new RegExp(`^${versionInSlug}/`), '');
}
const result = findDocFile(`${versionId}/${docPath}`);
if (!result) continue;
const fullPath = path.join(process.cwd(), result.filePath);
const fileContent = fs.readFileSync(fullPath, 'utf8');
const { content: rawContent, data } = matter(fileContent);
const { content, availableRenderers, availableLanguages } =
resolveDocForLLM(rawContent, {
versionId,
renderer,
language,
codeOnly,
});
for (const r of availableRenderers) globalRenderers.add(r);
for (const l of availableLanguages) globalLanguages.add(l);
if (!content) continue;
const title = String(data.title ?? '');
pageSections.push(`# ${title}\n\n${content}`);
pageSections.push(`> Source: ${baseUrl}${node.slug}`);
pageSections.push('---');
pageSections.push('');
}
const header = [
...getLlmsBannerLines({ version: version ?? latestVersion }),
'---',
'',
].join('\n');
const fullContent = header + pageSections.join('\n');
return new NextResponse(fullContent, {
headers: {
'Content-Type': 'text/plain; charset=utf-8',
'Cache-Control': 'public, max-age=3600',
'CDN-Cache-Control': 'no-store',
},
});
}