mdsvr 1.0.3 → 2.0.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.
Files changed (78) hide show
  1. package/README.md +180 -4
  2. package/bin/mdsvr.js +0 -0
  3. package/dist/cli.js +67 -3
  4. package/dist/cli.js.map +1 -1
  5. package/dist/directory.d.ts.map +1 -1
  6. package/dist/directory.js +50 -21
  7. package/dist/directory.js.map +1 -1
  8. package/dist/generators/feed.d.ts +3 -0
  9. package/dist/generators/feed.d.ts.map +1 -0
  10. package/dist/generators/feed.js +110 -0
  11. package/dist/generators/feed.js.map +1 -0
  12. package/dist/generators/search-index.d.ts +10 -0
  13. package/dist/generators/search-index.d.ts.map +1 -0
  14. package/dist/generators/search-index.js +79 -0
  15. package/dist/generators/search-index.js.map +1 -0
  16. package/dist/generators/sitemap.d.ts +3 -0
  17. package/dist/generators/sitemap.d.ts.map +1 -0
  18. package/dist/generators/sitemap.js +90 -0
  19. package/dist/generators/sitemap.js.map +1 -0
  20. package/dist/index.d.ts +2 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +1 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/renderer/components.d.ts +60 -0
  25. package/dist/renderer/components.d.ts.map +1 -0
  26. package/dist/renderer/components.js +59 -0
  27. package/dist/renderer/components.js.map +1 -0
  28. package/dist/renderer/index.d.ts +7 -0
  29. package/dist/renderer/index.d.ts.map +1 -0
  30. package/dist/renderer/index.js +14 -0
  31. package/dist/renderer/index.js.map +1 -0
  32. package/dist/renderer/markdown.d.ts +14 -0
  33. package/dist/renderer/markdown.d.ts.map +1 -0
  34. package/dist/renderer/markdown.js +83 -0
  35. package/dist/renderer/markdown.js.map +1 -0
  36. package/dist/renderer/mdx.d.ts +13 -0
  37. package/dist/renderer/mdx.d.ts.map +1 -0
  38. package/dist/renderer/mdx.js +55 -0
  39. package/dist/renderer/mdx.js.map +1 -0
  40. package/dist/router.d.ts +2 -1
  41. package/dist/router.d.ts.map +1 -1
  42. package/dist/router.js +158 -45
  43. package/dist/router.js.map +1 -1
  44. package/dist/server.d.ts +5 -1
  45. package/dist/server.d.ts.map +1 -1
  46. package/dist/server.js +43 -1
  47. package/dist/server.js.map +1 -1
  48. package/dist/settings/defaults.d.ts +5 -0
  49. package/dist/settings/defaults.d.ts.map +1 -0
  50. package/dist/settings/defaults.js +35 -0
  51. package/dist/settings/defaults.js.map +1 -0
  52. package/dist/settings/index.d.ts +11 -0
  53. package/dist/settings/index.d.ts.map +1 -0
  54. package/dist/settings/index.js +78 -0
  55. package/dist/settings/index.js.map +1 -0
  56. package/dist/settings/schema.d.ts +820 -0
  57. package/dist/settings/schema.d.ts.map +1 -0
  58. package/dist/settings/schema.js +117 -0
  59. package/dist/settings/schema.js.map +1 -0
  60. package/dist/template/index.d.ts +15 -0
  61. package/dist/template/index.d.ts.map +1 -0
  62. package/dist/template/index.js +851 -0
  63. package/dist/template/index.js.map +1 -0
  64. package/dist/template/search.d.ts +5 -0
  65. package/dist/template/search.d.ts.map +1 -0
  66. package/dist/template/search.js +241 -0
  67. package/dist/template/search.js.map +1 -0
  68. package/dist/template/seo.d.ts +13 -0
  69. package/dist/template/seo.d.ts.map +1 -0
  70. package/dist/template/seo.js +71 -0
  71. package/dist/template/seo.js.map +1 -0
  72. package/dist/template/sidebar.d.ts +14 -0
  73. package/dist/template/sidebar.d.ts.map +1 -0
  74. package/dist/template/sidebar.js +185 -0
  75. package/dist/template/sidebar.js.map +1 -0
  76. package/dist/types.d.ts +4 -0
  77. package/dist/types.d.ts.map +1 -1
  78. package/package.json +15 -3
