neoorm 0.7.0 → 0.7.2

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.
Files changed (38) hide show
  1. package/dist/docs/render.d.ts.map +1 -1
  2. package/dist/docs/render.js +316 -43
  3. package/dist/docs/render.js.map +1 -1
  4. package/dist/docs/search.d.ts +17 -0
  5. package/dist/docs/search.d.ts.map +1 -0
  6. package/dist/docs/search.js +191 -0
  7. package/dist/docs/search.js.map +1 -0
  8. package/dist/docs/server.d.ts +4 -0
  9. package/dist/docs/server.d.ts.map +1 -1
  10. package/dist/docs/server.js +15 -2
  11. package/dist/docs/server.js.map +1 -1
  12. package/dist/runtime/query/compile.d.ts +7 -5
  13. package/dist/runtime/query/compile.d.ts.map +1 -1
  14. package/dist/runtime/query/compile.js +39 -70
  15. package/dist/runtime/query/compile.js.map +1 -1
  16. package/dist/runtime/query/find.d.ts +3 -0
  17. package/dist/runtime/query/find.d.ts.map +1 -1
  18. package/dist/runtime/query/find.js +23 -13
  19. package/dist/runtime/query/find.js.map +1 -1
  20. package/dist/runtime/query/projection.d.ts +3 -1
  21. package/dist/runtime/query/projection.d.ts.map +1 -1
  22. package/dist/runtime/query/projection.js +21 -8
  23. package/dist/runtime/query/projection.js.map +1 -1
  24. package/dist/runtime/query/relation-planner.d.ts +1 -0
  25. package/dist/runtime/query/relation-planner.d.ts.map +1 -1
  26. package/dist/runtime/query/relation-planner.js +7 -8
  27. package/dist/runtime/query/relation-planner.js.map +1 -1
  28. package/dist/runtime/types.d.ts +14 -4
  29. package/dist/runtime/types.d.ts.map +1 -1
  30. package/dist/schema/relation-types.d.ts +17 -9
  31. package/dist/schema/relation-types.d.ts.map +1 -1
  32. package/dist/schema/types.d.ts +4 -0
  33. package/dist/schema/types.d.ts.map +1 -1
  34. package/docs/cli.md +2 -0
  35. package/docs/examples.md +4 -3
  36. package/docs/queries.md +26 -11
  37. package/docs/schema.md +1 -1
  38. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/docs/render.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAa3C,wBAAsB,cAAc,CACnC,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,QAAQ,EAAE,EACf,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAuCjB;AAED,wBAAgB,eAAe,CAC9B,GAAG,EAAE,QAAQ,EAAE,EACf,OAAO,EAAE,MAAM,GACb,MAAM,CA0CR"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/docs/render.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAwE3C,wBAAsB,cAAc,CACnC,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,QAAQ,EAAE,EACf,OAAO,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAgBjB;AAED,wBAAgB,eAAe,CAC9B,GAAG,EAAE,QAAQ,EAAE,EACf,OAAO,EAAE,MAAM,GACb,MAAM,CAoBR"}
@@ -8,42 +8,64 @@ function rewriteMarkdownLinks(html) {
8
8
  return `href="/docs/${slug}${hash}"`;
9
9
  });
10
10
  }
