@dogsbay/format-astro 0.2.0-beta.0

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,288 @@
1
+ import { DEFAULT_BASE_PATH } from "./base-path.js";
2
+ const EXTERNAL_HREF_RE = /^(?:https?:\/\/|mailto:|tel:|#)/i;
3
+ const DEFAULT_DESCRIPTION_LIMIT = 160;
4
+ const DEFAULT_TOP_LEVEL_LABEL = "Documentation";
5
+ // ── Public builders ─────────────────────────────────────────────
6
+ /**
7
+ * Build the top-level llms.txt index for a site.
8
+ *
9
+ * Layout:
10
+ * - One `## {label}` section per top-level nav group with children.
11
+ * - Top-level leaf nav items collected into a single
12
+ * `## {topLevelLabel}` block at the end.
13
+ * - External hrefs and pages not in nav are skipped.
14
+ */
15
+ export function buildLlmsTxt(siteConfig, nav, pages, options = {}) {
16
+ const hrefPrefix = options.hrefPrefix ?? DEFAULT_BASE_PATH;
17
+ const siteUrl = options.siteUrl ?? siteConfig.siteUrl;
18
+ const descLimit = options.descriptionLimit ?? DEFAULT_DESCRIPTION_LIMIT;
19
+ const topLevelLabel = options.topLevelLabel ?? DEFAULT_TOP_LEVEL_LABEL;
20
+ const slugIndex = indexPagesBySlug(pages);
21
+ const out = [];
22
+ out.push(`# ${siteConfig.siteName}`);
23
+ out.push("");
24
+ if (siteConfig.description) {
25
+ out.push(`> ${siteConfig.description}`);
26
+ out.push("");
27
+ }
28
+ const topLevelLeaves = [];
29
+ const groupSections = [];
30
+ for (const item of nav) {
31
+ if (item.children && item.children.length > 0) {
32
+ const lines = [];
33
+ lines.push(`## ${item.label}`);
34
+ lines.push("");
35
+ // Group's own landing page first, if it has one
36
+ if (item.href && !EXTERNAL_HREF_RE.test(item.href)) {
37
+ const entry = renderEntry(item, slugIndex, hrefPrefix, siteUrl, descLimit);
38
+ if (entry)
39
+ lines.push(entry);
40
+ }
41
+ collectEntries(item.children, slugIndex, hrefPrefix, siteUrl, descLimit, lines);
42
+ lines.push("");
43
+ groupSections.push(lines);
44
+ }
45
+ else if (item.href && !EXTERNAL_HREF_RE.test(item.href)) {
46
+ topLevelLeaves.push(item);
47
+ }
48
+ }
49
+ if (topLevelLeaves.length > 0) {
50
+ out.push(`## ${topLevelLabel}`);
51
+ out.push("");
52
+ for (const leaf of topLevelLeaves) {
53
+ const entry = renderEntry(leaf, slugIndex, hrefPrefix, siteUrl, descLimit);
54
+ if (entry)
55
+ out.push(entry);
56
+ }
57
+ out.push("");
58
+ }
59
+ for (const section of groupSections) {
60
+ out.push(...section);
61
+ }
62
+ return out.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd() + "\n";
63
+ }
64
+ /**
65
+ * Per-section llms.txt — same shape as the root index, scoped to one
66
+ * top-level nav group. Useful for `/docs/{section}/llms.txt` so agents
67
+ * can pull only the section they care about.
68
+ */
69
+ export function buildSectionLlmsTxt(siteConfig, group, pages, options = {}) {
70
+ const hrefPrefix = options.hrefPrefix ?? DEFAULT_BASE_PATH;
71
+ const siteUrl = options.siteUrl ?? siteConfig.siteUrl;
72
+ const descLimit = options.descriptionLimit ?? DEFAULT_DESCRIPTION_LIMIT;
73
+ const slugIndex = indexPagesBySlug(pages);
74
+ const out = [];
75
+ out.push(`# ${siteConfig.siteName} — ${group.label}`);
76
+ out.push("");
77
+ out.push(`## ${group.label}`);
78
+ out.push("");
79
+ if (group.href && !EXTERNAL_HREF_RE.test(group.href)) {
80
+ const entry = renderEntry(group, slugIndex, hrefPrefix, siteUrl, descLimit);
81
+ if (entry)
82
+ out.push(entry);
83
+ }
84
+ if (group.children) {
85
+ collectEntries(group.children, slugIndex, hrefPrefix, siteUrl, descLimit, out);
86
+ }
87
+ return out.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd() + "\n";
88
+ }
89
+ /**
90
+ * Bundle every page reachable from `nav` into a single document, in
91
+ * nav order. Each page is delimited by a `# Title` header and `URL:`
92
+ * line, then either the full body (default) or just a description.
93
+ */
94
+ export function buildLlmsFullTxt(siteConfig, nav, pages, options = {}) {
95
+ const hrefPrefix = options.hrefPrefix ?? DEFAULT_BASE_PATH;
96
+ const siteUrl = options.siteUrl ?? siteConfig.siteUrl;
97
+ const summary = options.summary ?? (options.serializePage ? "body" : "description");
98
+ if (summary === "body" && !options.serializePage) {
99
+ throw new Error(`buildLlmsFullTxt: summary "body" requires options.serializePage`);
100
+ }
101
+ const slugIndex = indexPagesBySlug(pages);
102
+ const navOrder = flattenNavToSlugs(nav, hrefPrefix);
103
+ const out = [];
104
+ out.push(`# ${siteConfig.siteName}`);
105
+ out.push("");
106
+ if (siteConfig.description) {
107
+ out.push(`> ${siteConfig.description}`);
108
+ out.push("");
109
+ }
110
+ let firstPage = true;
111
+ for (const slug of navOrder) {
112
+ const page = slugIndex.get(slug);
113
+ if (!page)
114
+ continue;
115
+ if (!firstPage) {
116
+ out.push("---");
117
+ out.push("");
118
+ }
119
+ firstPage = false;
120
+ out.push(`# ${page.title}`);
121
+ out.push("");
122
+ out.push(`URL: ${absoluteUrl(slugToHref(slug, hrefPrefix), siteUrl)}`);
123
+ out.push("");
124
+ if (summary === "body") {
125
+ out.push(options.serializePage(page).trimEnd());
126
+ }
127
+ else {
128
+ const desc = getPageDescription(page, options.descriptionLimit ?? DEFAULT_DESCRIPTION_LIMIT);
129
+ out.push(desc || page.title);
130
+ }
131
+ out.push("");
132
+ }
133
+ return out.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd() + "\n";
134
+ }
135
+ // ── Internals: nav walking + entry rendering ────────────────────
136
+ function collectEntries(items, slugIndex, hrefPrefix, siteUrl, descLimit, out) {
137
+ for (const item of items) {
138
+ if (item.href && !EXTERNAL_HREF_RE.test(item.href)) {
139
+ const entry = renderEntry(item, slugIndex, hrefPrefix, siteUrl, descLimit);
140
+ if (entry)
141
+ out.push(entry);
142
+ }
143
+ if (item.children) {
144
+ collectEntries(item.children, slugIndex, hrefPrefix, siteUrl, descLimit, out);
145
+ }
146
+ }
147
+ }
148
+ function renderEntry(item, slugIndex, hrefPrefix, siteUrl, descLimit) {
149
+ if (!item.href)
150
+ return null;
151
+ const slug = hrefToSlug(item.href, hrefPrefix);
152
+ if (slug === null)
153
+ return null;
154
+ const page = slugIndex.get(slug);
155
+ const label = item.label || page?.title || slug;
156
+ const description = page ? getPageDescription(page, descLimit) : "";
157
+ const url = absoluteUrl(`${item.href.replace(/\/$/, "")}.md`, siteUrl);
158
+ return description
159
+ ? `- [${label}](${url}): ${description}`
160
+ : `- [${label}](${url})`;
161
+ }
162
+ function flattenNavToSlugs(nav, hrefPrefix) {
163
+ const slugs = [];
164
+ const seen = new Set();
165
+ const walk = (items) => {
166
+ for (const item of items) {
167
+ if (item.href && !EXTERNAL_HREF_RE.test(item.href)) {
168
+ const slug = hrefToSlug(item.href, hrefPrefix);
169
+ if (slug !== null && !seen.has(slug)) {
170
+ seen.add(slug);
171
+ slugs.push(slug);
172
+ }
173
+ }
174
+ if (item.children)
175
+ walk(item.children);
176
+ }
177
+ };
178
+ walk(nav);
179
+ return slugs;
180
+ }
181
+ // ── Internals: page lookup + URL math ───────────────────────────
182
+ function indexPagesBySlug(pages) {
183
+ const map = new Map();
184
+ for (const page of pages) {
185
+ map.set(page.slug || "index", page);
186
+ }
187
+ return map;
188
+ }
189
+ function hrefToSlug(href, hrefPrefix) {
190
+ if (EXTERNAL_HREF_RE.test(href))
191
+ return null;
192
+ const prefix = hrefPrefix.endsWith("/") ? hrefPrefix.slice(0, -1) : hrefPrefix;
193
+ if (href !== prefix && !href.startsWith(`${prefix}/`))
194
+ return null;
195
+ let slug = href.slice(prefix.length).replace(/^\//, "").replace(/\/$/, "");
196
+ return slug === "" ? "index" : slug;
197
+ }
198
+ function slugToHref(slug, hrefPrefix) {
199
+ const prefix = hrefPrefix.endsWith("/") ? hrefPrefix.slice(0, -1) : hrefPrefix;
200
+ if (slug === "" || slug === "index")
201
+ return `${prefix}.md`;
202
+ return `${prefix}/${slug}.md`;
203
+ }
204
+ function absoluteUrl(path, siteUrl) {
205
+ if (!siteUrl)
206
+ return path;
207
+ const base = siteUrl.replace(/\/$/, "");
208
+ return path.startsWith("/") ? `${base}${path}` : `${base}/${path}`;
209
+ }
210
+ // ── Internals: description + plain-text extraction ──────────────
211
+ function getPageDescription(page, limit) {
212
+ const fmDesc = page.frontmatter?.["description"];
213
+ if (typeof fmDesc === "string" && fmDesc.trim()) {
214
+ return truncate(fmDesc.trim(), limit);
215
+ }
216
+ const firstPara = extractFirstParagraph(page.tree);
217
+ return firstPara ? truncate(firstPara, limit) : "";
218
+ }
219
+ /**
220
+ * Extract plain text of the first paragraph in a page tree. Cross-shape
221
+ * tolerant: handles `node.inline` (dogsbay-md parser) and
222
+ * `node.children[{type: "prose", inline}]` (Starlight importer).
223
+ */
224
+ export function extractFirstParagraph(tree) {
225
+ for (const node of tree) {
226
+ if (node.type !== "paragraph")
227
+ continue;
228
+ const inline = node.inline ?? findProseInline(node.children);
229
+ if (inline)
230
+ return inlineToPlainText(inline).trim();
231
+ }
232
+ return "";
233
+ }
234
+ function findProseInline(children) {
235
+ if (!children)
236
+ return undefined;
237
+ for (const child of children) {
238
+ if (child.type === "prose" && child.inline)
239
+ return child.inline;
240
+ }
241
+ return undefined;
242
+ }
243
+ function inlineToPlainText(inline) {
244
+ let out = "";
245
+ for (const node of inline) {
246
+ switch (node.type) {
247
+ case "text":
248
+ out += node.text;
249
+ break;
250
+ case "code":
251
+ out += node.text;
252
+ break;
253
+ case "link":
254
+ case "highlight":
255
+ out += inlineToPlainText(node.children);
256
+ break;
257
+ case "kbd":
258
+ out += node.keys.join("+");
259
+ break;
260
+ case "math":
261
+ out += node.latex;
262
+ break;
263
+ case "image":
264
+ if (node.alt)
265
+ out += node.alt;
266
+ break;
267
+ case "break":
268
+ out += " ";
269
+ break;
270
+ case "html-inline":
271
+ case "footnote-ref":
272
+ case "icon":
273
+ // No useful plain text; skip.
274
+ break;
275
+ }
276
+ }
277
+ return out;
278
+ }
279
+ function truncate(text, limit) {
280
+ const collapsed = text.replace(/\s+/g, " ").trim();
281
+ if (collapsed.length <= limit)
282
+ return collapsed;
283
+ const slice = collapsed.slice(0, limit);
284
+ const lastSpace = slice.lastIndexOf(" ");
285
+ const cut = lastSpace > limit * 0.5 ? slice.slice(0, lastSpace) : slice;
286
+ return `${cut.trimEnd()}…`;
287
+ }
288
+ //# sourceMappingURL=llms-txt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llms-txt.js","sourceRoot":"","sources":["../src/llms-txt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export interface PluginClientModulesGroup {
2
+ pluginId: string;
3
+ paths: string[];
4
+ }
5
+ export interface PluginStylesGroup {
6
+ pluginId: string;
7
+ paths: string[];
8
+ }
9
+ export interface PluginClientConfig {
10
+ pluginId: string;
11
+ value: unknown;
12
+ }
13
+ export interface PluginWrapperEntry {
14
+ pluginId: string;
15
+ /** Slot name (e.g. "MarkdownContent"). */
16
+ slot: string;
17
+ /** Absolute path to the wrapper .astro component. */
18
+ path: string;
19
+ }
20
+ export interface EmitPluginRuntimeOptions {
21
+ /** Absolute path of the generated Astro project. */
22
+ outputDir: string;
23
+ /** clientModules contributions, in plugin order. */
24
+ clientModules: PluginClientModulesGroup[];
25
+ /** styles contributions, in plugin order. */
26
+ styles: PluginStylesGroup[];
27
+ /** defineClientConfig contributions. */
28
+ clientConfigs: PluginClientConfig[];
29
+ /** componentWrappers contributions, in plugin order. */
30
+ componentWrappers?: PluginWrapperEntry[];
31
+ }
32
+ /**
33
+ * Emit the plugin-runtime artefacts. Safe to call when there are
34
+ * no plugins — every emitted file is shaped to compile and behave
35
+ * as a no-op when no plugin contributes that surface.
36
+ */
37
+ export declare function emitPluginRuntime(options: EmitPluginRuntimeOptions): void;
38
+ /** Test-only: clear emitted plugin runtime files. */
39
+ export declare function _clearPluginRuntime(outputDir: string): void;
40
+ //# sourceMappingURL=plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../src/plugins.ts"],"names":[],"mappings":"AA0CA,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,aAAa,EAAE,wBAAwB,EAAE,CAAC;IAC1C,6CAA6C;IAC7C,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,wCAAwC;IACxC,aAAa,EAAE,kBAAkB,EAAE,CAAC;IACpC,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC1C;AAsBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAMzE;AA4RD,qDAAqD;AACrD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAM3D"}