@@ -0,0 +1,79 @@
1
+ import path from "node:path";
2
+ import { promises as fs } from "node:fs";
3
+ import matter from "gray-matter";
4
+ function isHidden(filePath, settings) {
5
+ const basename = path.basename(filePath);
6
+ for (const pattern of settings.files.extensions.hidden) {
7
+ if (basename === pattern)
8
+ return true;
9
+ if (pattern.startsWith("*") && basename.endsWith(pattern.slice(1)))
10
+ return true;
11
+ }
12
+ if (basename.startsWith("_"))
13
+ return true;
14
+ return false;
15
+ }
16
+ function stripMarkdown(content) {
17
+ return content
18
+ .replace(/---[\s\S]*?---/, "") // Remove frontmatter
19
+ .replace(/```[\s\S]*?```/g, "") // Remove code blocks
20
+ .replace(/`([^`]+)`/g, "$1") // Remove inline code
21
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, "$1") // Remove links but keep text
22
+ .replace(/[#*_~]/g, "") // Remove formatting chars
23
+ .replace(/\s+/g, " ") // Normalize whitespace
24
+ .trim();
25
+ }
26
+ function extractHeadings(content) {
27
+ const headings = [];
28
+ const regex = /^#{1,6}\s+(.+)$/gm;
29
+ let match;
30
+ while ((match = regex.exec(content)) !== null) {
31
+ headings.push(match[1].trim());
32
+ }
33
+ return headings;
34
+ }
35
+ async function readDirRecursive(dirPath, rootDir, settings) {
36
+ const entries = [];
37
+ const items = await fs.readdir(dirPath, { withFileTypes: true });
38
+ for (const item of items) {
39
+ const fullPath = path.join(dirPath, item.name);
40
+ if (isHidden(fullPath, settings))
41
+ continue;
42
+ if (item.isDirectory()) {
43
+ const subEntries = await readDirRecursive(fullPath, rootDir, settings);
44
+ entries.push(...subEntries);
45
+ }
46
+ else if (item.name.endsWith(".md") ||
47
+ (item.name.endsWith(".mdx") && settings.mdx.enabled)) {
48
+ try {
49
+ const content = await fs.readFile(fullPath, "utf-8");
50
+ const parsed = matter(content);
51
+ const relativePath = "/" + path.relative(rootDir, fullPath).replace(/\\/g, "/");
52
+ const href = relativePath.replace(/\.(md|mdx)$/, "");
53
+ const title = parsed.data.title ||
54
+ parsed.content.match(/^#\s+(.+)$/m)?.[1] ||
55
+ item.name.replace(/\.\w+$/, "");
56
+ const plainContent = stripMarkdown(parsed.content);
57
+ const headings = extractHeadings(parsed.content);
58
+ entries.push({
59
+ title,
60
+ href,
61
+ excerpt: plainContent.slice(0, 200),
62
+ headings,
63
+ content: plainContent,
64
+ });
65
+ }
66
+ catch {
67
+ // Skip files that can't be read
68
+ }
69
+ }
70
+ }
71
+ return entries;
72
+ }
73
+ export async function buildSearchIndex(rootDir, settings) {
74
+ if (!settings.search.enabled) {
75
+ return [];
76
+ }
77
+ return readDirRecursive(rootDir, rootDir, settings);
78
+ }
79
+ //# sourceMappingURL=search-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-index.js","sourceRoot":"","sources":["../../src/generators/search-index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,MAAM,MAAM,aAAa,CAAC;AAWjC,SAAS,QAAQ,CAAC,QAAgB,EAAE,QAAkB;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEzC,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QACvD,IAAI,QAAQ,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QACtC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,OAAO;SACX,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,qBAAqB;SACnD,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,qBAAqB;SACpD,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,qBAAqB;SACjD,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC,6BAA6B;SACrE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,0BAA0B;SACjD,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,uBAAuB;SAC5C,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,mBAAmB,CAAC;IAClC,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,OAAe,EACf,OAAe,EACf,QAAkB;IAElB,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/C,IAAI,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;YAAE,SAAS;QAE3C,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QAC9B,CAAC;aAAM,IACL,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACzB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EACpD,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACrD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC/B,MAAM,YAAY,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBAChF,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBAErD,MAAM,KAAK,GACR,MAAM,CAAC,IAAI,CAAC,KAAgB;oBAC7B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;oBACxC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBAElC,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACnD,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAEjD,OAAO,CAAC,IAAI,CAAC;oBACX,KAAK;oBACL,IAAI;oBACJ,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;oBACnC,QAAQ;oBACR,OAAO,EAAE,YAAY;iBACtB,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,QAAkB;IAElB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Settings } from "../settings/index.js";
2
+ export declare function generateSitemap(rootDir: string, settings: Settings): Promise<string>;
3
+ //# sourceMappingURL=sitemap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../../src/generators/sitemap.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAwFrD,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,MAAM,CAAC,CAsBjB"}
@@ -0,0 +1,90 @@
1
+ import path from "node:path";
2
+ import { promises as fs } from "node:fs";
3
+ import matter from "gray-matter";
4
+ function isHidden(filePath, settings) {
5
+ const basename = path.basename(filePath);
6
+ for (const pattern of settings.files.extensions.hidden) {
7
+ if (basename === pattern)
8
+ return true;
9
+ if (pattern.startsWith("*") && basename.endsWith(pattern.slice(1)))
10
+ return true;
11
+ }
12
+ if (basename.startsWith("_"))
13
+ return true;
14
+ return false;
15
+ }
16
+ async function readDirRecursive(dirPath, rootDir, baseUrl, settings) {
17
+ const entries = [];
18
+ const items = await fs.readdir(dirPath, { withFileTypes: true });
19
+ for (const item of items) {
20
+ const fullPath = path.join(dirPath, item.name);
21
+ if (isHidden(fullPath, settings))
22
+ continue;
23
+ if (item.isDirectory()) {
24
+ const subEntries = await readDirRecursive(fullPath, rootDir, baseUrl, settings);
25
+ entries.push(...subEntries);
26
+ }
27
+ else if (item.name.endsWith(".md") ||
28
+ (item.name.endsWith(".mdx") && settings.mdx.enabled)) {
29
+ try {
30
+ const relativePath = "/" + path.relative(rootDir, fullPath).replace(/\\/g, "/");
31
+ const urlPath = relativePath.replace(/\.(md|mdx)$/, "");
32
+ const fullUrl = `${baseUrl.replace(/\/$/, "")}${urlPath}`;
33
+ // Try to get lastmod from frontmatter or file stat
34
+ let lastmod;
35
+ try {
36
+ const content = await fs.readFile(fullPath, "utf-8");
37
+ const parsed = matter(content);
38
+ if (parsed.data.date) {
39
+ const date = new Date(parsed.data.date);
40
+ if (!isNaN(date.getTime())) {
41
+ lastmod = date.toISOString().split("T")[0];
42
+ }
43
+ }
44
+ }
45
+ catch {
46
+ // Fall through to file stat
47
+ }
48
+ if (!lastmod) {
49
+ const stat = await fs.stat(fullPath);
50
+ lastmod = stat.mtime.toISOString().split("T")[0];
51
+ }
52
+ entries.push({
53
+ url: fullUrl,
54
+ lastmod,
55
+ changefreq: "weekly",
56
+ });
57
+ }
58
+ catch {
59
+ // Skip files that can't be read
60
+ }
61
+ }
62
+ }
63
+ return entries;
64
+ }
65
+ export async function generateSitemap(rootDir, settings) {
66
+ const baseUrl = settings.site.baseUrl || "http://localhost:1900";
67
+ const entries = await readDirRecursive(rootDir, rootDir, baseUrl, settings);
68
+ // Sort by URL for consistent output
69
+ entries.sort((a, b) => a.url.localeCompare(b.url));
70
+ const urlElements = entries
71
+ .map((entry) => ` <url>
72
+ <loc>${escapeXml(entry.url)}</loc>
73
+ <lastmod>${entry.lastmod}</lastmod>
74
+ <changefreq>${entry.changefreq}</changefreq>
75
+ </url>`)
76
+ .join("\n");
77
+ return `<?xml version="1.0" encoding="UTF-8"?>
78
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
79
+ ${urlElements}
80
+ </urlset>`;
81
+ }
82
+ function escapeXml(text) {
83
+ return text
84
+ .replace(/&/g, "&amp;")
85
+ .replace(/</g, "&lt;")
86
+ .replace(/>/g, "&gt;")
87
+ .replace(/"/g, "&quot;")
88
+ .replace(/'/g, "&apos;");
89
+ }
90
+ //# sourceMappingURL=sitemap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sitemap.js","sourceRoot":"","sources":["../../src/generators/sitemap.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,MAAM,MAAM,aAAa,CAAC;AASjC,SAAS,QAAQ,CAAC,QAAgB,EAAE,QAAkB;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAEzC,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QACvD,IAAI,QAAQ,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QACtC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAE1C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,OAAe,EACf,OAAe,EACf,OAAe,EACf,QAAkB;IAElB,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE/C,IAAI,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;YAAE,SAAS;QAE3C,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,MAAM,gBAAgB,CACvC,QAAQ,EACR,OAAO,EACP,OAAO,EACP,QAAQ,CACT,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;QAC9B,CAAC;aAAM,IACL,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACzB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EACpD,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,YAAY,GAChB,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBAC7D,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBACxD,MAAM,OAAO,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC;gBAE1D,mDAAmD;gBACnD,IAAI,OAA2B,CAAC;gBAChC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACrD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;oBAC/B,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;wBACrB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC;wBAClD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;4BAC3B,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC7C,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,4BAA4B;gBAC9B,CAAC;gBAED,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACrC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnD,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC;oBACX,GAAG,EAAE,OAAO;oBACZ,OAAO;oBACP,UAAU,EAAE,QAAQ;iBACrB,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAe,EACf,QAAkB;IAElB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,uBAAuB,CAAC;IAEjE,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE5E,oCAAoC;IACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAEnD,MAAM,WAAW,GAAG,OAAO;SACxB,GAAG,CACF,CAAC,KAAK,EAAE,EAAE,CAAC;WACN,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;eAChB,KAAK,CAAC,OAAO;kBACV,KAAK,CAAC,UAAU;SACzB,CACJ;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;EAEP,WAAW;UACH,CAAC;AACX,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
1
  export { createServer } from "./server.js";
2
2
  export type { ServeOptions, ServerInstance } from "./types.js";
3
+ export type { Settings, Logo, Site, Appearance, Navigation, Search, Seo, Files, Mdx, Footer, } from "./settings/index.js";
4
+ export { loadSettings, validateSettingsFile, generateDefaultSettings, } from "./settings/index.js";
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC/D,YAAY,EACV,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,UAAU,EACV,MAAM,EACN,GAAG,EACH,KAAK,EACL,GAAG,EACH,MAAM,GACP,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export { createServer } from "./server.js";
2
+ export { loadSettings, validateSettingsFile, generateDefaultSettings, } from "./settings/index.js";
2
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAc3C,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,60 @@
1
+ import React from "react";
2
+ interface CalloutProps {
3
+ type?: "info" | "warning" | "danger" | "success" | "tip";
4
+ title?: string;
5
+ children: React.ReactNode;
6
+ }
7
+ export declare function Callout({ type, title, children }: CalloutProps): React.JSX.Element;
8
+ interface CodeGroupProps {
9
+ title?: string;
10
+ children: React.ReactNode;
11
+ }
12
+ export declare function CodeGroup({ title, children }: CodeGroupProps): React.JSX.Element;
13
+ interface StepsProps {
14
+ children: React.ReactNode;
15
+ }
16
+ export declare function Steps({ children }: StepsProps): React.JSX.Element;
17
+ interface CardProps {
18
+ title: string;
19
+ icon?: string;
20
+ href?: string;
21
+ children: React.ReactNode;
22
+ }
23
+ export declare function Card({ title, icon, href, children }: CardProps): React.JSX.Element;
24
+ interface CardGroupProps {
25
+ cols?: number;
26
+ children: React.ReactNode;
27
+ }
28
+ export declare function CardGroup({ cols, children }: CardGroupProps): React.JSX.Element;
29
+ interface TabsProps {
30
+ items: string[];
31
+ children: React.ReactNode;
32
+ }
33
+ export declare function Tabs({ items, children }: TabsProps): React.JSX.Element;
34
+ interface AccordionProps {
35
+ title: string;
36
+ children: React.ReactNode;
37
+ }
38
+ export declare function Accordion({ title, children }: AccordionProps): React.JSX.Element;
39
+ interface BadgeProps {
40
+ color?: "green" | "orange" | "red" | "blue" | "purple" | "gray";
41
+ children: React.ReactNode;
42
+ }
43
+ export declare function Badge({ color, children }: BadgeProps): React.JSX.Element;
44
+ interface MermaidProps {
45
+ children: string;
46
+ }
47
+ export declare function Mermaid({ children }: MermaidProps): React.JSX.Element;
48
+ export declare const builtinComponents: {
49
+ Callout: typeof Callout;
50
+ CodeGroup: typeof CodeGroup;
51
+ Steps: typeof Steps;
52
+ Card: typeof Card;
53
+ CardGroup: typeof CardGroup;
54
+ Tabs: typeof Tabs;
55
+ Accordion: typeof Accordion;
56
+ Badge: typeof Badge;
57
+ Mermaid: typeof Mermaid;
58
+ };
59
+ export {};
60
+ //# sourceMappingURL=components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/renderer/components.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,OAAO,CAAC,EAAE,IAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,YAAY,qBAiBvE;AAED,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,cAAc,qBAO5D;AAED,UAAU,UAAU;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,UAAU,qBAQ7C;AAED,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,SAAS,qBAW9D;AAED,UAAU,cAAc;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,SAAS,CAAC,EAAE,IAAQ,EAAE,QAAQ,EAAE,EAAE,cAAc,qBAS/D;AAED,UAAU,SAAS;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,SAAS,qBAsBlD;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,cAAc,qBAY5D;AAED,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IAChE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,KAAK,CAAC,EAAE,KAAc,EAAE,QAAQ,EAAE,EAAE,UAAU,qBAE7D;AAED,UAAU,YAAY;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,YAAY,qBAejD;AAGD,eAAO,MAAM,iBAAiB;;;;;;;;;;CAU7B,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // Built-in MDX components - React components that render to HTML
3
+ import React from "react";
4
+ export function Callout({ type = "info", title, children }) {
5
+ const titles = {
6
+ info: "ℹ️ Info",
7
+ warning: "⚠️ Warning",
8
+ danger: "🚫 Danger",
9
+ success: "✅ Success",
10
+ tip: "💡 Tip",
11
+ };
12
+ return (_jsxs("div", { className: `callout callout-${type}`, children: [_jsx("strong", { style: { display: "block", marginBottom: "8px" }, children: title || titles[type] }), _jsx("div", { children: children })] }));
13
+ }
14
+ export function CodeGroup({ title, children }) {
15
+ return (_jsxs("div", { className: "code-group", children: [title && _jsx("div", { className: "code-group-title", children: title }), _jsx("div", { style: { margin: 0 }, children: children })] }));
16
+ }
17
+ export function Steps({ children }) {
18
+ return (_jsx("div", { className: "steps", children: React.Children.map(children, (child) => (_jsx("div", { className: "step-item", children: child }))) }));
19
+ }
20
+ export function Card({ title, icon, href, children }) {
21
+ const Wrapper = href ? "a" : "div";
22
+ return (_jsxs(Wrapper, { href: href, className: "card", children: [_jsxs("div", { className: "card-title", children: [icon && _jsx("span", { children: icon }), _jsx("span", { children: title })] }), _jsx("div", { className: "card-description", children: children })] }));
23
+ }
24
+ export function CardGroup({ cols = 2, children }) {
25
+ return (_jsx("div", { className: "card-group", style: { gridTemplateColumns: `repeat(${cols}, 1fr)` }, children: children }));
26
+ }
27
+ export function Tabs({ items, children }) {
28
+ const [active, setActive] = React.useState(0);
29
+ const tabsId = React.useId();
30
+ return (_jsxs("div", { className: "tabs-container", "data-tabs-id": tabsId, children: [_jsx("div", { className: "tabs", children: items.map((item, index) => (_jsx("button", { onClick: () => setActive(index), className: `tab ${active === index ? "active" : ""}`, children: item }, index))) }), _jsx("div", { className: "tab-content", children: React.Children.toArray(children)[active] })] }));
31
+ }
32
+ export function Accordion({ title, children }) {
33
+ const [open, setOpen] = React.useState(false);
34
+ return (_jsxs("div", { className: "accordion", children: [_jsxs("button", { onClick: () => setOpen(!open), className: "accordion-summary", children: [title, _jsx("span", { className: `accordion-icon ${open ? "open" : ""}`, children: "\u25BC" })] }), open && _jsx("div", { className: "accordion-content", children: children })] }));
35
+ }
36
+ export function Badge({ color = "gray", children }) {
37
+ return _jsx("span", { className: `badge badge-${color}`, children: children });
38
+ }
39
+ export function Mermaid({ children }) {
40
+ // Mermaid diagrams are rendered client-side
41
+ // Server-side we just wrap in a special div for client JS to process
42
+ return (_jsxs("div", { className: "mermaid", style: {
43
+ textAlign: "center",
44
+ padding: "16px",
45
+ }, children: [_jsx("pre", { style: { display: "none" }, children: children }), _jsx("div", { className: "mermaid-output", children: "Loading diagram..." })] }));
46
+ }
47
+ // Export all built-in components
48
+ export const builtinComponents = {
49
+ Callout,
50
+ CodeGroup,
51
+ Steps,
52
+ Card,
53
+ CardGroup,
54
+ Tabs,
55
+ Accordion,
56
+ Badge,
57
+ Mermaid,
58
+ };
59
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/renderer/components.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Settings } from "../settings/index.js";
2
+ import { type MarkdownResult } from "./markdown.js";
3
+ import { type MdxRenderResult } from "./mdx.js";
4
+ export type { MarkdownResult, MdxRenderResult };
5
+ export declare function renderFile(content: string, filePath: string, settings: Settings): Promise<MarkdownResult | MdxRenderResult>;
6
+ export declare function isMdxFile(filePath: string): boolean;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3D,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;AAEhD,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,cAAc,GAAG,eAAe,CAAC,CAS3C;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEnD"}
@@ -0,0 +1,14 @@
1
+ import { renderMarkdown } from "./markdown.js";
2
+ import { renderMdx } from "./mdx.js";
3
+ export async function renderFile(content, filePath, settings) {
4
+ const ext = filePath.split(".").pop()?.toLowerCase();
5
+ if (ext === "mdx" && settings.mdx.enabled) {
6
+ return renderMdx(content, settings);
7
+ }
8
+ // Default to markdown renderer for .md and fallback
9
+ return renderMarkdown(content, settings);
10
+ }
11
+ export function isMdxFile(filePath) {
12
+ return filePath.toLowerCase().endsWith(".mdx");
13
+ }
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAuB,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,SAAS,EAAwB,MAAM,UAAU,CAAC;AAI3D,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAe,EACf,QAAgB,EAChB,QAAkB;IAElB,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;IAErD,IAAI,GAAG,KAAK,KAAK,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,oDAAoD;IACpD,OAAO,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Settings } from "../settings/index.js";
2
+ export interface TocItem {
3
+ level: number;
4
+ text: string;
5
+ slug: string;
6
+ }
7
+ export interface MarkdownResult {
8
+ html: string;
9
+ frontmatter: Record<string, unknown>;
10
+ toc: TocItem[];
11
+ }
12
+ export declare function renderMarkdown(content: string, settings: Settings): MarkdownResult;
13
+ export declare function renderMarkdownSimple(content: string): string;
14
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/renderer/markdown.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,GAAG,EAAE,OAAO,EAAE,CAAC;CAChB;AAkCD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,GACjB,cAAc,CAahB;AAiBD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA6B5D"}
@@ -0,0 +1,83 @@
1
+ import MarkdownIt from "markdown-it";
2
+ import markdownItAnchor from "markdown-it-anchor";
3
+ import hljs from "highlight.js";
4
+ import matter from "gray-matter";
5
+ // Create markdown-it instance with settings
6
+ function createMarkdownIt(settings) {
7
+ const md = new MarkdownIt({
8
+ html: true,
9
+ linkify: true,
10
+ typographer: true,
11
+ highlight: (str, lang) => {
12
+ if (lang && hljs.getLanguage(lang)) {
13
+ try {
14
+ return hljs.highlight(str, { language: lang }).value;
15
+ }
16
+ catch {
17
+ // Fall through to plain text
18
+ }
19
+ }
20
+ return md.utils.escapeHtml(str);
21
+ },
22
+ });
23
+ md.use(markdownItAnchor, {
24
+ permalink: false,
25
+ slugify: (s) => encodeURIComponent(String(s)
26
+ .trim()
27
+ .toLowerCase()
28
+ .replace(/\s+/g, "-")),
29
+ });
30
+ return md;
31
+ }
32
+ export function renderMarkdown(content, settings) {
33
+ // Parse frontmatter
34
+ const parsed = matter(content);
35
+ const frontmatter = parsed.data;
36
+ // Render markdown
37
+ const md = createMarkdownIt(settings);
38
+ const html = md.render(parsed.content);
39
+ // Extract TOC from rendered HTML
40
+ const toc = extractToc(html);
41
+ return { html, frontmatter, toc };
42
+ }
43
+ function extractToc(html) {
44
+ const toc = [];
45
+ // Match heading tags with id attributes
46
+ const regex = /<h([1-6])[^>]*id="([^"]+)"[^>]*>([^<]*)<\/h\1>/gi;
47
+ let match;
48
+ while ((match = regex.exec(html)) !== null) {
49
+ const level = parseInt(match[1], 10);
50
+ const slug = match[2];
51
+ const text = match[3].replace(/<[^>]*>/g, ""); // strip any inline tags
52
+ toc.push({ level, text, slug });
53
+ }
54
+ return toc;
55
+ }
56
+ // For V1 compatibility - simple render without frontmatter extraction
57
+ export function renderMarkdownSimple(content) {
58
+ const md = new MarkdownIt({
59
+ html: true,
60
+ linkify: true,
61
+ typographer: true,
62
+ highlight: (str, lang) => {
63
+ if (lang && hljs.getLanguage(lang)) {
64
+ try {
65
+ return hljs.highlight(str, { language: lang }).value;
66
+ }
67
+ catch {
68
+ // Fall through to plain text
69
+ }
70
+ }
71
+ return md.utils.escapeHtml(str);
72
+ },
73
+ });
74
+ md.use(markdownItAnchor, {
75
+ permalink: false,
76
+ slugify: (s) => encodeURIComponent(String(s)
77
+ .trim()
78
+ .toLowerCase()
79
+ .replace(/\s+/g, "-")),
80
+ });
81
+ return md.render(content);
82
+ }
83
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/renderer/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Settings } from "../settings/index.js";
2
+ export interface TocItem {
3
+ level: number;
4
+ text: string;
5
+ slug: string;
6
+ }
7
+ export interface MdxRenderResult {
8
+ html: string;
9
+ frontmatter: Record<string, unknown>;
10
+ toc: TocItem[];
11
+ }
12
+ export declare function renderMdx(content: string, settings: Settings): Promise<MdxRenderResult>;
13
+ //# sourceMappingURL=mdx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdx.d.ts","sourceRoot":"","sources":["../../src/renderer/mdx.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGrD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,GAAG,EAAE,OAAO,EAAE,CAAC;CAChB;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,eAAe,CAAC,CAuC1B"}
@@ -0,0 +1,55 @@
1
+ import { compile, run } from "@mdx-js/mdx";
2
+ import * as runtime from "react/jsx-runtime";
3
+ import { renderToStaticMarkup } from "react-dom/server";
4
+ import remarkGfm from "remark-gfm";
5
+ import remarkFrontmatter from "remark-frontmatter";
6
+ import remarkMdxFrontmatter from "remark-mdx-frontmatter";
7
+ import rehypeSlug from "rehype-slug";
8
+ import rehypeAutolinkHeadings from "rehype-autolink-headings";
9
+ import { builtinComponents } from "./components.js";
10
+ export async function renderMdx(content, settings) {
11
+ if (!settings.mdx.enabled) {
12
+ throw new Error("MDX is disabled in settings");
13
+ }
14
+ const compiled = await compile(content, {
15
+ outputFormat: "function-body",
16
+ remarkPlugins: [remarkGfm, remarkFrontmatter, remarkMdxFrontmatter],
17
+ rehypePlugins: [rehypeSlug, rehypeAutolinkHeadings],
18
+ development: false,
19
+ });
20
+ // Execute compiled MDX in Node.js
21
+ const result = await run(String(compiled), {
22
+ ...runtime,
23
+ baseUrl: import.meta.url,
24
+ });
25
+ const MDXContent = result.default;
26
+ const frontmatter = result.frontmatter ?? {};
27
+ // Filter enabled components based on settings
28
+ const enabledComponents = {};
29
+ for (const [name, component] of Object.entries(builtinComponents)) {
30
+ const componentKey = name;
31
+ if (settings.mdx.components[name] !== false) {
32
+ enabledComponents[name] = component;
33
+ }
34
+ }
35
+ // Render to static HTML with built-in components injected
36
+ const html = renderToStaticMarkup(
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ MDXContent({ components: enabledComponents }));
39
+ const toc = extractToc(html);
40
+ return { html, frontmatter, toc };
41
+ }
42
+ function extractToc(html) {
43
+ const toc = [];
44
+ // Match heading tags with id attributes
45
+ const regex = /<h([1-6])[^>]*id="([^"]+)"[^>]*>([^<]*)<\/h\1>/gi;
46
+ let match;
47
+ while ((match = regex.exec(html)) !== null) {
48
+ const level = parseInt(match[1], 10);
49
+ const slug = match[2];
50
+ const text = match[3].replace(/<[^>]*>/g, ""); // strip any inline tags
51
+ toc.push({ level, text, slug });
52
+ }
53
+ return toc;
54
+ }
55
+ //# sourceMappingURL=mdx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdx.js","sourceRoot":"","sources":["../../src/renderer/mdx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,iBAAiB,MAAM,oBAAoB,CAAC;AACnD,OAAO,oBAAoB,MAAM,wBAAwB,CAAC;AAC1D,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,sBAAsB,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAcpD,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAe,EACf,QAAkB;IAElB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE;QACtC,YAAY,EAAE,eAAe;QAC7B,aAAa,EAAE,CAAC,SAAS,EAAE,iBAAiB,EAAE,oBAAoB,CAAC;QACnE,aAAa,EAAE,CAAC,UAAU,EAAE,sBAAsB,CAAC;QACnD,WAAW,EAAE,KAAK;KACnB,CAAC,CAAC;IAEH,kCAAkC;IAClC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;QACzC,GAAG,OAAO;QACV,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;KACzB,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC;IAClC,MAAM,WAAW,GAAI,MAAM,CAAC,WAAuC,IAAI,EAAE,CAAC;IAE1E,8CAA8C;IAC9C,MAAM,iBAAiB,GAAiD,EAAE,CAAC;IAC3E,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAClE,MAAM,YAAY,GAAG,IAA4C,CAAC;QAClE,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;YAC5C,iBAAiB,CAAC,IAAI,CAAC,GAAG,SAAyC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,MAAM,IAAI,GAAG,oBAAoB;IAC/B,8DAA8D;IAC7D,UAAkB,CAAC,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC,CACvD,CAAC;IAEF,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAE7B,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,wCAAwC;IACxC,MAAM,KAAK,GAAG,kDAAkD,CAAC;IACjE,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAwB;QACvE,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
package/dist/router.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  import { IncomingMessage, ServerResponse } from "node:http";
2
- export declare function route(req: IncomingMessage, res: ServerResponse, rootDir: string): Promise<void>;
2
+ import type { Settings } from "./settings/index.js";
3
+ export declare function route(req: IncomingMessage, res: ServerResponse, rootDir: string, settings: Settings, searchIndexCache: unknown): Promise<void>;
3
4
  //# sourceMappingURL=router.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAgC5D,wBAAsB,KAAK,CACzB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAqCf"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAU5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AA8BpD,wBAAsB,KAAK,CACzB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,EAClB,gBAAgB,EAAE,OAAO,GACxB,OAAO,CAAC,IAAI,CAAC,CA8Ff"}