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
package/dist/router.js CHANGED
@@ -1,8 +1,12 @@
1
1
  import { promises as fs, createReadStream } from "node:fs";
2
2
  import path from "node:path";
3
- import { renderMarkdown } from "./renderer.js";
4
- import { wrapHtml } from "./template.js";
3
+ import { renderMarkdown } from "./renderer/markdown.js";
4
+ import { renderMdx } from "./renderer/mdx.js";
5
+ import { renderPage } from "./template/index.js";
5
6
  import { renderDirectory } from "./directory.js";
7
+ import { generateSitemap } from "./generators/sitemap.js";
8
+ import { generateFeed } from "./generators/feed.js";
9
+ import { buildSidebar } from "./template/sidebar.js";
6
10
  const MIME = {
7
11
  ".html": "text/html",
8
12
  ".css": "text/css",
@@ -19,6 +23,7 @@ const MIME = {
19
23
  ".txt": "text/plain",
20
24
  ".webp": "image/webp",
21
25
  ".md": "text/html",
26
+ ".mdx": "text/html",
22
27
  ".woff": "font/woff",
23
28
  ".woff2": "font/woff2",
24
29
  ".ttf": "font/ttf",
@@ -26,60 +31,122 @@ const MIME = {
26
31
  ".eot": "application/vnd.ms-fontobject",
27
32
  ".xml": "application/xml",
28
33
  ".zip": "application/zip",
34
+ ".mp4": "video/mp4",
35
+ ".mp3": "audio/mpeg",
29
36
  };
30
- export async function route(req, res, rootDir) {
37
+ export async function route(req, res, rootDir, settings, searchIndexCache) {
31
38
  // Only handle GET and HEAD
32
39
  if (req.method && !["GET", "HEAD"].includes(req.method)) {
33
- sendError(res, 405, "Method Not Allowed");
40
+ sendError(res, 405, "Method Not Allowed", settings);
34
41
  return;
35
42
  }
36
43
  const url = req.url || "/";
37
44
  const urlPath = decodeURIComponent(url.split("?")[0]);
45
+ // Special routes
46
+ if (urlPath === "/sitemap.xml" && settings.seo.generateSitemap) {
47
+ const sitemap = await generateSitemap(rootDir, settings);
48
+ res.writeHead(200, { "Content-Type": "application/xml" });
49
+ res.end(sitemap);
50
+ return;
51
+ }
52
+ if (urlPath === "/feed.xml" && settings.seo.generateRssFeed) {
53
+ const feed = await generateFeed(rootDir, settings);
54
+ res.writeHead(200, { "Content-Type": "application/rss+xml" });
55
+ res.end(feed);
56
+ return;
57
+ }
58
+ if (urlPath === "/search-index.json" && settings.search.enabled) {
59
+ res.writeHead(200, { "Content-Type": "application/json" });
60
+ res.end(JSON.stringify(searchIndexCache ?? []));
61
+ return;
62
+ }
38
63
  // Resolve path and check for path traversal
39
- // Remove leading slash from urlPath to ensure proper relative resolution
40
64
  const cleanUrlPath = urlPath.replace(/^\/+/, "");
41
65
  const resolvedPath = path.resolve(path.join(rootDir, cleanUrlPath));
42
66
  if (!resolvedPath.startsWith(rootDir)) {
43
- sendError(res, 403, "Forbidden");
67
+ sendError(res, 403, "Forbidden", settings);
68
+ return;
69
+ }
70
+ // Check for hidden files
71
+ if (isHidden(path.basename(resolvedPath), settings)) {
72
+ sendError(res, 404, "Not Found", settings);
73
+ return;
74
+ }
75
+ // Check for blocked extensions
76
+ const ext = path.extname(resolvedPath).toLowerCase();
77
+ if (isBlocked(ext, settings)) {
78
+ sendError(res, 403, "Forbidden", settings);
44
79
  return;
45
80
  }
46
81
  try {
47
82
  const stat = await fs.stat(resolvedPath);
48
83
  if (stat.isDirectory()) {
49
- await serveDirectory(res, resolvedPath, urlPath, rootDir);
84
+ await serveDirectory(res, resolvedPath, urlPath, rootDir, settings);
50
85
  }
51
- else if (urlPath.endsWith(".md")) {
52
- await serveMarkdown(res, resolvedPath, urlPath);
86
+ else if (ext === ".md" || (ext === ".mdx" && settings.mdx.enabled)) {
87
+ await serveMarkdownOrMdx(res, resolvedPath, urlPath, rootDir, settings);
88
+ }
89
+ else if (isAllowedExtension(ext, settings)) {
90
+ await serveStatic(req, res, resolvedPath, ext);
53
91
  }
54
92
  else {
55
- await serveStatic(req, res, resolvedPath);
93
+ sendError(res, 403, "Forbidden", settings);
56
94
  }
57
95
  }
58
96
  catch (err) {
59
97
  const code = err.code;
60
98
  if (code === "ENOENT") {
61
- sendError(res, 404, "Not Found");
99
+ // Try .md and .mdx extensions for pretty URLs
100
+ // Handles cases like /page -> page.md and /11.services -> 11.services.md
101
+ const mdPath = resolvedPath + ".md";
102
+ const mdxPath = resolvedPath + ".mdx";
103
+ try {
104
+ await fs.access(mdPath);
105
+ await serveMarkdownOrMdx(res, mdPath, urlPath, rootDir, settings);
106
+ return;
107
+ }
108
+ catch {
109
+ // Try .mdx
110
+ if (settings.mdx.enabled) {
111
+ try {
112
+ await fs.access(mdxPath);
113
+ await serveMarkdownOrMdx(res, mdxPath, urlPath, rootDir, settings);
114
+ return;
115
+ }
116
+ catch {
117
+ // Fall through to 404
118
+ }
119
+ }
120
+ }
121
+ sendError(res, 404, "Not Found", settings);
62
122
  }
63
123
  else {
64
- sendError(res, 500, "Internal Server Error");
124
+ console.error("Route error:", err);
125
+ sendError(res, 500, "Internal Server Error", settings);
65
126
  }
66
127
  }
67
128
  }
68
- async function serveDirectory(res, dirPath, urlPath, rootDir) {
69
- // Try to find index.md or index.html
70
- const indexMd = path.join(dirPath, "index.md");
71
- const indexHtml = path.join(dirPath, "index.html");
72
- try {
73
- await fs.access(indexMd);
74
- await serveMarkdown(res, indexMd, path.join(urlPath, "index.md"));
75
- return;
76
- }
77
- catch {
78
- // Continue to check index.html
129
+ async function serveDirectory(res, dirPath, urlPath, rootDir, settings) {
130
+ // Try to find index files from settings
131
+ for (const indexFile of settings.files.indexFiles) {
132
+ const indexPath = path.join(dirPath, indexFile);
133
+ try {
134
+ await fs.access(indexPath);
135
+ const ext = path.extname(indexFile).toLowerCase();
136
+ if (ext === ".md" || (ext === ".mdx" && settings.mdx.enabled)) {
137
+ await serveMarkdownOrMdx(res, indexPath, path.join(urlPath, indexFile), rootDir, settings);
138
+ return;
139
+ }
140
+ }
141
+ catch {
142
+ // Continue to next index file
143
+ }
79
144
  }
145
+ // Try index.html
146
+ const indexHtml = path.join(dirPath, "index.html");
80
147
  try {
81
148
  await fs.access(indexHtml);
82
- await serveStatic({ method: "GET", url: urlPath }, res, indexHtml);
149
+ await serveStatic({ method: "GET", url: urlPath }, res, indexHtml, ".html");
83
150
  return;
84
151
  }
85
152
  catch {
@@ -87,8 +154,10 @@ async function serveDirectory(res, dirPath, urlPath, rootDir) {
87
154
  }
88
155
  // Read directory contents
89
156
  const entries = await fs.readdir(dirPath, { withFileTypes: true });
157
+ // Filter hidden entries
158
+ const visibleEntries = entries.filter((entry) => !isHidden(entry.name, settings));
90
159
  // Add size information to entries
91
- const entriesWithSize = await Promise.all(entries.map(async (entry) => {
160
+ const entriesWithSize = await Promise.all(visibleEntries.map(async (entry) => {
92
161
  if (entry.isFile()) {
93
162
  const fullPath = path.join(dirPath, entry.name);
94
163
  const stat = await fs.stat(fullPath);
@@ -96,46 +165,90 @@ async function serveDirectory(res, dirPath, urlPath, rootDir) {
96
165
  }
97
166
  return Object.assign(entry, { size: 0 });
98
167
  }));
99
- const html = renderDirectory({
168
+ // Build sidebar if enabled
169
+ let sidebar = [];
170
+ if (settings.navigation.sidebar.enabled) {
171
+ sidebar = await buildSidebar(rootDir, urlPath, settings);
172
+ }
173
+ const html = renderPage({
174
+ title: urlPath ? `Index of ${urlPath}` : "Index",
175
+ body: renderDirectory({ urlPath, entries: entriesWithSize }),
176
+ filePath: urlPath,
177
+ settings,
100
178
  urlPath,
101
- entries: entriesWithSize,
179
+ sidebar,
102
180
  });
103
181
  res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
104
182
  res.end(html);
105
183
  }
106
- async function serveMarkdown(res, filePath, urlPath) {
184
+ async function serveMarkdownOrMdx(res, filePath, urlPath, rootDir, settings) {
107
185
  const content = await fs.readFile(filePath, "utf-8");
108
- const rendered = renderMarkdown(content);
109
- const title = path.basename(filePath, ".md");
110
- const html = wrapHtml({
186
+ const ext = path.extname(filePath).toLowerCase();
187
+ let result;
188
+ if (ext === ".mdx" && settings.mdx.enabled) {
189
+ result = await renderMdx(content, settings);
190
+ }
191
+ else {
192
+ result = renderMarkdown(content, settings);
193
+ }
194
+ const title = result.frontmatter.title || path.basename(filePath, ext);
195
+ // Build sidebar if enabled
196
+ let sidebar = [];
197
+ if (settings.navigation.sidebar.enabled) {
198
+ sidebar = await buildSidebar(rootDir, urlPath, settings);
199
+ }
200
+ const html = renderPage({
111
201
  title,
112
- body: rendered,
202
+ body: result.html,
113
203
  filePath: urlPath,
204
+ settings,
205
+ frontmatter: result.frontmatter,
206
+ toc: result.toc,
207
+ sidebar,
208
+ urlPath,
114
209
  });
115
210
  res.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
116
211
  res.end(html);
117
212
  }
118
- function serveStatic(req, res, filePath) {
119
- const ext = path.extname(filePath).toLowerCase();
213
+ function serveStatic(req, res, filePath, ext) {
120
214
  const contentType = MIME[ext] || "application/octet-stream";
121
215
  const stream = createReadStream(filePath);
122
216
  stream.on("error", () => {
123
- sendError(res, 500, "Internal Server Error");
217
+ res.writeHead(500, { "Content-Type": "text/plain" });
218
+ res.end("Internal Server Error");
124
219
  });
125
220
  res.writeHead(200, { "Content-Type": contentType });
126
221
  stream.pipe(res);
127
222
  }
128
- function sendError(res, code, message) {
129
- const html = `<!DOCTYPE html>
130
- <html>
131
- <head><title>${code} ${message}</title></head>
132
- <body style="font-family: sans-serif; text-align: center; padding: 50px;">
133
- <h1>${code}</h1>
134
- <p>${message}</p>
135
- <a href="/">← Back to home</a>
136
- </body>
137
- </html>`;
223
+ function sendError(res, code, message, settings) {
224
+ const html = renderPage({
225
+ title: `${code} — ${message}`,
226
+ body: `<div style="text-align: center; padding: 50px;">
227
+ <h1 style="font-size: 48px; margin-bottom: 20px;">${code}</h1>
228
+ <p style="font-size: 18px; margin-bottom: 30px;">${message}</p>
229
+ <a href="/" style="color: var(--accent);">← Back to home</a>
230
+ </div>`,
231
+ filePath: "",
232
+ settings,
233
+ });
138
234
  res.writeHead(code, { "Content-Type": "text/html; charset=utf-8" });
139
235
  res.end(html);
140
236
  }
237
+ function isHidden(filename, settings) {
238
+ for (const pattern of settings.files.extensions.hidden) {
239
+ if (filename === pattern)
240
+ return true;
241
+ if (pattern.startsWith("*") && filename.endsWith(pattern.slice(1)))
242
+ return true;
243
+ }
244
+ if (filename.startsWith("_"))
245
+ return true;
246
+ return false;
247
+ }
248
+ function isBlocked(ext, settings) {
249
+ return settings.files.extensions.block.includes(ext);
250
+ }
251
+ function isAllowedExtension(ext, settings) {
252
+ return settings.files.extensions.serve.includes(ext);
253
+ }
141
254
  //# sourceMappingURL=router.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -1,4 +1,8 @@
1
- import { ServeOptions, ServerInstance } from "./types.js";
1
+ import type { ServeOptions, ServerInstance } from "./types.js";
2
+ import { type Settings } from "./settings/index.js";
3
+ declare let currentSettings: Settings;
4
+ declare let searchIndexCache: unknown;
2
5
  export declare function createServer(rootDir: string, options?: ServeOptions): Promise<ServerInstance>;
3
6
  export declare function getNetworkAddress(): string | undefined;
7
+ export { currentSettings, searchIndexCache };
4
8
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG1D,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,cAAc,CAAC,CAkDzB;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAYtD"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE/D,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,qBAAqB,CAAC;AAI7B,QAAA,IAAI,eAAe,EAAE,QAAQ,CAAC;AAC9B,QAAA,IAAI,gBAAgB,EAAE,OAAc,CAAC;AAErC,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,cAAc,CAAC,CA+FzB;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAYtD;AAGD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC"}
package/dist/server.js CHANGED
@@ -3,6 +3,11 @@ import path from "node:path";
3
3
  import { promises as fs } from "node:fs";
4
4
  import os from "node:os";
5
5
  import { route } from "./router.js";
6
+ import { loadSettings, watchSettings, } from "./settings/index.js";
7
+ import { buildSearchIndex } from "./generators/search-index.js";
8
+ // Global state for the server
9
+ let currentSettings;
10
+ let searchIndexCache = null;
6
11
  export async function createServer(rootDir, options = {}) {
7
12
  // Resolve rootDir to absolute path
8
13
  const absoluteRoot = path.resolve(rootDir);
@@ -16,11 +21,18 @@ export async function createServer(rootDir, options = {}) {
16
21
  catch (err) {
17
22
  throw new Error(`Directory does not exist: ${absoluteRoot}`);
18
23
  }
24
+ // Load settings
25
+ currentSettings = await loadSettings(absoluteRoot);
26
+ // Build search index
27
+ if (currentSettings.search.enabled) {
28
+ searchIndexCache = await buildSearchIndex(absoluteRoot, currentSettings);
29
+ }
19
30
  const port = options.port ?? 1900;
20
31
  const host = options.host ?? "localhost";
32
+ const watchSettingsEnabled = options.watchSettings ?? true;
21
33
  return new Promise((resolve, reject) => {
22
34
  const server = http.createServer((req, res) => {
23
- route(req, res, absoluteRoot).catch((err) => {
35
+ route(req, res, absoluteRoot, currentSettings, searchIndexCache).catch((err) => {
24
36
  console.error("Routing error:", err);
25
37
  res.writeHead(500, { "Content-Type": "text/plain" });
26
38
  res.end("Internal Server Error");
@@ -29,10 +41,32 @@ export async function createServer(rootDir, options = {}) {
29
41
  server.listen(port, host, () => {
30
42
  const actualPort = server.address().port;
31
43
  const url = `http://${host}:${actualPort}`;
44
+ // Watch settings file for changes
45
+ if (watchSettingsEnabled) {
46
+ (async () => {
47
+ try {
48
+ const settingsPath = path.join(absoluteRoot, "settings.json");
49
+ await fs.access(settingsPath);
50
+ watchSettings(absoluteRoot, async (newSettings) => {
51
+ currentSettings = newSettings;
52
+ if (currentSettings.search.enabled) {
53
+ searchIndexCache = await buildSearchIndex(absoluteRoot, currentSettings);
54
+ }
55
+ if (!options.silent) {
56
+ console.log("[mdsvr] Settings reloaded");
57
+ }
58
+ });
59
+ }
60
+ catch {
61
+ // No settings.json to watch, that's fine
62
+ }
63
+ })();
64
+ }
32
65
  const instance = {
33
66
  port: actualPort,
34
67
  host,
35
68
  url,
69
+ settings: currentSettings,
36
70
  close: () => new Promise((res, rej) => {
37
71
  server.close((err) => {
38
72
  if (err)
@@ -41,6 +75,12 @@ export async function createServer(rootDir, options = {}) {
41
75
  res();
42
76
  });
43
77
  }),
78
+ reloadSettings: async () => {
79
+ currentSettings = await loadSettings(absoluteRoot);
80
+ if (currentSettings.search.enabled) {
81
+ searchIndexCache = await buildSearchIndex(absoluteRoot, currentSettings);
82
+ }
83
+ },
44
84
  };
45
85
  resolve(instance);
46
86
  });
@@ -63,4 +103,6 @@ export function getNetworkAddress() {
63
103
  }
64
104
  return undefined;
65
105
  }
106
+ // Export for use by router
107
+ export { currentSettings, searchIndexCache };
66
108
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare const DEFAULT_SERVE_EXTENSIONS: string[];
2
+ export declare const DEFAULT_BLOCK_EXTENSIONS: string[];
3
+ export declare const DEFAULT_HIDDEN_FILES: string[];
4
+ export declare const DEFAULT_INDEX_FILES: string[];
5
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/settings/defaults.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,wBAAwB,UAiBpC,CAAC;AAEF,eAAO,MAAM,wBAAwB,UAOpC,CAAC;AAEF,eAAO,MAAM,oBAAoB,UAKhC,CAAC;AAEF,eAAO,MAAM,mBAAmB,UAAwC,CAAC"}
@@ -0,0 +1,35 @@
1
+ // Default values for all settings
2
+ export const DEFAULT_SERVE_EXTENSIONS = [
3
+ ".md",
4
+ ".mdx",
5
+ ".txt",
6
+ ".pdf",
7
+ ".png",
8
+ ".jpg",
9
+ ".jpeg",
10
+ ".gif",
11
+ ".webp",
12
+ ".svg",
13
+ ".ico",
14
+ ".css",
15
+ ".js",
16
+ ".json",
17
+ ".mp4",
18
+ ".mp3",
19
+ ];
20
+ export const DEFAULT_BLOCK_EXTENSIONS = [
21
+ ".env",
22
+ ".key",
23
+ ".pem",
24
+ ".p12",
25
+ ".secret",
26
+ ".password",
27
+ ];
28
+ export const DEFAULT_HIDDEN_FILES = [
29
+ "settings.json",
30
+ ".git",
31
+ "node_modules",
32
+ ".DS_Store",
33
+ ];
34
+ export const DEFAULT_INDEX_FILES = ["README.md", "index.md", "INDEX.md"];
35
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/settings/defaults.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAElC,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;IACP,MAAM;IACN,MAAM;CACP,CAAC;AAEF,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,WAAW;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,eAAe;IACf,MAAM;IACN,cAAc;IACd,WAAW;CACZ,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type Settings } from "./schema.js";
2
+ export declare function loadSettings(rootDir: string): Promise<Settings>;
3
+ export declare function watchSettings(rootDir: string, onChange: (s: Settings) => void): void;
4
+ export declare function validateSettingsFile(rootDir: string): Promise<{
5
+ valid: boolean;
6
+ errors?: string[];
7
+ }>;
8
+ export declare function generateDefaultSettings(): object;
9
+ export { SettingsSchema } from "./schema.js";
10
+ export type { Settings, Logo, Site, Appearance, Navigation, Search, Seo, Files, Mdx, Footer, } from "./schema.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5D,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiBrE;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,GAC9B,IAAI,CAMN;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAqBhD;AAED,wBAAgB,uBAAuB,IAAI,MAAM,CA2BhD;AAED,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EACV,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,UAAU,EACV,UAAU,EACV,MAAM,EACN,GAAG,EACH,KAAK,EACL,GAAG,EACH,MAAM,GACP,MAAM,aAAa,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { watch } from "node:fs";
2
+ import path from "node:path";
3
+ import { promises as fs } from "node:fs";
4
+ import { SettingsSchema } from "./schema.js";
5
+ export async function loadSettings(rootDir) {
6
+ const settingsPath = path.join(rootDir, "settings.json");
7
+ try {
8
+ const raw = await fs.readFile(settingsPath, "utf-8");
9
+ const parsed = JSON.parse(raw);
10
+ const result = SettingsSchema.safeParse(parsed);
11
+ if (!result.success) {
12
+ console.warn("[mdsvr] settings.json validation errors:", result.error.flatten());
13
+ return SettingsSchema.parse({}); // fallback to defaults
14
+ }
15
+ return result.data;
16
+ }
17
+ catch {
18
+ return SettingsSchema.parse({}); // no settings.json → all defaults
19
+ }
20
+ }
21
+ export function watchSettings(rootDir, onChange) {
22
+ // Re-load on file change without restarting server
23
+ watch(path.join(rootDir, "settings.json"), async () => {
24
+ const newSettings = await loadSettings(rootDir);
25
+ onChange(newSettings);
26
+ });
27
+ }
28
+ export async function validateSettingsFile(rootDir) {
29
+ const settingsPath = path.join(rootDir, "settings.json");
30
+ try {
31
+ const raw = await fs.readFile(settingsPath, "utf-8");
32
+ const parsed = JSON.parse(raw);
33
+ const result = SettingsSchema.safeParse(parsed);
34
+ if (!result.success) {
35
+ const errors = result.error.issues.map((issue) => `${issue.path.join(".")}: ${issue.message}`);
36
+ return { valid: false, errors };
37
+ }
38
+ return { valid: true };
39
+ }
40
+ catch (err) {
41
+ return {
42
+ valid: false,
43
+ errors: [
44
+ err instanceof Error ? err.message : "Failed to read settings.json",
45
+ ],
46
+ };
47
+ }
48
+ }
49
+ export function generateDefaultSettings() {
50
+ return {
51
+ $schema: "https://mdsvr.dev/schema/v2.json",
52
+ site: {
53
+ title: "My Docs",
54
+ description: "Project documentation",
55
+ language: "en",
56
+ },
57
+ appearance: {
58
+ defaultTheme: "system",
59
+ allowThemeToggle: true,
60
+ accentColor: "#0969da",
61
+ },
62
+ navigation: {
63
+ sidebar: {
64
+ enabled: true,
65
+ autoGenerate: true,
66
+ },
67
+ tocEnabled: true,
68
+ },
69
+ search: {
70
+ enabled: true,
71
+ },
72
+ mdx: {
73
+ enabled: true,
74
+ },
75
+ };
76
+ }
77
+ export { SettingsSchema } from "./schema.js";
78
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/settings/index.ts"],"names":[],"mappings":"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"}