11
- export async function renderDocsPage(page, nav, version) {
12
- const markdown = await readFile(page.sourcePath, "utf-8");
13
- const body = rewriteMarkdownLinks(await marked.parse(markdown, {
14
- gfm: true,
15
- breaks: false,
16
- }));
17
- const navItems = nav
11
+ function renderNavItems(nav, activeSlug) {
12
+ return nav
18
13
  .map((item) => {
19
- const active = item.slug === page.slug ? " active" : "";
14
+ const active = item.slug === activeSlug ? " active" : "";
20
15
  return `<a class="nav-link${active}" href="/docs/${item.slug}">${escapeHtml(item.title)}</a>`;
21
16
  })
22
17
  .join("\n");
18
+ }
19
+ function renderSidebar(nav, version, activeSlug) {
20
+ return `<aside class="sidebar">
21
+ <div class="brand">
22
+ <a href="/">NeoOrm</a>
23
+ <span class="version">v${escapeHtml(version)}</span>
24
+ </div>
25
+ <div class="search">
26
+ <input
27
+ type="search"
28
+ id="docs-search"
29
+ placeholder="Search docs…"
30
+ autocomplete="off"
31
+ spellcheck="false"
32
+ aria-label="Search documentation"
33
+ aria-controls="docs-search-results"
34
+ aria-expanded="false"
35
+ />
36
+ <div id="docs-search-results" class="search-results" hidden></div>
37
+ </div>
38
+ <nav class="nav">${renderNavItems(nav, activeSlug)}</nav>
39
+ </aside>`;
40
+ }
41
+ function renderDocsShell(title, version, nav, mainHtml, activeSlug) {
23
42
  return `<!doctype html>
24
43
  <html lang="en">
25
44
  <head>
26
45
  <meta charset="utf-8" />
27
46
  <meta name="viewport" content="width=device-width, initial-scale=1" />
28
- <title>${escapeHtml(page.title)} · NeoOrm</title>
47
+ <title>${escapeHtml(title)}</title>
29
48
  <style>${DOCS_CSS}</style>
30
49
  </head>
31
50
  <body>
32
51
  <div class="layout">
33
- <aside class="sidebar">
34
- <div class="brand">
35
- <a href="/">NeoOrm</a>
36
- <span class="version">v${escapeHtml(version)}</span>
37
- </div>
38
- <nav class="nav">${navItems}</nav>
39
- </aside>
52
+ ${renderSidebar(nav, version, activeSlug)}
40
53
  <main class="content">
41
- <article class="markdown-body">${body}</article>
54
+ ${mainHtml}
42
55
  </main>
43
56
  </div>
57
+ <script>${DOCS_SEARCH_SCRIPT}</script>
44
58
  </body>
45
59
  </html>`;
46
60
  }
61
+ export async function renderDocsPage(page, nav, version) {
62
+ const markdown = await readFile(page.sourcePath, "utf-8");
63
+ const body = rewriteMarkdownLinks(await marked.parse(markdown, {
64
+ gfm: true,
65
+ breaks: false,
66
+ }));
67
+ return renderDocsShell(`${page.title} · NeoOrm`, version, nav, `<article class="markdown-body">${body}</article>`, page.slug);
68
+ }
47
69
  export function renderDocsIndex(nav, version) {
48
70
  const cards = nav
49
71
  .map((page) => `<a class="card" href="/docs/${page.slug}">
@@ -51,35 +73,11 @@ export function renderDocsIndex(nav, version) {
51
73
  <p>${escapeHtml(page.slug)}.md</p>
52
74
  </a>`)
53
75
  .join("\n");
54
- return `<!doctype html>
55
- <html lang="en">
56
- <head>
57
- <meta charset="utf-8" />
58
- <meta name="viewport" content="width=device-width, initial-scale=1" />
59
- <title>NeoOrm Documentation</title>
60
- <style>${DOCS_CSS}</style>
61
- </head>
62
- <body>
63
- <div class="layout">
64
- <aside class="sidebar">
65
- <div class="brand">
66
- <a href="/">NeoOrm</a>
67
- <span class="version">v${escapeHtml(version)}</span>
68
- </div>
69
- <nav class="nav">${nav
70
- .map((item) => `<a class="nav-link" href="/docs/${item.slug}">${escapeHtml(item.title)}</a>`)
71
- .join("\n")}</nav>
72
- </aside>
73
- <main class="content">
74
- <section class="hero">
76
+ return renderDocsShell("NeoOrm Documentation", version, nav, `<section class="hero">
75
77
  <h1>NeoOrm documentation</h1>
76
78
  <p>TypeScript-first PostgreSQL and SQLite ORM with schema DSL, codegen, and typed relations.</p>
77
79
  </section>
78
- <section class="cards">${cards}</section>
79
- </main>
80
- </div>
81
- </body>
82
- </html>`;
80
+ <section class="cards">${cards}</section>`);
83
81
  }
