@farming-labs/astro 0.0.2-beta.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Content loading utilities for Astro docs.
3
+ *
4
+ * Scans the filesystem for `.md` / `.mdx` content files,
5
+ * extracts frontmatter, and builds a navigation tree compatible
6
+ * with @farming-labs/docs DocsConfig.
7
+ */
8
+ import type { OrderingItem } from "@farming-labs/docs";
9
+ export interface PageNode {
10
+ type: "page";
11
+ name: string;
12
+ url: string;
13
+ icon?: string;
14
+ description?: string;
15
+ }
16
+ export interface FolderNode {
17
+ type: "folder";
18
+ name: string;
19
+ icon?: string;
20
+ index?: PageNode;
21
+ children: NavNode[];
22
+ }
23
+ export type NavNode = PageNode | FolderNode;
24
+ export interface NavTree {
25
+ name: string;
26
+ children: NavNode[];
27
+ }
28
+ export interface ContentPage {
29
+ slug: string;
30
+ url: string;
31
+ title: string;
32
+ description?: string;
33
+ icon?: string;
34
+ content: string;
35
+ rawContent: string;
36
+ }
37
+ /**
38
+ * Scan a content directory and return all docs pages.
39
+ * Expects a flat or nested structure of `.md` files:
40
+ * content/docs/index.md → /docs
41
+ * content/docs/installation.md → /docs/installation
42
+ * content/docs/guides/auth.md → /docs/guides/auth
43
+ */
44
+ export declare function loadDocsContent(contentDir: string, entry?: string): ContentPage[];
45
+ /**
46
+ * Build a navigation tree from a content directory.
47
+ */
48
+ export declare function loadDocsNavTree(contentDir: string, entry?: string, ordering?: "alphabetical" | "numeric" | OrderingItem[]): NavTree;
49
+ /**
50
+ * Flatten a navigation tree into an ordered list of pages.
51
+ * Useful for computing previous/next page links.
52
+ */
53
+ export declare function flattenNavTree(tree: NavTree): PageNode[];
54
+ //# sourceMappingURL=content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE5C,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,MAAe,GACrB,WAAW,EAAE,CAiDf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,MAAe,EACtB,QAAQ,CAAC,EAAE,cAAc,GAAG,SAAS,GAAG,YAAY,EAAE,GACrD,OAAO,CAkBT;AAiGD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,EAAE,CAgBxD"}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Content loading utilities for Astro docs.
3
+ *
4
+ * Scans the filesystem for `.md` / `.mdx` content files,
5
+ * extracts frontmatter, and builds a navigation tree compatible
6
+ * with @farming-labs/docs DocsConfig.
7
+ */
8
+ import fs from "node:fs";
9
+ import path from "node:path";
10
+ import matter from "gray-matter";
11
+ /**
12
+ * Scan a content directory and return all docs pages.
13
+ * Expects a flat or nested structure of `.md` files:
14
+ * content/docs/index.md → /docs
15
+ * content/docs/installation.md → /docs/installation
16
+ * content/docs/guides/auth.md → /docs/guides/auth
17
+ */
18
+ export function loadDocsContent(contentDir, entry = "docs") {
19
+ const pages = [];
20
+ const absDir = path.resolve(contentDir);
21
+ function scan(dir, slugParts) {
22
+ if (!fs.existsSync(dir))
23
+ return;
24
+ const entries = fs.readdirSync(dir).sort();
25
+ for (const name of entries) {
26
+ const full = path.join(dir, name);
27
+ const stat = fs.statSync(full);
28
+ if (stat.isDirectory()) {
29
+ scan(full, [...slugParts, name]);
30
+ continue;
31
+ }
32
+ if (!name.endsWith(".md") && !name.endsWith(".mdx") && !name.endsWith(".svx"))
33
+ continue;
34
+ const raw = fs.readFileSync(full, "utf-8");
35
+ const { data, content } = matter(raw);
36
+ const baseName = name.replace(/\.(md|mdx|svx)$/, "");
37
+ const isIndex = baseName === "index" || baseName === "page" || baseName === "+page";
38
+ const slug = isIndex
39
+ ? slugParts.join("/")
40
+ : [...slugParts, baseName].join("/");
41
+ const url = slug ? `/${entry}/${slug}` : `/${entry}`;
42
+ const title = data.title ??
43
+ baseName.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
44
+ pages.push({
45
+ slug,
46
+ url,
47
+ title,
48
+ description: data.description,
49
+ icon: data.icon,
50
+ content: stripMarkdown(content),
51
+ rawContent: content,
52
+ });
53
+ }
54
+ }
55
+ scan(absDir, []);
56
+ return pages;
57
+ }
58
+ /**
59
+ * Build a navigation tree from a content directory.
60
+ */
61
+ export function loadDocsNavTree(contentDir, entry = "docs", ordering) {
62
+ const absDir = path.resolve(contentDir);
63
+ const children = [];
64
+ const indexPath = findIndex(absDir);
65
+ if (indexPath) {
66
+ const { data } = matter(fs.readFileSync(indexPath, "utf-8"));
67
+ children.push({
68
+ type: "page",
69
+ name: data.title ?? "Documentation",
70
+ url: `/${entry}`,
71
+ icon: data.icon,
72
+ });
73
+ }
74
+ const rootSlugOrder = Array.isArray(ordering) ? ordering : undefined;
75
+ children.push(...scanDir(absDir, [], entry, ordering, rootSlugOrder));
76
+ return { name: "Docs", children };
77
+ }
78
+ function buildNavNode(dir, name, slugParts, entry, ordering, childSlugOrder) {
79
+ const full = path.join(dir, name);
80
+ if (!fs.statSync(full).isDirectory())
81
+ return null;
82
+ const indexPath = findIndex(full);
83
+ if (!indexPath)
84
+ return null;
85
+ const { data } = matter(fs.readFileSync(indexPath, "utf-8"));
86
+ const slug = [...slugParts, name];
87
+ const url = `/${entry}/${slug.join("/")}`;
88
+ const displayName = data.title ?? name.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
89
+ const icon = data.icon;
90
+ const childDirs = fs.readdirSync(full).filter((n) => {
91
+ const p = path.join(full, n);
92
+ return fs.statSync(p).isDirectory() && findIndex(p) !== null;
93
+ });
94
+ if (childDirs.length > 0) {
95
+ return {
96
+ type: "folder",
97
+ name: displayName,
98
+ icon,
99
+ index: { type: "page", name: displayName, url, icon },
100
+ children: scanDir(full, slug, entry, ordering, childSlugOrder),
101
+ };
102
+ }
103
+ return { type: "page", name: displayName, url, icon };
104
+ }
105
+ function scanDir(dir, slugParts, entry, ordering, slugOrder) {
106
+ if (!fs.existsSync(dir))
107
+ return [];
108
+ const entries = fs.readdirSync(dir).sort();
109
+ if (slugOrder) {
110
+ const nodes = [];
111
+ const slugMap = new Set(slugOrder.map((i) => i.slug));
112
+ for (const item of slugOrder) {
113
+ if (!entries.includes(item.slug))
114
+ continue;
115
+ const node = buildNavNode(dir, item.slug, slugParts, entry, ordering, item.children);
116
+ if (node)
117
+ nodes.push(node);
118
+ }
119
+ for (const name of entries) {
120
+ if (slugMap.has(name))
121
+ continue;
122
+ const node = buildNavNode(dir, name, slugParts, entry, ordering);
123
+ if (node)
124
+ nodes.push(node);
125
+ }
126
+ return nodes;
127
+ }
128
+ if (ordering === "numeric") {
129
+ const nodes = [];
130
+ for (const name of entries) {
131
+ const full = path.join(dir, name);
132
+ if (!fs.statSync(full).isDirectory())
133
+ continue;
134
+ const indexPath = findIndex(full);
135
+ if (!indexPath)
136
+ continue;
137
+ const { data } = matter(fs.readFileSync(indexPath, "utf-8"));
138
+ const order = typeof data.order === "number" ? data.order : Infinity;
139
+ const node = buildNavNode(dir, name, slugParts, entry, ordering);
140
+ if (node)
141
+ nodes.push({ order, node });
142
+ }
143
+ nodes.sort((a, b) => {
144
+ if (a.order === b.order)
145
+ return 0;
146
+ return a.order - b.order;
147
+ });
148
+ return nodes.map((n) => n.node);
149
+ }
150
+ const nodes = [];
151
+ for (const name of entries) {
152
+ const node = buildNavNode(dir, name, slugParts, entry, ordering);
153
+ if (node)
154
+ nodes.push(node);
155
+ }
156
+ return nodes;
157
+ }
158
+ function findIndex(dir) {
159
+ for (const name of ["page.md", "page.mdx", "index.md", "index.svx", "+page.md", "+page.svx"]) {
160
+ const p = path.join(dir, name);
161
+ if (fs.existsSync(p))
162
+ return p;
163
+ }
164
+ return null;
165
+ }
166
+ /**
167
+ * Flatten a navigation tree into an ordered list of pages.
168
+ * Useful for computing previous/next page links.
169
+ */
170
+ export function flattenNavTree(tree) {
171
+ const pages = [];
172
+ function walk(nodes) {
173
+ for (const node of nodes) {
174
+ if (node.type === "page") {
175
+ pages.push(node);
176
+ }
177
+ else if (node.type === "folder") {
178
+ if (node.index)
179
+ pages.push(node.index);
180
+ walk(node.children);
181
+ }
182
+ }
183
+ }
184
+ walk(tree.children);
185
+ return pages;
186
+ }
187
+ function stripMarkdown(content) {
188
+ return content
189
+ .replace(/^(import|export)\s.*$/gm, "")
190
+ .replace(/<[^>]+\/>/g, "")
191
+ .replace(/<\/?[A-Z][^>]*>/g, "")
192
+ .replace(/<\/?[a-z][^>]*>/g, "")
193
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1")
194
+ .replace(/!\[([^\]]*)\]\([^)]+\)/g, "$1")
195
+ .replace(/^#{1,6}\s+/gm, "")
196
+ .replace(/(\*{1,3}|_{1,3})(.*?)\1/g, "$2")
197
+ .replace(/```[\s\S]*?```/g, "")
198
+ .replace(/`([^`]+)`/g, "$1")
199
+ .replace(/^>\s+/gm, "")
200
+ .replace(/^[-*_]{3,}\s*$/gm, "")
201
+ .replace(/\n{3,}/g, "\n\n")
202
+ .trim();
203
+ }
204
+ //# sourceMappingURL=content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content.js","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @farming-labs/astro
3
+ *
4
+ * Astro adapter for the @farming-labs/docs framework.
5
+ * Provides content loading, navigation tree building, search,
6
+ * and server-side markdown rendering for Astro-based documentation sites.
7
+ */
8
+ export { loadDocsContent, loadDocsNavTree, flattenNavTree, type NavNode, type NavTree, type PageNode, type FolderNode } from "./content.js";
9
+ export { renderMarkdown } from "./markdown.js";
10
+ export { createDocsServer, type DocsServer } from "./server.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAC5I,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @farming-labs/astro
3
+ *
4
+ * Astro adapter for the @farming-labs/docs framework.
5
+ * Provides content loading, navigation tree building, search,
6
+ * and server-side markdown rendering for Astro-based documentation sites.
7
+ */
8
+ export { loadDocsContent, loadDocsNavTree, flattenNavTree } from "./content.js";
9
+ export { renderMarkdown } from "./markdown.js";
10
+ export { createDocsServer } from "./server.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAA8D,MAAM,cAAc,CAAC;AAC5I,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Server-side markdown rendering with Shiki syntax highlighting.
3
+ *
4
+ * Converts raw markdown content to HTML, supporting:
5
+ * - Fenced code blocks with dual-theme syntax highlighting
6
+ * - Copy-to-clipboard buttons on code blocks
7
+ * - Tabbed code blocks (`<Tabs>` / `<Tab>` syntax)
8
+ * - Callouts / admonitions (GitHub `[!NOTE]` and `**Note:**` styles)
9
+ * - Tables, lists, inline formatting, headings with anchor IDs
10
+ */
11
+ /**
12
+ * Render a markdown string to HTML with full syntax highlighting,
13
+ * callouts, tables, tabs, and copy-to-clipboard support.
14
+ *
15
+ * Designed for server-side use in Astro page loaders.
16
+ */
17
+ export declare function renderMarkdown(content: string): Promise<string>;
18
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA2HH;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqMrE"}
@@ -0,0 +1,281 @@
1
+ /**
2
+ * Server-side markdown rendering with Shiki syntax highlighting.
3
+ *
4
+ * Converts raw markdown content to HTML, supporting:
5
+ * - Fenced code blocks with dual-theme syntax highlighting
6
+ * - Copy-to-clipboard buttons on code blocks
7
+ * - Tabbed code blocks (`<Tabs>` / `<Tab>` syntax)
8
+ * - Callouts / admonitions (GitHub `[!NOTE]` and `**Note:**` styles)
9
+ * - Tables, lists, inline formatting, headings with anchor IDs
10
+ */
11
+ import { createHighlighter } from "shiki";
12
+ let highlighterPromise = null;
13
+ function getHighlighter() {
14
+ if (!highlighterPromise) {
15
+ highlighterPromise = createHighlighter({
16
+ themes: ["github-light", "github-dark"],
17
+ langs: [
18
+ "javascript",
19
+ "typescript",
20
+ "jsx",
21
+ "tsx",
22
+ "json",
23
+ "bash",
24
+ "shellscript",
25
+ "html",
26
+ "css",
27
+ "markdown",
28
+ "yaml",
29
+ "sql",
30
+ "python",
31
+ "dotenv",
32
+ ],
33
+ });
34
+ }
35
+ return highlighterPromise;
36
+ }
37
+ function slugify(text) {
38
+ return text
39
+ .toLowerCase()
40
+ .replace(/<[^>]+>/g, "")
41
+ .replace(/[^\w\s-]/g, "")
42
+ .replace(/\s+/g, "-")
43
+ .replace(/-+/g, "-")
44
+ .trim();
45
+ }
46
+ const calloutIcons = {
47
+ note: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg>',
48
+ warning: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>',
49
+ tip: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18h6"/><path d="M10 22h4"/><path d="M15.09 14c.18-.98.65-1.74 1.41-2.5A4.65 4.65 0 0018 8 6 6 0 006 8c0 1 .23 2.23 1.5 3.5A4.61 4.61 0 019 14"/></svg>',
50
+ important: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
51
+ caution: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="15" y1="9" x2="9" y2="15"/><line x1="9" y1="9" x2="15" y2="15"/></svg>',
52
+ };
53
+ function renderCallout(type, content) {
54
+ const icon = calloutIcons[type] || calloutIcons.note;
55
+ const label = type.charAt(0).toUpperCase() + type.slice(1);
56
+ return `<div class="fd-callout fd-callout-${type}" role="note"><div class="fd-callout-indicator" role="none"></div><div class="fd-callout-icon">${icon}</div><div class="fd-callout-content"><p class="fd-callout-title">${label}</p><p>${content}</p></div></div>`;
57
+ }
58
+ function highlightCode(hl, code, lang) {
59
+ if (lang === "sh" || lang === "shell")
60
+ lang = "bash";
61
+ if (lang === "env")
62
+ lang = "dotenv";
63
+ const supported = hl.getLoadedLanguages();
64
+ if (!supported.includes(lang))
65
+ lang = "text";
66
+ const trimmedCode = code.replace(/\n$/, "");
67
+ try {
68
+ return {
69
+ html: hl.codeToHtml(trimmedCode, {
70
+ lang,
71
+ themes: { light: "github-light", dark: "github-dark" },
72
+ }),
73
+ raw: trimmedCode,
74
+ };
75
+ }
76
+ catch {
77
+ const escaped = trimmedCode
78
+ .replace(/&/g, "&amp;")
79
+ .replace(/</g, "&lt;")
80
+ .replace(/>/g, "&gt;");
81
+ return {
82
+ html: `<pre class="shiki"><code>${escaped}</code></pre>`,
83
+ raw: trimmedCode,
84
+ };
85
+ }
86
+ }
87
+ function parseMeta(meta) {
88
+ const lang = (meta.split(/\s/)[0] || "text").toLowerCase();
89
+ const titleMatch = meta.match(/title=["']([^"']+)["']/);
90
+ return { lang, title: titleMatch ? titleMatch[1] : null };
91
+ }
92
+ function wrapCodeWithCopy(html, rawCode, title) {
93
+ const escapedRaw = rawCode
94
+ .replace(/&/g, "&amp;")
95
+ .replace(/"/g, "&quot;")
96
+ .replace(/</g, "&lt;")
97
+ .replace(/>/g, "&gt;");
98
+ const copyBtn = `<button class="fd-copy-btn" data-code="${escapedRaw}" title="Copy code"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg></button>`;
99
+ if (title) {
100
+ return `<div class="fd-codeblock fd-codeblock--titled"><div class="fd-codeblock-title"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/></svg><span class="fd-codeblock-title-text">${title}</span>${copyBtn}</div><div class="fd-codeblock-content">${html}</div></div>`;
101
+ }
102
+ return `<div class="fd-codeblock">${copyBtn}<div class="fd-codeblock-content">${html}</div></div>`;
103
+ }
104
+ function dedentCode(raw) {
105
+ const lines = raw.replace(/\n$/, "").split("\n");
106
+ const indent = lines.reduce((min, l) => {
107
+ if (!l.trim())
108
+ return min;
109
+ const spaces = l.match(/^(\s*)/)?.[1].length ?? 0;
110
+ return Math.min(min, spaces);
111
+ }, Infinity);
112
+ if (indent > 0 && indent < Infinity) {
113
+ return lines.map((l) => l.slice(indent)).join("\n");
114
+ }
115
+ return raw;
116
+ }
117
+ /**
118
+ * Render a markdown string to HTML with full syntax highlighting,
119
+ * callouts, tables, tabs, and copy-to-clipboard support.
120
+ *
121
+ * Designed for server-side use in Astro page loaders.
122
+ */
123
+ export async function renderMarkdown(content) {
124
+ if (!content)
125
+ return "";
126
+ const hl = await getHighlighter();
127
+ let result = content;
128
+ // ── Tabs blocks: <Tabs items={[...]}> ... </Tabs> ──
129
+ const tabsBlocks = [];
130
+ result = result.replace(/<Tabs\s+items=\{?\[([^\]]+)\]\}?>([\s\S]*?)<\/Tabs>/g, (_, itemsStr, body) => {
131
+ const items = itemsStr
132
+ .split(",")
133
+ .map((s) => s.trim().replace(/^["']|["']$/g, ""));
134
+ const panels = [];
135
+ const tabRegex = /<Tab\s+value=["']([^"']+)["']>([\s\S]*?)<\/Tab>/g;
136
+ let tabMatch;
137
+ while ((tabMatch = tabRegex.exec(body)) !== null) {
138
+ const tabValue = tabMatch[1];
139
+ const tabContent = tabMatch[2].trim();
140
+ const codeMatch = tabContent.match(/```([^\n]*)\n([\s\S]*?)```/);
141
+ if (codeMatch) {
142
+ const { lang, title } = parseMeta(codeMatch[1]);
143
+ const dedented = dedentCode(codeMatch[2]);
144
+ const { html, raw } = highlightCode(hl, dedented, lang);
145
+ panels.push({ value: tabValue, html: wrapCodeWithCopy(html, raw, title) });
146
+ }
147
+ else {
148
+ panels.push({ value: tabValue, html: `<p>${tabContent}</p>` });
149
+ }
150
+ }
151
+ let tabsHtml = `<div class="fd-tabs" data-tabs>`;
152
+ tabsHtml += `<div class="fd-tabs-list" role="tablist">`;
153
+ for (let i = 0; i < items.length; i++) {
154
+ tabsHtml += `<button role="tab" class="fd-tab-trigger${i === 0 ? " fd-tab-active" : ""}" data-tab-value="${items[i]}" aria-selected="${i === 0}">${items[i]}</button>`;
155
+ }
156
+ tabsHtml += `</div>`;
157
+ for (let i = 0; i < panels.length; i++) {
158
+ tabsHtml += `<div class="fd-tab-panel${i === 0 ? " fd-tab-panel-active" : ""}" data-tab-panel="${panels[i].value}" role="tabpanel">${panels[i].html}</div>`;
159
+ }
160
+ tabsHtml += `</div>`;
161
+ const placeholder = `%%TABS_${tabsBlocks.length}%%`;
162
+ tabsBlocks.push(tabsHtml);
163
+ return placeholder;
164
+ });
165
+ // ── Fenced code blocks ──
166
+ const codeBlocks = [];
167
+ result = result.replace(/```([^\n]*)\n([\s\S]*?)```/g, (_, meta, code) => {
168
+ const { lang, title } = parseMeta(meta);
169
+ const { html, raw } = highlightCode(hl, code, lang);
170
+ const placeholder = `%%CODEBLOCK_${codeBlocks.length}%%`;
171
+ codeBlocks.push(wrapCodeWithCopy(html, raw, title));
172
+ return placeholder;
173
+ });
174
+ // Inline code
175
+ result = result.replace(/`([^`]+)`/g, "<code>$1</code>");
176
+ // Headings (h4 → h1 order to avoid prefix collisions)
177
+ result = result.replace(/^#### (.+)$/gm, (_, text) => {
178
+ return `<h4 id="${slugify(text)}">${text}</h4>`;
179
+ });
180
+ result = result.replace(/^### (.+)$/gm, (_, text) => {
181
+ return `<h3 id="${slugify(text)}">${text}</h3>`;
182
+ });
183
+ result = result.replace(/^## (.+)$/gm, (_, text) => {
184
+ return `<h2 id="${slugify(text)}">${text}</h2>`;
185
+ });
186
+ result = result.replace(/^# (.+)$/gm, "<h1>$1</h1>");
187
+ // ── Callouts / blockquotes (before inline formatting) ──
188
+ const calloutBlocks = [];
189
+ result = result.replace(/(?:^>\s*.+\n?)+/gm, (block) => {
190
+ const lines = block.split("\n").filter(Boolean);
191
+ const inner = lines.map((l) => l.replace(/^>\s?/, "")).join("\n");
192
+ const ghMatch = inner.match(/^\[!(NOTE|WARNING|TIP|IMPORTANT|CAUTION)\]\s*\n?([\s\S]*)/i);
193
+ if (ghMatch) {
194
+ const type = ghMatch[1].toLowerCase();
195
+ const calloutContent = ghMatch[2].trim();
196
+ const placeholder = `%%CALLOUT_${calloutBlocks.length}%%`;
197
+ calloutBlocks.push(renderCallout(type, calloutContent));
198
+ return placeholder;
199
+ }
200
+ const boldMatch = inner.match(/^\*\*(Note|Warning|Tip|Important|Caution):\*\*\s*([\s\S]*)/i);
201
+ if (boldMatch) {
202
+ const type = boldMatch[1].toLowerCase();
203
+ const calloutContent = boldMatch[2].trim();
204
+ const placeholder = `%%CALLOUT_${calloutBlocks.length}%%`;
205
+ calloutBlocks.push(renderCallout(type, calloutContent));
206
+ return placeholder;
207
+ }
208
+ return `<blockquote><p>${inner}</p></blockquote>`;
209
+ });
210
+ // Inline formatting
211
+ result = result.replace(/\*\*\*(.+?)\*\*\*/g, "<strong><em>$1</em></strong>");
212
+ result = result.replace(/\*\*(.+?)\*\*/g, "<strong>$1</strong>");
213
+ result = result.replace(/\*(.+?)\*/g, "<em>$1</em>");
214
+ // Links
215
+ result = result.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
216
+ // Horizontal rules
217
+ result = result.replace(/^---$/gm, "<hr />");
218
+ // Tables
219
+ result = result.replace(/^\|(.+)\|\n\|[-| ]+\|\n((?:\|.+\|\n?)+)/gm, (_, headerRow, bodyRows) => {
220
+ const headers = headerRow
221
+ .split("|")
222
+ .map((h) => h.trim())
223
+ .filter(Boolean);
224
+ const rows = bodyRows
225
+ .trim()
226
+ .split("\n")
227
+ .map((row) => row
228
+ .split("|")
229
+ .map((c) => c.trim())
230
+ .filter(Boolean));
231
+ const headerHtml = headers.map((h) => `<th>${h}</th>`).join("");
232
+ const rowsHtml = rows
233
+ .map((row) => `<tr>${row.map((c) => `<td>${c}</td>`).join("")}</tr>`)
234
+ .join("");
235
+ return `<div class="fd-table-wrapper"><table><thead><tr>${headerHtml}</tr></thead><tbody>${rowsHtml}</tbody></table></div>`;
236
+ });
237
+ // Unordered lists
238
+ result = result.replace(/(?:^- .+\n?)+/gm, (block) => {
239
+ const items = block
240
+ .split("\n")
241
+ .filter((l) => l.startsWith("- "))
242
+ .map((l) => `<li>${l.slice(2)}</li>`)
243
+ .join("");
244
+ return `<ul>${items}</ul>`;
245
+ });
246
+ // Ordered lists
247
+ result = result.replace(/(?:^\d+\. .+\n?)+/gm, (block) => {
248
+ const items = block
249
+ .split("\n")
250
+ .filter((l) => /^\d+\. /.test(l))
251
+ .map((l) => `<li>${l.replace(/^\d+\. /, "")}</li>`)
252
+ .join("");
253
+ return `<ol>${items}</ol>`;
254
+ });
255
+ // Wrap remaining bare text in <p> tags
256
+ result = result
257
+ .split("\n\n")
258
+ .map((block) => {
259
+ block = block.trim();
260
+ if (!block)
261
+ return "";
262
+ if (/^<(h[1-6]|pre|ul|ol|blockquote|hr|table|div)/.test(block))
263
+ return block;
264
+ if (/^%%(CODEBLOCK|CALLOUT|TABS)_\d+%%$/.test(block))
265
+ return block;
266
+ return `<p>${block}</p>`;
267
+ })
268
+ .join("\n");
269
+ // Restore placeholders
270
+ for (let i = 0; i < codeBlocks.length; i++) {
271
+ result = result.replace(`%%CODEBLOCK_${i}%%`, codeBlocks[i]);
272
+ }
273
+ for (let i = 0; i < calloutBlocks.length; i++) {
274
+ result = result.replace(`%%CALLOUT_${i}%%`, calloutBlocks[i]);
275
+ }
276
+ for (let i = 0; i < tabsBlocks.length; i++) {
277
+ result = result.replace(`%%TABS_${i}%%`, tabsBlocks[i]);
278
+ }
279
+ return result;
280
+ }
281
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Server-side helpers for Astro docs routes.
3
+ *
4
+ * `createDocsServer(config)` returns all the functions needed for
5
+ * a complete docs site: `load` for getting page data, `GET` for search,
6
+ * and `POST` for AI chat.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * // src/lib/docs.server.ts
11
+ * import { createDocsServer } from "@farming-labs/astro/server";
12
+ * import config from "./docs.config";
13
+ *
14
+ * const contentFiles = import.meta.glob("/docs/**\/*.{md,mdx}", {
15
+ * query: "?raw", import: "default", eager: true,
16
+ * }) as Record<string, string>;
17
+ *
18
+ * export const { load, GET, POST } = createDocsServer({
19
+ * ...config,
20
+ * _preloadedContent: contentFiles,
21
+ * });
22
+ * ```
23
+ *
24
+ * ```ts
25
+ * // src/pages/docs/[...slug].astro
26
+ * import { load } from "../../lib/docs.server";
27
+ * const data = await load(Astro.url.pathname);
28
+ * ```
29
+ */
30
+ import { loadDocsNavTree } from "./content.js";
31
+ import type { PageNode } from "./content.js";
32
+ export interface DocsServer {
33
+ load: (pathname: string) => Promise<{
34
+ tree: ReturnType<typeof loadDocsNavTree>;
35
+ flatPages: PageNode[];
36
+ title: string;
37
+ description?: string;
38
+ html: string;
39
+ slug?: string;
40
+ previousPage: PageNode | null;
41
+ nextPage: PageNode | null;
42
+ editOnGithub?: string;
43
+ lastModified: string;
44
+ }>;
45
+ GET: (context: {
46
+ request: Request;
47
+ }) => Response;
48
+ POST: (context: {
49
+ request: Request;
50
+ }) => Promise<Response>;
51
+ }
52
+ /**
53
+ * Create all server-side functions needed for an Astro docs site.
54
+ *
55
+ * @param config - The `DocsConfig` object (from `defineDocs()` in `docs.config.ts`).
56
+ *
57
+ * Pass `_preloadedContent` (from `import.meta.glob`) to bundle markdown files
58
+ * at build time — required for serverless deployments (Vercel, Netlify, etc.)
59
+ * where the filesystem is not available at runtime.
60
+ */
61
+ export declare function createDocsServer(config?: Record<string, any>): DocsServer;
62
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH,OAAO,EAAE,eAAe,EAAmC,MAAM,cAAc,CAAC;AAEhF,OAAO,KAAK,EAAE,QAAQ,EAAiC,MAAM,cAAc,CAAC;AAsB5E,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;QAClC,IAAI,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;QACzC,SAAS,EAAE,QAAQ,EAAE,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,QAAQ,GAAG,IAAI,CAAC;QAC9B,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;QAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IACH,GAAG,EAAE,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,KAAK,QAAQ,CAAC;IACjD,IAAI,EAAE,CAAC,OAAO,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC5D;AAyPD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAC/B,UAAU,CAsUZ"}
package/dist/server.js ADDED
@@ -0,0 +1,499 @@
1
+ /**
2
+ * Server-side helpers for Astro docs routes.
3
+ *
4
+ * `createDocsServer(config)` returns all the functions needed for
5
+ * a complete docs site: `load` for getting page data, `GET` for search,
6
+ * and `POST` for AI chat.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * // src/lib/docs.server.ts
11
+ * import { createDocsServer } from "@farming-labs/astro/server";
12
+ * import config from "./docs.config";
13
+ *
14
+ * const contentFiles = import.meta.glob("/docs/**\/*.{md,mdx}", {
15
+ * query: "?raw", import: "default", eager: true,
16
+ * }) as Record<string, string>;
17
+ *
18
+ * export const { load, GET, POST } = createDocsServer({
19
+ * ...config,
20
+ * _preloadedContent: contentFiles,
21
+ * });
22
+ * ```
23
+ *
24
+ * ```ts
25
+ * // src/pages/docs/[...slug].astro
26
+ * import { load } from "../../lib/docs.server";
27
+ * const data = await load(Astro.url.pathname);
28
+ * ```
29
+ */
30
+ import fs from "node:fs";
31
+ import path from "node:path";
32
+ import matter from "gray-matter";
33
+ import { loadDocsNavTree, loadDocsContent, flattenNavTree } from "./content.js";
34
+ import { renderMarkdown } from "./markdown.js";
35
+ function stripMarkdownText(content) {
36
+ return content
37
+ .replace(/^(import|export)\s.*$/gm, "")
38
+ .replace(/<[^>]+\/>/g, "")
39
+ .replace(/<\/?[A-Z][^>]*>/g, "")
40
+ .replace(/<\/?[a-z][^>]*>/g, "")
41
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1")
42
+ .replace(/!\[([^\]]*)\]\([^)]+\)/g, "$1")
43
+ .replace(/^#{1,6}\s+/gm, "")
44
+ .replace(/(\*{1,3}|_{1,3})(.*?)\1/g, "$2")
45
+ .replace(/```[\s\S]*?```/g, "")
46
+ .replace(/`([^`]+)`/g, "$1")
47
+ .replace(/^>\s+/gm, "")
48
+ .replace(/^[-*_]{3,}\s*$/gm, "")
49
+ .replace(/\n{3,}/g, "\n\n")
50
+ .trim();
51
+ }
52
+ function navTreeFromMap(contentMap, dirPrefix, entry, ordering) {
53
+ const dirs = [];
54
+ for (const key of Object.keys(contentMap)) {
55
+ if (!key.startsWith(dirPrefix))
56
+ continue;
57
+ const rel = key.slice(dirPrefix.length);
58
+ const segments = rel.split("/");
59
+ const fileName = segments.pop();
60
+ const base = fileName.replace(/\.(md|mdx|svx)$/, "");
61
+ if (base !== "page" && base !== "index" && base !== "+page")
62
+ continue;
63
+ const { data } = matter(contentMap[key]);
64
+ const dirParts = segments;
65
+ const slug = dirParts.join("/");
66
+ const url = slug ? `/${entry}/${slug}` : `/${entry}`;
67
+ const fallbackTitle = dirParts.length > 0
68
+ ? dirParts[dirParts.length - 1]
69
+ .replace(/-/g, " ")
70
+ .replace(/\b\w/g, (c) => c.toUpperCase())
71
+ : "Documentation";
72
+ dirs.push({
73
+ parts: dirParts,
74
+ title: data.title ?? fallbackTitle,
75
+ url,
76
+ icon: data.icon,
77
+ order: typeof data.order === "number" ? data.order : Infinity,
78
+ });
79
+ }
80
+ dirs.sort((a, b) => {
81
+ if (a.parts.length !== b.parts.length)
82
+ return a.parts.length - b.parts.length;
83
+ return a.parts.join("/").localeCompare(b.parts.join("/"));
84
+ });
85
+ const children = [];
86
+ const rootInfo = dirs.find((d) => d.parts.length === 0);
87
+ if (rootInfo) {
88
+ children.push({
89
+ type: "page",
90
+ name: rootInfo.title,
91
+ url: rootInfo.url,
92
+ icon: rootInfo.icon,
93
+ });
94
+ }
95
+ function findSlugOrder(parentParts) {
96
+ if (!Array.isArray(ordering))
97
+ return undefined;
98
+ let items = ordering;
99
+ for (const part of parentParts) {
100
+ const found = items.find((i) => i.slug === part);
101
+ if (!found?.children)
102
+ return undefined;
103
+ items = found.children;
104
+ }
105
+ return items;
106
+ }
107
+ function buildLevel(parentParts) {
108
+ const depth = parentParts.length;
109
+ const directChildren = dirs.filter((d) => {
110
+ if (d.parts.length !== depth + 1)
111
+ return false;
112
+ for (let i = 0; i < depth; i++) {
113
+ if (d.parts[i] !== parentParts[i])
114
+ return false;
115
+ }
116
+ return true;
117
+ });
118
+ const slugOrder = findSlugOrder(parentParts);
119
+ if (slugOrder) {
120
+ const slugMap = new Set(slugOrder.map((i) => i.slug));
121
+ const ordered = [];
122
+ for (const item of slugOrder) {
123
+ const match = directChildren.find((d) => d.parts[depth] === item.slug);
124
+ if (match)
125
+ ordered.push(match);
126
+ }
127
+ for (const child of directChildren) {
128
+ if (!slugMap.has(child.parts[depth]))
129
+ ordered.push(child);
130
+ }
131
+ const nodes = [];
132
+ for (const child of ordered) {
133
+ const hasGrandChildren = dirs.some((d) => {
134
+ if (d.parts.length <= child.parts.length)
135
+ return false;
136
+ return child.parts.every((p, i) => d.parts[i] === p);
137
+ });
138
+ if (hasGrandChildren) {
139
+ nodes.push({
140
+ type: "folder",
141
+ name: child.title,
142
+ icon: child.icon,
143
+ index: { type: "page", name: child.title, url: child.url, icon: child.icon },
144
+ children: buildLevel(child.parts),
145
+ });
146
+ }
147
+ else {
148
+ nodes.push({ type: "page", name: child.title, url: child.url, icon: child.icon });
149
+ }
150
+ }
151
+ return nodes;
152
+ }
153
+ if (ordering === "numeric") {
154
+ directChildren.sort((a, b) => {
155
+ if (a.order === b.order)
156
+ return 0;
157
+ return a.order - b.order;
158
+ });
159
+ }
160
+ const nodes = [];
161
+ for (const child of directChildren) {
162
+ const hasGrandChildren = dirs.some((d) => {
163
+ if (d.parts.length <= child.parts.length)
164
+ return false;
165
+ return child.parts.every((p, i) => d.parts[i] === p);
166
+ });
167
+ if (hasGrandChildren) {
168
+ nodes.push({
169
+ type: "folder",
170
+ name: child.title,
171
+ icon: child.icon,
172
+ index: {
173
+ type: "page",
174
+ name: child.title,
175
+ url: child.url,
176
+ icon: child.icon,
177
+ },
178
+ children: buildLevel(child.parts),
179
+ });
180
+ }
181
+ else {
182
+ nodes.push({
183
+ type: "page",
184
+ name: child.title,
185
+ url: child.url,
186
+ icon: child.icon,
187
+ });
188
+ }
189
+ }
190
+ return nodes;
191
+ }
192
+ children.push(...buildLevel([]));
193
+ return { name: "Docs", children };
194
+ }
195
+ function searchIndexFromMap(contentMap, dirPrefix, entry) {
196
+ const pages = [];
197
+ for (const [key, raw] of Object.entries(contentMap)) {
198
+ if (!key.startsWith(dirPrefix))
199
+ continue;
200
+ const rel = key.slice(dirPrefix.length);
201
+ const segments = rel.split("/");
202
+ const fileName = segments.pop();
203
+ const base = fileName.replace(/\.(md|mdx|svx)$/, "");
204
+ const isIdx = base === "page" || base === "index" || base === "+page";
205
+ const slug = isIdx ? segments.join("/") : [...segments, base].join("/");
206
+ const url = slug ? `/${entry}/${slug}` : `/${entry}`;
207
+ const { data, content } = matter(raw);
208
+ const title = data.title ??
209
+ base.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
210
+ pages.push({
211
+ slug,
212
+ url,
213
+ title,
214
+ description: data.description,
215
+ icon: data.icon,
216
+ content: stripMarkdownText(content),
217
+ rawContent: content,
218
+ });
219
+ }
220
+ return pages;
221
+ }
222
+ function findPageInMap(contentMap, dirPrefix, slug) {
223
+ const isIndex = slug === "";
224
+ const candidates = isIndex
225
+ ? ["page.md", "page.mdx", "index.md"]
226
+ : [
227
+ `${slug}/page.md`,
228
+ `${slug}/page.mdx`,
229
+ `${slug}/index.md`,
230
+ `${slug}/index.svx`,
231
+ `${slug}.md`,
232
+ `${slug}.svx`,
233
+ ];
234
+ for (const candidate of candidates) {
235
+ const key = `${dirPrefix}${candidate}`;
236
+ if (key in contentMap) {
237
+ return { raw: contentMap[key], relPath: candidate };
238
+ }
239
+ }
240
+ return null;
241
+ }
242
+ /**
243
+ * Create all server-side functions needed for an Astro docs site.
244
+ *
245
+ * @param config - The `DocsConfig` object (from `defineDocs()` in `docs.config.ts`).
246
+ *
247
+ * Pass `_preloadedContent` (from `import.meta.glob`) to bundle markdown files
248
+ * at build time — required for serverless deployments (Vercel, Netlify, etc.)
249
+ * where the filesystem is not available at runtime.
250
+ */
251
+ export function createDocsServer(config = {}) {
252
+ const entry = config.entry ?? "docs";
253
+ const githubRaw = config.github;
254
+ const github = typeof githubRaw === "string"
255
+ ? { url: githubRaw }
256
+ : githubRaw ?? null;
257
+ const githubRepo = github?.url;
258
+ const githubBranch = github?.branch ?? "main";
259
+ const githubContentPath = github?.directory;
260
+ const contentDir = path.resolve(config.contentDir ?? entry);
261
+ const preloaded = config._preloadedContent;
262
+ const contentDirRel = config.contentDir ?? entry;
263
+ const dirPrefix = `/${contentDirRel}/`;
264
+ const ordering = config.ordering;
265
+ const aiConfig = config.ai ?? {};
266
+ if (config.apiKey && !aiConfig.apiKey) {
267
+ aiConfig.apiKey = config.apiKey;
268
+ }
269
+ // ─── Unified load (tree + page content in one call) ────────
270
+ async function load(pathname) {
271
+ const tree = preloaded
272
+ ? navTreeFromMap(preloaded, dirPrefix, entry, ordering)
273
+ : loadDocsNavTree(contentDir, entry, ordering);
274
+ const flatPages = flattenNavTree(tree);
275
+ const urlPrefix = new RegExp(`^/${entry}/?`);
276
+ const slug = pathname.replace(urlPrefix, "");
277
+ const isIndex = slug === "";
278
+ let raw;
279
+ let relPath;
280
+ let lastModified;
281
+ if (preloaded) {
282
+ const result = findPageInMap(preloaded, dirPrefix, slug);
283
+ if (!result) {
284
+ const err = new Error(`Page not found: /${entry}/${slug}`);
285
+ err.status = 404;
286
+ throw err;
287
+ }
288
+ raw = result.raw;
289
+ relPath = result.relPath;
290
+ lastModified = new Date().toLocaleDateString("en-US", {
291
+ year: "numeric",
292
+ month: "long",
293
+ day: "numeric",
294
+ });
295
+ }
296
+ else {
297
+ let filePath = null;
298
+ relPath = "";
299
+ if (isIndex) {
300
+ for (const name of ["page.md", "page.mdx", "index.md"]) {
301
+ const candidate = path.join(contentDir, name);
302
+ if (fs.existsSync(candidate)) {
303
+ filePath = candidate;
304
+ relPath = name;
305
+ break;
306
+ }
307
+ }
308
+ }
309
+ else {
310
+ const candidates = [
311
+ path.join(contentDir, slug, "page.md"),
312
+ path.join(contentDir, slug, "page.mdx"),
313
+ path.join(contentDir, slug, "index.md"),
314
+ path.join(contentDir, slug, "index.svx"),
315
+ path.join(contentDir, `${slug}.md`),
316
+ path.join(contentDir, `${slug}.svx`),
317
+ ];
318
+ for (const candidate of candidates) {
319
+ if (fs.existsSync(candidate)) {
320
+ filePath = candidate;
321
+ relPath = path.relative(contentDir, candidate);
322
+ break;
323
+ }
324
+ }
325
+ }
326
+ if (!filePath) {
327
+ const err = new Error(`Page not found: /${entry}/${slug}`);
328
+ err.status = 404;
329
+ throw err;
330
+ }
331
+ raw = fs.readFileSync(filePath, "utf-8");
332
+ const stat = fs.statSync(filePath);
333
+ lastModified = stat.mtime.toLocaleDateString("en-US", {
334
+ year: "numeric",
335
+ month: "long",
336
+ day: "numeric",
337
+ });
338
+ }
339
+ const { data, content } = matter(raw);
340
+ const html = await renderMarkdown(content);
341
+ const currentUrl = isIndex ? `/${entry}` : `/${entry}/${slug}`;
342
+ const currentIndex = flatPages.findIndex((p) => p.url === currentUrl);
343
+ const previousPage = currentIndex > 0 ? flatPages[currentIndex - 1] : null;
344
+ const nextPage = currentIndex < flatPages.length - 1 ? flatPages[currentIndex + 1] : null;
345
+ let editOnGithub;
346
+ if (githubRepo && githubContentPath) {
347
+ editOnGithub = `${githubRepo}/blob/${githubBranch}/${githubContentPath}/${relPath}`;
348
+ }
349
+ const fallbackTitle = isIndex
350
+ ? "Documentation"
351
+ : slug.split("/").pop()?.replace(/-/g, " ") ?? "Documentation";
352
+ return {
353
+ tree,
354
+ flatPages,
355
+ title: data.title ?? fallbackTitle,
356
+ description: data.description,
357
+ html,
358
+ ...(isIndex ? {} : { slug }),
359
+ previousPage,
360
+ nextPage,
361
+ editOnGithub,
362
+ lastModified,
363
+ };
364
+ }
365
+ // ─── Search index ──────────────────────────────────────────
366
+ let searchIndex = null;
367
+ function getSearchIndex() {
368
+ if (!searchIndex) {
369
+ searchIndex = preloaded
370
+ ? searchIndexFromMap(preloaded, dirPrefix, entry)
371
+ : loadDocsContent(contentDir, entry);
372
+ }
373
+ return searchIndex;
374
+ }
375
+ function searchByQuery(query) {
376
+ const index = getSearchIndex();
377
+ return index
378
+ .map((page) => {
379
+ const titleMatch = page.title.toLowerCase().includes(query) ? 10 : 0;
380
+ const words = query.split(/\s+/);
381
+ const contentMatch = words.reduce((score, word) => {
382
+ return score + (page.content.toLowerCase().includes(word) ? 1 : 0);
383
+ }, 0);
384
+ return { ...page, score: titleMatch + contentMatch };
385
+ })
386
+ .filter((r) => r.score > 0)
387
+ .sort((a, b) => b.score - a.score);
388
+ }
389
+ // ─── GET /api/docs?query=… — full-text search ────────────
390
+ function GET(context) {
391
+ const url = new URL(context.request.url);
392
+ const query = url.searchParams.get("query")?.toLowerCase().trim();
393
+ if (!query) {
394
+ return new Response(JSON.stringify([]), {
395
+ headers: { "Content-Type": "application/json" },
396
+ });
397
+ }
398
+ const results = searchByQuery(query)
399
+ .slice(0, 10)
400
+ .map(({ title, url, description }) => ({
401
+ content: title,
402
+ url,
403
+ description,
404
+ }));
405
+ return new Response(JSON.stringify(results), {
406
+ headers: { "Content-Type": "application/json" },
407
+ });
408
+ }
409
+ // ─── POST /api/docs — AI chat with RAG ────────────────────
410
+ const projectName = (typeof config.nav?.title === "string"
411
+ ? config.nav.title
412
+ : null);
413
+ const packageName = aiConfig.packageName;
414
+ const docsUrl = aiConfig.docsUrl;
415
+ function buildDefaultSystemPrompt() {
416
+ const lines = [
417
+ `You are a helpful documentation assistant${projectName ? ` for ${projectName}` : ""}.`,
418
+ "Answer questions based on the provided documentation context.",
419
+ "Be concise and accurate. If the answer is not in the context, say so honestly.",
420
+ "Use markdown formatting for code examples and links.",
421
+ ];
422
+ if (packageName) {
423
+ lines.push(`When showing import examples, always use "${packageName}" as the package name.`);
424
+ }
425
+ if (docsUrl) {
426
+ lines.push(`When linking to documentation pages, use "${docsUrl}" as the base URL (e.g. ${docsUrl}/docs/get-started).`);
427
+ }
428
+ return lines.join(" ");
429
+ }
430
+ const DEFAULT_SYSTEM_PROMPT = buildDefaultSystemPrompt();
431
+ async function POST(context) {
432
+ if (!aiConfig.enabled) {
433
+ return new Response(JSON.stringify({
434
+ error: "AI is not enabled. Set `ai: { enabled: true }` in your docs config to enable it.",
435
+ }), { status: 404, headers: { "Content-Type": "application/json" } });
436
+ }
437
+ const resolvedKey = aiConfig.apiKey ??
438
+ (typeof import.meta !== "undefined" ? import.meta.env?.OPENAI_API_KEY : undefined) ??
439
+ (typeof process !== "undefined" ? process.env?.OPENAI_API_KEY : undefined);
440
+ if (!resolvedKey) {
441
+ return new Response(JSON.stringify({
442
+ error: "AI is enabled but no API key was found. Set `apiKey` in your docs config `ai` section or add OPENAI_API_KEY to your environment.",
443
+ }), { status: 500, headers: { "Content-Type": "application/json" } });
444
+ }
445
+ let body;
446
+ try {
447
+ body = await context.request.json();
448
+ }
449
+ catch {
450
+ return new Response(JSON.stringify({ error: "Invalid JSON body. Expected { messages: [...] }" }), { status: 400, headers: { "Content-Type": "application/json" } });
451
+ }
452
+ const messages = body.messages;
453
+ if (!Array.isArray(messages) || messages.length === 0) {
454
+ return new Response(JSON.stringify({ error: "messages array is required and must not be empty." }), { status: 400, headers: { "Content-Type": "application/json" } });
455
+ }
456
+ const lastUserMessage = [...messages].reverse().find((m) => m.role === "user");
457
+ if (!lastUserMessage) {
458
+ return new Response(JSON.stringify({ error: "At least one user message is required." }), { status: 400, headers: { "Content-Type": "application/json" } });
459
+ }
460
+ const maxResults = aiConfig.maxResults ?? 5;
461
+ const scored = searchByQuery(lastUserMessage.content.toLowerCase()).slice(0, maxResults);
462
+ const contextParts = scored.map((doc) => `## ${doc.title}\nURL: ${doc.url}\n${doc.description ? `Description: ${doc.description}\n` : ""}\n${doc.content}`);
463
+ const ragContext = contextParts.join("\n\n---\n\n");
464
+ const systemPrompt = aiConfig.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;
465
+ const systemMessage = {
466
+ role: "system",
467
+ content: ragContext
468
+ ? `${systemPrompt}\n\n---\n\nDocumentation context:\n\n${ragContext}`
469
+ : systemPrompt,
470
+ };
471
+ const llmMessages = [
472
+ systemMessage,
473
+ ...messages.filter((m) => m.role !== "system"),
474
+ ];
475
+ const baseUrl = (aiConfig.baseUrl ?? "https://api.openai.com/v1").replace(/\/$/, "");
476
+ const model = aiConfig.model ?? "gpt-4o-mini";
477
+ const llmResponse = await fetch(`${baseUrl}/chat/completions`, {
478
+ method: "POST",
479
+ headers: {
480
+ "Content-Type": "application/json",
481
+ Authorization: `Bearer ${resolvedKey}`,
482
+ },
483
+ body: JSON.stringify({ model, stream: true, messages: llmMessages }),
484
+ });
485
+ if (!llmResponse.ok) {
486
+ const errText = await llmResponse.text().catch(() => "Unknown error");
487
+ return new Response(JSON.stringify({ error: `LLM API error (${llmResponse.status}): ${errText}` }), { status: 502, headers: { "Content-Type": "application/json" } });
488
+ }
489
+ return new Response(llmResponse.body, {
490
+ headers: {
491
+ "Content-Type": "text/event-stream",
492
+ "Cache-Control": "no-cache",
493
+ Connection: "keep-alive",
494
+ },
495
+ });
496
+ }
497
+ return { load, GET, POST };
498
+ }
499
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@farming-labs/astro",
3
+ "version": "0.0.2-beta.15",
4
+ "description": "Astro adapter for @farming-labs/docs — content loading and navigation utilities",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./content": {
15
+ "types": "./dist/content.d.ts",
16
+ "import": "./dist/content.js",
17
+ "default": "./dist/content.js"
18
+ },
19
+ "./markdown": {
20
+ "types": "./dist/markdown.d.ts",
21
+ "import": "./dist/markdown.js",
22
+ "default": "./dist/markdown.js"
23
+ },
24
+ "./server": {
25
+ "types": "./dist/server.d.ts",
26
+ "import": "./dist/server.js",
27
+ "default": "./dist/server.js"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist"
32
+ ],
33
+ "keywords": [
34
+ "docs",
35
+ "astro",
36
+ "documentation"
37
+ ],
38
+ "author": "Farming Labs",
39
+ "license": "MIT",
40
+ "dependencies": {
41
+ "gray-matter": "^4.0.3",
42
+ "shiki": "^3.2.1"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^22.10.0",
46
+ "typescript": "^5.9.3",
47
+ "@farming-labs/docs": "0.0.2-beta.15"
48
+ },
49
+ "peerDependencies": {
50
+ "@farming-labs/docs": "*"
51
+ },
52
+ "scripts": {
53
+ "build": "tsc",
54
+ "dev": "tsc --watch",
55
+ "typecheck": "tsc --noEmit"
56
+ }
57
+ }