mdsvr 1.0.2 → 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 +73 -5
  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 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/template/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Settings } from "../settings/index.js";
2
+ export declare function renderSearchModal(settings: Settings): string;
3
+ export declare function renderSearchTrigger(settings: Settings): string;
4
+ export declare function getSearchInlineScript(): string;
5
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/template/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA2B5D;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAc9D;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAsM9C"}
@@ -0,0 +1,241 @@
1
+ export function renderSearchModal(settings) {
2
+ if (!settings.search.enabled) {
3
+ return "";
4
+ }
5
+ return `
6
+ <div id="search-modal" class="search-modal" style="display: none;">
7
+ <div class="search-overlay" onclick="closeSearch()"></div>
8
+ <div class="search-container">
9
+ <div class="search-header">
10
+ <input
11
+ type="text"
12
+ id="search-input"
13
+ class="search-input"
14
+ placeholder="${settings.search.placeholder}"
15
+ autocomplete="off"
16
+ />
17
+ <button class="search-close" onclick="closeSearch()">×</button>
18
+ </div>
19
+ <div id="search-results" class="search-results"></div>
20
+ <div class="search-footer">
21
+ <span>Press <kbd>Esc</kbd> to close</span>
22
+ <span><kbd>↑</kbd><kbd>↓</kbd> to navigate</span>
23
+ </div>
24
+ </div>
25
+ </div>
26
+ `;
27
+ }
28
+ export function renderSearchTrigger(settings) {
29
+ if (!settings.search.enabled) {
30
+ return "";
31
+ }
32
+ return `
33
+ <button class="search-trigger" onclick="openSearch()" title="Search (Cmd+K)">
34
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
35
+ <path d="M7.33333 12.6667C10.2789 12.6667 12.6667 10.2789 12.6667 7.33333C12.6667 4.38781 10.2789 2 7.33333 2C4.38781 2 2 4.38781 2 7.33333C2 10.2789 4.38781 12.6667 7.33333 12.6667Z" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
36
+ <path d="M14 14L11.3333 11.3333" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
37
+ </svg>
38
+ <span class="search-shortcut">⌘K</span>
39
+ </button>
40
+ `;
41
+ }
42
+ export function getSearchInlineScript() {
43
+ return `
44
+ <script>
45
+ (function() {
46
+ let searchIndex = null;
47
+ let searchModal = null;
48
+ let searchInput = null;
49
+ let searchResults = null;
50
+ let selectedIndex = -1;
51
+
52
+ function init() {
53
+ searchModal = document.getElementById('search-modal');
54
+ searchInput = document.getElementById('search-input');
55
+ searchResults = document.getElementById('search-results');
56
+
57
+ if (!searchModal) return;
58
+
59
+ // Keyboard shortcuts
60
+ document.addEventListener('keydown', function(e) {
61
+ // Cmd/Ctrl + K
62
+ if ((e.metaKey || e.ctrlKey) && e.key === 'k') {
63
+ e.preventDefault();
64
+ openSearch();
65
+ }
66
+ // Escape
67
+ if (e.key === 'Escape' && searchModal.style.display === 'block') {
68
+ closeSearch();
69
+ }
70
+ // Arrow navigation
71
+ if (searchModal.style.display === 'block') {
72
+ if (e.key === 'ArrowDown') {
73
+ e.preventDefault();
74
+ moveSelection(1);
75
+ } else if (e.key === 'ArrowUp') {
76
+ e.preventDefault();
77
+ moveSelection(-1);
78
+ } else if (e.key === 'Enter') {
79
+ e.preventDefault();
80
+ selectResult();
81
+ }
82
+ }
83
+ });
84
+
85
+ // Input handler
86
+ if (searchInput) {
87
+ searchInput.addEventListener('input', debounce(performSearch, 150));
88
+ }
89
+
90
+ // Load search index
91
+ loadSearchIndex();
92
+ }
93
+
94
+ async function loadSearchIndex() {
95
+ try {
96
+ const res = await fetch('/search-index.json');
97
+ if (res.ok) {
98
+ searchIndex = await res.json();
99
+ }
100
+ } catch (e) {
101
+ console.error('Failed to load search index:', e);
102
+ }
103
+ }
104
+
105
+ window.openSearch = function() {
106
+ if (!searchModal) return;
107
+ searchModal.style.display = 'block';
108
+ document.body.style.overflow = 'hidden';
109
+ if (searchInput) {
110
+ searchInput.focus();
111
+ searchInput.select();
112
+ }
113
+ };
114
+
115
+ window.closeSearch = function() {
116
+ if (!searchModal) return;
117
+ searchModal.style.display = 'none';
118
+ document.body.style.overflow = '';
119
+ selectedIndex = -1;
120
+ if (searchInput) searchInput.value = '';
121
+ if (searchResults) searchResults.innerHTML = '';
122
+ };
123
+
124
+ function performSearch() {
125
+ const query = (searchInput?.value || '').toLowerCase().trim();
126
+ if (!query || !searchIndex) {
127
+ if (searchResults) searchResults.innerHTML = '';
128
+ return;
129
+ }
130
+
131
+ const results = searchIndex
132
+ .map(item => {
133
+ let score = 0;
134
+ const titleLower = item.title.toLowerCase();
135
+ const contentLower = item.content.toLowerCase();
136
+
137
+ // Title match is weighted higher
138
+ if (titleLower === query) score += 100;
139
+ else if (titleLower.startsWith(query)) score += 50;
140
+ else if (titleLower.includes(query)) score += 25;
141
+
142
+ // Content match
143
+ if (contentLower.includes(query)) score += 10;
144
+
145
+ // Heading match
146
+ if (item.headings.some(h => h.toLowerCase().includes(query))) score += 15;
147
+
148
+ return { item, score };
149
+ })
150
+ .filter(r => r.score > 0)
151
+ .sort((a, b) => b.score - a.score)
152
+ .slice(0, 10)
153
+ .map(r => r.item);
154
+
155
+ renderResults(results, query);
156
+ }
157
+
158
+ function renderResults(results, query) {
159
+ if (!searchResults) return;
160
+
161
+ if (results.length === 0) {
162
+ searchResults.innerHTML = '<div class="search-no-results">No results found</div>';
163
+ return;
164
+ }
165
+
166
+ const html = results.map((result, index) => {
167
+ const highlighted = highlightText(result.excerpt || result.content.slice(0, 200), query);
168
+ const selectedClass = index === 0 ? 'selected' : '';
169
+ return '<a href="' + result.href + '" class="search-result ' + selectedClass + '" data-index="' + index + '">' +
170
+ '<div class="search-result-title">' + escapeHtml(result.title) + '</div>' +
171
+ '<div class="search-result-excerpt">' + highlighted + '</div>' +
172
+ '</a>';
173
+ }).join('');
174
+
175
+ searchResults.innerHTML = html;
176
+ selectedIndex = results.length > 0 ? 0 : -1;
177
+
178
+ // Add click handlers
179
+ searchResults.querySelectorAll('.search-result').forEach(el => {
180
+ el.addEventListener('click', function(e) {
181
+ if (e.target.tagName !== 'A') {
182
+ const href = this.getAttribute('href');
183
+ if (href) window.location.href = href;
184
+ }
185
+ });
186
+ });
187
+ }
188
+
189
+ function highlightText(text, query) {
190
+ if (!query) return escapeHtml(text);
191
+ const regex = new RegExp('(' + escapeRegex(query) + ')', 'gi');
192
+ return escapeHtml(text).replace(regex, '<mark>$1</mark>');
193
+ }
194
+
195
+ function escapeRegex(string) {
196
+ var special = /[\\^$.*+?()[\]{}|]/g;
197
+ return string.replace(special, '\\$&');
198
+ }
199
+
200
+ function escapeHtml(text) {
201
+ const div = document.createElement('div');
202
+ div.textContent = text;
203
+ return div.innerHTML;
204
+ }
205
+
206
+ function moveSelection(delta) {
207
+ const items = searchResults?.querySelectorAll('.search-result');
208
+ if (!items || items.length === 0) return;
209
+
210
+ items[selectedIndex]?.classList.remove('selected');
211
+ selectedIndex = (selectedIndex + delta + items.length) % items.length;
212
+ items[selectedIndex]?.classList.add('selected');
213
+ items[selectedIndex]?.scrollIntoView({ block: 'nearest' });
214
+ }
215
+
216
+ function selectResult() {
217
+ const items = searchResults?.querySelectorAll('.search-result');
218
+ if (items && items[selectedIndex]) {
219
+ const href = items[selectedIndex].getAttribute('href');
220
+ if (href) window.location.href = href;
221
+ }
222
+ }
223
+
224
+ function debounce(fn, wait) {
225
+ let timeout;
226
+ return function(...args) {
227
+ clearTimeout(timeout);
228
+ timeout = setTimeout(() => fn.apply(this, args), wait);
229
+ };
230
+ }
231
+
232
+ if (document.readyState === 'loading') {
233
+ document.addEventListener('DOMContentLoaded', init);
234
+ } else {
235
+ init();
236
+ }
237
+ })();
238
+ </script>
239
+ `;
240
+ }
241
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/template/search.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,iBAAiB,CAAC,QAAkB;IAClD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;;;;;;;;;uBASc,QAAQ,CAAC,MAAM,CAAC,WAAW;;;;;;;;;;;;CAYjD,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAkB;IACpD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO;;;;;;;;CAQR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoMR,CAAC;AACF,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { Settings } from "../settings/index.js";
2
+ export interface SeoData {
3
+ title: string;
4
+ description?: string;
5
+ image?: string;
6
+ url?: string;
7
+ type?: "website" | "article";
8
+ date?: string;
9
+ author?: string;
10
+ noIndex?: boolean;
11
+ }
12
+ export declare function buildSeoTags(data: SeoData, settings: Settings): string;
13
+ //# sourceMappingURL=seo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.d.ts","sourceRoot":"","sources":["../../src/template/seo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAyBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA0EtE"}
@@ -0,0 +1,71 @@
1
+ function escapeHtml(text) {
2
+ const htmlEscapes = {
3
+ "&": "&amp;",
4
+ "<": "&lt;",
5
+ ">": "&gt;",
6
+ '"': "&quot;",
7
+ "'": "&#x27;",
8
+ };
9
+ return text.replace(/[&<>"']/g, (char) => htmlEscapes[char] || char);
10
+ }
11
+ function resolveImageUrl(image, settings) {
12
+ if (image.startsWith("http://") || image.startsWith("https://")) {
13
+ return image;
14
+ }
15
+ if (settings.site.baseUrl) {
16
+ const base = settings.site.baseUrl.replace(/\/$/, "");
17
+ const path = image.startsWith("/") ? image : `/${image}`;
18
+ return `${base}${path}`;
19
+ }
20
+ return image;
21
+ }
22
+ export function buildSeoTags(data, settings) {
23
+ const title = settings.seo.titleTemplate.replace("%s", data.title);
24
+ const image = data.image ?? settings.seo.defaultImage;
25
+ const description = data.description ?? settings.site.description ?? "";
26
+ const tags = [];
27
+ // Basic meta
28
+ tags.push(`<title>${escapeHtml(title)}</title>`);
29
+ tags.push(`<meta name="description" content="${escapeHtml(description)}">`);
30
+ if (data.noIndex || settings.seo.noIndex) {
31
+ tags.push('<meta name="robots" content="noindex">');
32
+ }
33
+ // Open Graph
34
+ tags.push(`<meta property="og:title" content="${escapeHtml(title)}">`);
35
+ tags.push(`<meta property="og:description" content="${escapeHtml(description)}">`);
36
+ tags.push(`<meta property="og:type" content="${data.type ?? "website"}">`);
37
+ if (data.url) {
38
+ tags.push(`<meta property="og:url" content="${data.url}">`);
39
+ }
40
+ if (image) {
41
+ tags.push(`<meta property="og:image" content="${resolveImageUrl(image, settings)}">`);
42
+ }
43
+ // Twitter Card
44
+ tags.push(`<meta name="twitter:card" content="${settings.seo.twitterCard}">`);
45
+ if (settings.seo.twitterSite) {
46
+ tags.push(`<meta name="twitter:site" content="${settings.seo.twitterSite}">`);
47
+ }
48
+ tags.push(`<meta name="twitter:title" content="${escapeHtml(title)}">`);
49
+ if (image) {
50
+ tags.push(`<meta name="twitter:image" content="${resolveImageUrl(image, settings)}">`);
51
+ }
52
+ // Article meta
53
+ if (data.date) {
54
+ tags.push(`<meta property="article:published_time" content="${data.date}">`);
55
+ }
56
+ if (data.author) {
57
+ tags.push(`<meta property="article:author" content="${data.author}">`);
58
+ }
59
+ // Canonical & Sitemap
60
+ if (data.url && settings.site.baseUrl) {
61
+ tags.push(`<link rel="canonical" href="${data.url}">`);
62
+ }
63
+ if (settings.seo.generateSitemap) {
64
+ tags.push('<link rel="sitemap" type="application/xml" href="/sitemap.xml">');
65
+ }
66
+ if (settings.seo.generateRssFeed) {
67
+ tags.push('<link rel="alternate" type="application/rss+xml" href="/feed.xml">');
68
+ }
69
+ return tags.join("\n ");
70
+ }
71
+ //# sourceMappingURL=seo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo.js","sourceRoot":"","sources":["../../src/template/seo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Settings } from "../settings/index.js";
2
+ import type { TocItem } from "../renderer/markdown.js";
3
+ export interface NavItem {
4
+ title: string;
5
+ href: string;
6
+ children?: NavItem[];
7
+ active?: boolean;
8
+ type: "file" | "dir";
9
+ order?: number;
10
+ }
11
+ export declare function buildSidebar(rootDir: string, currentPath: string, settings: Settings): Promise<NavItem[]>;
12
+ export declare function renderSidebar(items: NavItem[], settings: Settings, level?: number): string;
13
+ export declare function renderToc(toc: TocItem[], settings: Settings): string;
14
+ //# sourceMappingURL=sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.d.ts","sourceRoot":"","sources":["../../src/template/sidebar.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmHD,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,OAAO,EAAE,CAAC,CA0CpB;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EAAE,EAChB,QAAQ,EAAE,QAAQ,EAClB,KAAK,SAAI,GACR,MAAM,CAmCR;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA2BpE"}
@@ -0,0 +1,185 @@
1
+ import path from "node:path";
2
+ import { promises as fs } from "node:fs";
3
+ // Extract title from content (first h1 or frontmatter)
4
+ async function extractTitle(filePath, settings) {
5
+ try {
6
+ const content = await fs.readFile(filePath, "utf-8");
7
+ // Check frontmatter for title
8
+ const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
9
+ if (frontmatterMatch) {
10
+ const titleMatch = frontmatterMatch[1].match(/^title:\s*(.+)$/m);
11
+ if (titleMatch) {
12
+ return titleMatch[1].trim().replace(/^["']|["']$/g, "");
13
+ }
14
+ }
15
+ // Check for first h1
16
+ const h1Match = content.match(/^#\s+(.+)$/m);
17
+ if (h1Match) {
18
+ return h1Match[1].trim();
19
+ }
20
+ }
21
+ catch {
22
+ // Fall through to filename
23
+ }
24
+ // Humanize filename
25
+ const basename = path.basename(filePath, path.extname(filePath));
26
+ return humanizeFilename(basename);
27
+ }
28
+ function humanizeFilename(filename) {
29
+ return filename
30
+ .replace(/[-_]/g, " ")
31
+ .replace(/\.\w+$/, "")
32
+ .replace(/^\w/, (c) => c.toUpperCase());
33
+ }
34
+ function isHidden(filePath, settings) {
35
+ const basename = path.basename(filePath);
36
+ // Check hidden patterns
37
+ for (const pattern of settings.files.extensions.hidden) {
38
+ if (basename === pattern)
39
+ return true;
40
+ if (pattern.startsWith("*") && basename.endsWith(pattern.slice(1)))
41
+ return true;
42
+ if (pattern.endsWith("/*") && filePath.includes(pattern.slice(0, -1)))
43
+ return true;
44
+ }
45
+ // Files starting with _ are hidden
46
+ if (basename.startsWith("_"))
47
+ return true;
48
+ return false;
49
+ }
50
+ async function readDirRecursive(dirPath, rootDir, currentPath, settings) {
51
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
52
+ const items = [];
53
+ for (const entry of entries) {
54
+ const fullPath = path.join(dirPath, entry.name);
55
+ const relativePath = "/" + path.relative(rootDir, fullPath).replace(/\\/g, "/");
56
+ if (isHidden(fullPath, settings))
57
+ continue;
58
+ if (entry.isDirectory()) {
59
+ const children = await readDirRecursive(fullPath, rootDir, currentPath, settings);
60
+ if (children.length > 0) {
61
+ items.push({
62
+ title: humanizeFilename(entry.name),
63
+ href: relativePath + "/",
64
+ children,
65
+ type: "dir",
66
+ });
67
+ }
68
+ }
69
+ else if (entry.name.endsWith(".md") ||
70
+ (entry.name.endsWith(".mdx") && settings.mdx.enabled)) {
71
+ // Skip README files - they are rendered as directory index
72
+ const baseName = entry.name.replace(/\.(md|mdx)$/i, "").toLowerCase();
73
+ if (baseName === "readme")
74
+ continue;
75
+ const title = await extractTitle(fullPath, settings);
76
+ const href = relativePath.replace(/\.(md|mdx)$/, "");
77
+ items.push({
78
+ title,
79
+ href,
80
+ type: "file",
81
+ });
82
+ }
83
+ }
84
+ // Sort: folders first, then alphabetically
85
+ return items.sort((a, b) => {
86
+ if (a.type === "dir" && b.type !== "dir")
87
+ return -1;
88
+ if (a.type !== "dir" && b.type === "dir")
89
+ return 1;
90
+ return a.title.localeCompare(b.title);
91
+ });
92
+ }
93
+ export async function buildSidebar(rootDir, currentPath, settings) {
94
+ if (!settings.navigation.sidebar.enabled) {
95
+ return [];
96
+ }
97
+ const items = await readDirRecursive(rootDir, rootDir, currentPath, settings);
98
+ // Check for root README.md and add Home item
99
+ const readmePath = path.join(rootDir, "README.md");
100
+ try {
101
+ await fs.access(readmePath);
102
+ const title = await extractTitle(readmePath, settings);
103
+ // Insert Home at the beginning
104
+ items.unshift({
105
+ title: title || "Home",
106
+ href: "/",
107
+ type: "file",
108
+ });
109
+ }
110
+ catch {
111
+ // No README.md at root
112
+ }
113
+ // Mark active item - only exact match, not parent paths
114
+ function markActive(items) {
115
+ for (const item of items) {
116
+ const isRoot = item.href === "/";
117
+ const isExactMatch = item.href === currentPath;
118
+ // Only exact match, no parent path highlighting
119
+ const isActive = isRoot
120
+ ? currentPath === "/" || currentPath === ""
121
+ : isExactMatch;
122
+ if (isActive) {
123
+ item.active = true;
124
+ }
125
+ if (item.children) {
126
+ markActive(item.children);
127
+ }
128
+ }
129
+ }
130
+ markActive(items);
131
+ return items;
132
+ }
133
+ export function renderSidebar(items, settings, level = 0) {
134
+ if (items.length === 0)
135
+ return "";
136
+ const indent = " ".repeat(level * 2);
137
+ const lines = [];
138
+ lines.push(`${indent}<ul class="sidebar-nav" data-level="${level}">`);
139
+ for (const item of items) {
140
+ const hasChildren = item.children && item.children.length > 0;
141
+ const activeClass = item.active ? " active" : "";
142
+ const folderClass = item.type === "dir" ? " folder" : "";
143
+ lines.push(`${indent} <li class="nav-item${activeClass}${folderClass}" data-type="${item.type}">`);
144
+ const icon = item.type === "dir" ? "📁" : "📄";
145
+ lines.push(`${indent} <a href="${item.href}" class="nav-link${activeClass}">${icon} ${escapeHtml(item.title)}</a>`);
146
+ if (hasChildren && settings.navigation.sidebar.defaultOpen) {
147
+ lines.push(`${indent} <div class="nav-children">`);
148
+ lines.push(renderSidebar(item.children, settings, level + 1));
149
+ lines.push(`${indent} </div>`);
150
+ }
151
+ lines.push(`${indent} </li>`);
152
+ }
153
+ lines.push(`${indent}</ul>`);
154
+ return lines.join("\n");
155
+ }
156
+ export function renderToc(toc, settings) {
157
+ if (!settings.navigation.tocEnabled || toc.length === 0) {
158
+ return "";
159
+ }
160
+ const filtered = toc.filter((item) => item.level <= settings.navigation.tocMaxDepth);
161
+ if (filtered.length === 0)
162
+ return "";
163
+ const lines = [];
164
+ lines.push('<nav class="toc">');
165
+ lines.push(" <h3>On this page</h3>");
166
+ lines.push(' <ul class="toc-list">');
167
+ for (const item of filtered) {
168
+ const indent = " ".repeat(item.level - 1);
169
+ lines.push(` <li class="toc-item toc-level-${item.level}"><a href="#${item.slug}">${indent}${escapeHtml(item.text)}</a></li>`);
170
+ }
171
+ lines.push(" </ul>");
172
+ lines.push("</nav>");
173
+ return lines.join("\n");
174
+ }
175
+ function escapeHtml(text) {
176
+ const htmlEscapes = {
177
+ "&": "&amp;",
178
+ "<": "&lt;",
179
+ ">": "&gt;",
180
+ '"': "&quot;",
181
+ "'": "&#x27;",
182
+ };
183
+ return text.replace(/[&<>"']/g, (char) => htmlEscapes[char] || char);
184
+ }
185
+ //# sourceMappingURL=sidebar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidebar.js","sourceRoot":"","sources":["../../src/template/sidebar.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,13 +1,17 @@
1
+ import type { Settings } from "./settings/index.js";
1
2
  export interface ServeOptions {
2
3
  port?: number;
3
4
  host?: string;
4
5
  open?: boolean;
5
6
  silent?: boolean;
7
+ watchSettings?: boolean;
6
8
  }
7
9
  export interface ServerInstance {
8
10
  close(): Promise<void>;
9
11
  port: number;
10
12
  host: string;
11
13
  url: string;
14
+ settings: Settings;
15
+ reloadSettings(): Promise<void>;
12
16
  }
13
17
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,QAAQ,CAAC;IACnB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "mdsvr",
3
- "version": "1.0.2",
4
- "description": "Static file server with auto Markdown HTML rendering",
3
+ "version": "2.0.0",
4
+ "description": "Full-featured documentation website server with MDX support, site settings, SEO, and navigation",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
@@ -24,11 +24,23 @@
24
24
  "dependencies": {
25
25
  "markdown-it": "^14.1.0",
26
26
  "markdown-it-anchor": "^9.2.0",
27
- "highlight.js": "^11.10.0"
27
+ "highlight.js": "^11.10.0",
28
+ "@mdx-js/mdx": "^3.1.0",
29
+ "react": "^18.3.0",
30
+ "react-dom": "^18.3.0",
31
+ "remark-gfm": "^4.0.0",
32
+ "remark-frontmatter": "^5.0.0",
33
+ "remark-mdx-frontmatter": "^4.0.0",
34
+ "rehype-slug": "^6.0.0",
35
+ "rehype-autolink-headings": "^7.1.0",
36
+ "gray-matter": "^4.0.3",
37
+ "zod": "^3.23.0"
28
38
  },
29
39
  "devDependencies": {
30
40
  "@types/markdown-it": "^14.1.0",
31
41
  "@types/node": "^22.0.0",
42
+ "@types/react": "^18.3.0",
43
+ "@types/react-dom": "^18.3.0",
32
44
  "typescript": "^5.5.0"
33
45
  },
34
46
  "engines": {