84
82
  function escapeHtml(value) {
85
83
  return value
@@ -88,6 +86,203 @@ function escapeHtml(value) {
88
86
  .replaceAll(">", "&gt;")
89
87
  .replaceAll('"', "&quot;");
90
88
  }
89
+ const DOCS_SEARCH_SCRIPT = `
90
+ (() => {
91
+ const input = document.getElementById("docs-search");
92
+ const resultsEl = document.getElementById("docs-search-results");
93
+ if (!input || !resultsEl) return;
94
+
95
+ let index = null;
96
+ let indexPromise = null;
97
+ let debounceTimer = null;
98
+ let activeIndex = -1;
99
+ let currentHits = [];
100
+
101
+ function escapeHtml(value) {
102
+ return value
103
+ .replaceAll("&", "&amp;")
104
+ .replaceAll("<", "&lt;")
105
+ .replaceAll(">", "&gt;")
106
+ .replaceAll('"', "&quot;");
107
+ }
108
+
109
+ function tokenize(query) {
110
+ return query.toLowerCase().split(/\\s+/).map((t) => t.trim()).filter(Boolean);
111
+ }
112
+
113
+ function scoreRecord(record, tokens) {
114
+ const title = record.title.toLowerCase();
115
+ const heading = (record.heading || "").toLowerCase();
116
+ const text = record.text.toLowerCase();
117
+ let score = 0;
118
+ for (const token of tokens) {
119
+ if (title === token) score += 10;
120
+ else if (title.startsWith(token)) score += 8;
121
+ else if (title.includes(token)) score += 5;
122
+ if (heading === token) score += 6;
123
+ else if (heading.startsWith(token)) score += 5;
124
+ else if (heading.includes(token)) score += 4;
125
+ if (text.includes(token)) {
126
+ score += 3;
127
+ const occurrences = text.split(token).length - 1;
128
+ if (occurrences > 1) score += Math.min(occurrences - 1, 3);
129
+ }
130
+ }
131
+ return score;
132
+ }
133
+
134
+ function rankResults(query, records) {
135
+ const tokens = tokenize(query);
136
+ if (tokens.length === 0) return [];
137
+ const hits = [];
138
+ for (const record of records) {
139
+ const score = scoreRecord(record, tokens);
140
+ if (score > 0) hits.push({ ...record, score });
141
+ }
142
+ hits.sort((a, b) => b.score - a.score || a.title.localeCompare(b.title));
143
+ return hits.slice(0, 8);
144
+ }
145
+
146
+ function highlightExcerpt(excerpt, query) {
147
+ const tokens = tokenize(query).filter((t) => t.length >= 2);
148
+ let html = escapeHtml(excerpt);
149
+ for (const token of tokens) {
150
+ const re = new RegExp("(" + token.replace(/[.*+?^\${}()|[\\]\\\\]/g, "\\\\$&") + ")", "gi");
151
+ html = html.replace(re, "<mark>$1</mark>");
152
+ }
153
+ return html;
154
+ }
155
+
156
+ function resultHref(hit) {
157
+ return hit.anchor ? "/docs/" + hit.slug + "#" + hit.anchor : "/docs/" + hit.slug;
158
+ }
159
+
160
+ function loadIndex() {
161
+ if (index) return Promise.resolve(index);
162
+ if (!indexPromise) {
163
+ indexPromise = fetch("/search-index.json")
164
+ .then((res) => {
165
+ if (!res.ok) throw new Error("Failed to load search index");
166
+ return res.json();
167
+ })
168
+ .then((data) => {
169
+ index = data;
170
+ return index;
171
+ });
172
+ }
173
+ return indexPromise;
174
+ }
175
+
176
+ function closeResults() {
177
+ resultsEl.hidden = true;
178
+ input.setAttribute("aria-expanded", "false");
179
+ activeIndex = -1;
180
+ currentHits = [];
181
+ }
182
+
183
+ function renderResults(hits, query) {
184
+ if (hits.length === 0) {
185
+ resultsEl.innerHTML = '<div class="search-empty">No results</div>';
186
+ resultsEl.hidden = false;
187
+ input.setAttribute("aria-expanded", "true");
188
+ return;
189
+ }
190
+
191
+ resultsEl.innerHTML = hits
192
+ .map((hit, i) => {
193
+ const heading = hit.heading
194
+ ? '<span class="search-result-heading">' + escapeHtml(hit.heading) + "</span>"
195
+ : "";
196
+ return (
197
+ '<a class="search-result' +
198
+ (i === activeIndex ? " active" : "") +
199
+ '" href="' +
200
+ escapeHtml(resultHref(hit)) +
201
+ '">' +
202
+ '<span class="search-result-title">' +
203
+ escapeHtml(hit.title) +
204
+ "</span>" +
205
+ heading +
206
+ '<span class="search-result-excerpt">' +
207
+ highlightExcerpt(hit.excerpt, query) +
208
+ "</span>" +
209
+ "</a>"
210
+ );
211
+ })
212
+ .join("");
213
+ resultsEl.hidden = false;
214
+ input.setAttribute("aria-expanded", "true");
215
+ }
216
+
217
+ function updateActiveResult() {
218
+ const items = resultsEl.querySelectorAll(".search-result");
219
+ items.forEach((item, i) => {
220
+ item.classList.toggle("active", i === activeIndex);
221
+ });
222
+ const active = items[activeIndex];
223
+ if (active) active.scrollIntoView({ block: "nearest" });
224
+ }
225
+
226
+ async function runSearch() {
227
+ const query = input.value.trim();
228
+ if (!query) {
229
+ closeResults();
230
+ return;
231
+ }
232
+ const records = await loadIndex();
233
+ currentHits = rankResults(query, records);
234
+ activeIndex = currentHits.length > 0 ? 0 : -1;
235
+ renderResults(currentHits, query);
236
+ }
237
+
238
+ input.addEventListener("focus", () => {
239
+ void loadIndex();
240
+ });
241
+
242
+ input.addEventListener("input", () => {
243
+ clearTimeout(debounceTimer);
244
+ debounceTimer = setTimeout(() => {
245
+ void runSearch();
246
+ }, 150);
247
+ });
248
+
249
+ input.addEventListener("keydown", (event) => {
250
+ if (resultsEl.hidden) return;
251
+ if (event.key === "Escape") {
252
+ closeResults();
253
+ return;
254
+ }
255
+ if (event.key === "ArrowDown") {
256
+ event.preventDefault();
257
+ if (currentHits.length === 0) return;
258
+ activeIndex = Math.min(activeIndex + 1, currentHits.length - 1);
259
+ updateActiveResult();
260
+ return;
261
+ }
262
+ if (event.key === "ArrowUp") {
263
+ event.preventDefault();
264
+ if (currentHits.length === 0) return;
265
+ activeIndex = Math.max(activeIndex - 1, 0);
266
+ updateActiveResult();
267
+ return;
268
+ }
269
+ if (event.key === "Enter" && activeIndex >= 0) {
270
+ const hit = currentHits[activeIndex];
271
+ if (hit) {
272
+ event.preventDefault();
273
+ window.location.href = resultHref(hit);
274
+ }
275
+ }
276
+ });
277
+
278
+ document.addEventListener("click", (event) => {
279
+ if (!(event.target instanceof Node)) return;
280
+ if (!input.contains(event.target) && !resultsEl.contains(event.target)) {
281
+ closeResults();
282
+ }
283
+ });
284
+ })();
285
+ `;
91
286
  const DOCS_CSS = `
92
287
  :root {
93
288
  color-scheme: light dark;
@@ -147,6 +342,79 @@ a:hover { text-decoration: underline; }
147
342
  font-size: 0.8rem;
148
343
  font-weight: 500;
149
344
  }
345
+ .search {
346
+ position: relative;
347
+ margin-bottom: 1rem;
348
+ }
349
+ .search input {
350
+ width: 100%;
351
+ padding: 0.55rem 0.7rem;
352
+ border: 1px solid var(--border);
353
+ border-radius: 0.55rem;
354
+ background: var(--bg);
355
+ color: var(--text);
356
+ font: inherit;
357
+ }
358
+ .search input:focus {
359
+ outline: 2px solid color-mix(in srgb, var(--accent) 45%, transparent);
360
+ outline-offset: 1px;
361
+ }
362
+ .search-results {
363
+ position: absolute;
364
+ left: 0;
365
+ right: 0;
366
+ top: calc(100% + 0.35rem);
367
+ z-index: 20;
368
+ max-height: 18rem;
369
+ overflow: auto;
370
+ border: 1px solid var(--border);
371
+ border-radius: 0.65rem;
372
+ background: var(--panel);
373
+ box-shadow: 0 10px 30px color-mix(in srgb, var(--bg) 35%, transparent);
374
+ }
375
+ .search-result {
376
+ display: block;
377
+ padding: 0.65rem 0.75rem;
378
+ color: inherit;
379
+ border-bottom: 1px solid var(--border);
380
+ }
381
+ .search-result:last-child {
382
+ border-bottom: 0;
383
+ }
384
+ .search-result:hover,
385
+ .search-result.active {
386
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
387
+ text-decoration: none;
388
+ }
389
+ .search-result-title {
390
+ display: block;
391
+ font-weight: 600;
392
+ font-size: 0.92rem;
393
+ }
394
+ .search-result-heading {
395
+ display: block;
396
+ color: var(--muted);
397
+ font-size: 0.82rem;
398
+ margin-top: 0.1rem;
399
+ }
400
+ .search-result-excerpt {
401
+ display: block;
402
+ color: var(--muted);
403
+ font-size: 0.8rem;
404
+ margin-top: 0.25rem;
405
+ line-height: 1.4;
406
+ }
407
+ .search-result-excerpt mark {
408
+ background: color-mix(in srgb, var(--accent) 25%, transparent);
409
+ color: inherit;
410
+ padding: 0 0.1rem;
411
+ border-radius: 0.15rem;
412
+ }
413
+ .search-empty {
414
+ padding: 0.75rem;
415
+ color: var(--muted);
416
+ font-size: 0.9rem;
417
+ }
150
418
  .nav {
151
419
  display: flex;
152
420
  flex-direction: column;
@@ -240,6 +508,11 @@ a:hover { text-decoration: underline; }
240
508
  border-right: 0;
241
509
  border-bottom: 1px solid var(--border);
242
510
  }
511
+ .search-results {
512
+ position: static;
513
+ max-height: 12rem;
514
+ margin-top: 0.35rem;
515
+ }
243
516
  }
244
517
  `;
245
518
  //# sourceMappingURL=render.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/docs/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/docs/render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { DocsPage } from "./pages.js";
2
+ export type DocsSearchRecord = {
3
+ slug: string;
4
+ title: string;
5
+ heading?: string;
6
+ anchor?: string;
7
+ excerpt: string;
8
+ text: string;
9
+ };
10
+ export type DocsSearchHit = DocsSearchRecord & {
11
+ score: number;
12
+ };
13
+ export declare function slugifyHeading(text: string): string;
14
+ export declare function plainTextFromMarkdown(markdown: string): string;
15
+ export declare function buildSearchIndex(pages: DocsPage[]): Promise<DocsSearchRecord[]>;
16
+ export declare function rankSearchResults(query: string, records: DocsSearchRecord[]): DocsSearchHit[];
17
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/docs/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG;IAC9C,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AAUF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQnD;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAc9D;AAuFD,wBAAsB,gBAAgB,CACrC,KAAK,EAAE,QAAQ,EAAE,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA4B7B;AAiDD,wBAAgB,iBAAiB,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,EAAE,GACzB,aAAa,EAAE,CAsBjB"}
@@ -0,0 +1,191 @@
1
+ import { readFile } from "node:fs/promises";
2
+ const EXCERPT_LENGTH = 120;
3
+ const MAX_RESULTS = 8;
4
+ export function slugifyHeading(text) {
5
+ return text
6
+ .toLowerCase()
7
+ .trim()
8
+ .replace(/[^\w\s-]/g, "")
9
+ .replace(/\s+/g, "-")
10
+ .replace(/-+/g, "-")
11
+ .replace(/^-|-$/g, "");
12
+ }
13
+ export function plainTextFromMarkdown(markdown) {
14
+ let text = markdown;
15
+ text = text.replace(/^---[\s\S]*?---\n?/m, "");
16
+ text = text.replace(/```[\s\S]*?```/g, " ");
17
+ text = text.replace(/`[^`]*`/g, " ");
18
+ text = text.replace(/!\[([^\]]*)\]\([^)]+\)/g, "$1");
19
+ text = text.replace(/\[([^\]]+)\]\([^)]+\)/g, "$1");
20
+ text = text.replace(/^#{1,6}\s+/gm, "");
21
+ text = text.replace(/^\s*[-*+]\s+/gm, "");
22
+ text = text.replace(/^\s*\d+\.\s+/gm, "");
23
+ text = text.replace(/[*_~]/g, "");
24
+ text = text.replace(/\|/g, " ");
25
+ text = text.replace(/\s+/g, " ");
26
+ return text.trim();
27
+ }
28
+ function excerptFromText(text) {
29
+ const normalized = text.replace(/\s+/g, " ").trim();
30
+ if (normalized.length <= EXCERPT_LENGTH) {
31
+ return normalized;
32
+ }
33
+ return `${normalized.slice(0, EXCERPT_LENGTH).trimEnd()}…`;
34
+ }
35
+ function parseMarkdownSections(markdown) {
36
+ const lines = markdown.split("\n");
37
+ const sections = [];
38
+ let intro = [];
39
+ let currentHeading;
40
+ let currentBody = [];
41
+ const flush = () => {
42
+ const body = currentBody.join("\n").trim();
43
+ if (currentHeading !== undefined || body.length > 0) {
44
+ sections.push({
45
+ ...(currentHeading ? { heading: currentHeading } : {}),
46
+ body,
47
+ });
48
+ }
49
+ currentHeading = undefined;
50
+ currentBody = [];
51
+ };
52
+ for (const line of lines) {
53
+ const headingMatch = line.match(/^#{2,3}\s+(.+)$/);
54
+ if (headingMatch) {
55
+ if (currentHeading === undefined && intro.length > 0) {
56
+ sections.push({ body: intro.join("\n").trim() });
57
+ intro = [];
58
+ }
59
+ else if (currentHeading !== undefined || currentBody.length > 0) {
60
+ flush();
61
+ }
62
+ currentHeading = headingMatch[1]?.trim();
63
+ continue;
64
+ }
65
+ if (currentHeading === undefined && sections.length === 0 && !line.match(/^#\s+/)) {
66
+ intro.push(line);
67
+ continue;
68
+ }
69
+ currentBody.push(line);
70
+ }
71
+ if (currentHeading === undefined && intro.length > 0) {
72
+ sections.push({ body: intro.join("\n").trim() });
73
+ }
74
+ else {
75
+ flush();
76
+ }
77
+ return sections.filter((section) => section.body.length > 0 || section.heading);
78
+ }
79
+ function buildRecord(page, section) {
80
+ const bodyText = plainTextFromMarkdown(section.body);
81
+ if (!bodyText && !section.heading) {
82
+ return null;
83
+ }
84
+ const heading = section.heading;
85
+ const searchableParts = [page.title];
86
+ if (heading)
87
+ searchableParts.push(heading);
88
+ if (bodyText)
89
+ searchableParts.push(bodyText);
90
+ const text = searchableParts.join(" ");
91
+ const excerptSource = bodyText || heading || page.title;
92
+ return {
93
+ slug: page.slug,
94
+ title: page.title,
95
+ ...(heading
96
+ ? { heading, anchor: slugifyHeading(heading) }
97
+ : {}),
98
+ excerpt: excerptFromText(excerptSource),
99
+ text,
100
+ };
101
+ }
102
+ export async function buildSearchIndex(pages) {
103
+ const records = [];
104
+ for (const page of pages) {
105
+ const markdown = await readFile(page.sourcePath, "utf-8");
106
+ const sections = parseMarkdownSections(markdown);
107
+ for (const section of sections) {
108
+ const record = buildRecord(page, section);
109
+ if (record) {
110
+ records.push(record);
111
+ }
112
+ }
113
+ if (sections.length === 0) {
114
+ const text = plainTextFromMarkdown(markdown);
115
+ if (text) {
116
+ records.push({
117
+ slug: page.slug,
118
+ title: page.title,
119
+ excerpt: excerptFromText(text),
120
+ text: `${page.title} ${text}`,
121
+ });
122
+ }
123
+ }
124
+ }
125
+ return records;
126
+ }
127
+ function tokenizeQuery(query) {
128
+ return query
129
+ .toLowerCase()
130
+ .split(/\s+/)
131
+ .map((token) => token.trim())
132
+ .filter((token) => token.length > 0);
133
+ }
134
+ function scoreRecord(record, tokens) {
135
+ if (tokens.length === 0) {
136
+ return 0;
137
+ }
138
+ const title = record.title.toLowerCase();
139
+ const heading = record.heading?.toLowerCase() ?? "";
140
+ const text = record.text.toLowerCase();
141
+ let score = 0;
142
+ for (const token of tokens) {
143
+ if (title === token) {
144
+ score += 10;
145
+ }
146
+ else if (title.startsWith(token)) {
147
+ score += 8;
148
+ }
149
+ else if (title.includes(token)) {
150
+ score += 5;
151
+ }
152
+ if (heading === token) {
153
+ score += 6;
154
+ }
155
+ else if (heading.startsWith(token)) {
156
+ score += 5;
157
+ }
158
+ else if (heading.includes(token)) {
159
+ score += 4;
160
+ }
161
+ if (text.includes(token)) {
162
+ score += 3;
163
+ const occurrences = text.split(token).length - 1;
164
+ if (occurrences > 1) {
165
+ score += Math.min(occurrences - 1, 3);
166
+ }
167
+ }
168
+ }
169
+ return score;
170
+ }
171
+ export function rankSearchResults(query, records) {
172
+ const tokens = tokenizeQuery(query);
173
+ if (tokens.length === 0) {
174
+ return [];
175
+ }
176
+ const hits = [];
177
+ for (const record of records) {
178
+ const score = scoreRecord(record, tokens);
179
+ if (score > 0) {
180
+ hits.push({ ...record, score });
181
+ }
182
+ }
183
+ hits.sort((a, b) => {
184
+ if (b.score !== a.score) {
185
+ return b.score - a.score;
186
+ }
187
+ return a.title.localeCompare(b.title);
188
+ });
189
+ return hits.slice(0, MAX_RESULTS);
190
+ }
191
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/docs/search.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,13 @@
1
+ import { type IncomingMessage, type ServerResponse } from "node:http";
2
+ import { type DocsPage } from "./pages.js";
3
+ import { type DocsSearchRecord } from "./search.js";
1
4
  export type DocsServerOptions = {
2
5
  port?: number;
3
6
  host?: string;
4
7
  open?: boolean;
5
8
  version: string;
6
9
  };
10
+ export declare function createRequestHandler(pages: DocsPage[], version: string, searchIndex: DocsSearchRecord[]): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
7
11
  export declare function startDocsServer(options: DocsServerOptions): Promise<{
8
12
  url: string;
9
13
  close: () => Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/docs/server.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,iBAAiB,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AA4EF,wBAAsB,eAAe,CACpC,OAAO,EAAE,iBAAiB,GACxB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAoCtD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/docs/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAEpF,OAAO,EAAoC,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG7E,OAAO,EAEN,KAAK,gBAAgB,EACrB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,iBAAiB,GAAG;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAmCF,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,QAAQ,EAAE,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,gBAAgB,EAAE,GAC7B,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAoC9D;AAeD,wBAAsB,eAAe,CACpC,OAAO,EAAE,iBAAiB,GACxB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAqCtD"}