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.
- package/README.md +180 -4
- package/bin/mdsvr.js +0 -0
- package/dist/cli.js +73 -5
- package/dist/cli.js.map +1 -1
- package/dist/directory.d.ts.map +1 -1
- package/dist/directory.js +50 -21
- package/dist/directory.js.map +1 -1
- package/dist/generators/feed.d.ts +3 -0
- package/dist/generators/feed.d.ts.map +1 -0
- package/dist/generators/feed.js +110 -0
- package/dist/generators/feed.js.map +1 -0
- package/dist/generators/search-index.d.ts +10 -0
- package/dist/generators/search-index.d.ts.map +1 -0
- package/dist/generators/search-index.js +79 -0
- package/dist/generators/search-index.js.map +1 -0
- package/dist/generators/sitemap.d.ts +3 -0
- package/dist/generators/sitemap.d.ts.map +1 -0
- package/dist/generators/sitemap.js +90 -0
- package/dist/generators/sitemap.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/renderer/components.d.ts +60 -0
- package/dist/renderer/components.d.ts.map +1 -0
- package/dist/renderer/components.js +59 -0
- package/dist/renderer/components.js.map +1 -0
- package/dist/renderer/index.d.ts +7 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +14 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/markdown.d.ts +14 -0
- package/dist/renderer/markdown.d.ts.map +1 -0
- package/dist/renderer/markdown.js +83 -0
- package/dist/renderer/markdown.js.map +1 -0
- package/dist/renderer/mdx.d.ts +13 -0
- package/dist/renderer/mdx.d.ts.map +1 -0
- package/dist/renderer/mdx.js +55 -0
- package/dist/renderer/mdx.js.map +1 -0
- package/dist/router.d.ts +2 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +158 -45
- package/dist/router.js.map +1 -1
- package/dist/server.d.ts +5 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +43 -1
- package/dist/server.js.map +1 -1
- package/dist/settings/defaults.d.ts +5 -0
- package/dist/settings/defaults.d.ts.map +1 -0
- package/dist/settings/defaults.js +35 -0
- package/dist/settings/defaults.js.map +1 -0
- package/dist/settings/index.d.ts +11 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +78 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/schema.d.ts +820 -0
- package/dist/settings/schema.d.ts.map +1 -0
- package/dist/settings/schema.js +117 -0
- package/dist/settings/schema.js.map +1 -0
- package/dist/template/index.d.ts +15 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/template/index.js +851 -0
- package/dist/template/index.js.map +1 -0
- package/dist/template/search.d.ts +5 -0
- package/dist/template/search.d.ts.map +1 -0
- package/dist/template/search.js +241 -0
- package/dist/template/search.js.map +1 -0
- package/dist/template/seo.d.ts +13 -0
- package/dist/template/seo.d.ts.map +1 -0
- package/dist/template/seo.js +71 -0
- package/dist/template/seo.js.map +1 -0
- package/dist/template/sidebar.d.ts +14 -0
- package/dist/template/sidebar.d.ts.map +1 -0
- package/dist/template/sidebar.js +185 -0
- package/dist/template/sidebar.js.map +1 -0
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- 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 {
|
|
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 (
|
|
52
|
-
await
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
184
|
+
async function serveMarkdownOrMdx(res, filePath, urlPath, rootDir, settings) {
|
|
107
185
|
const content = await fs.readFile(filePath, "utf-8");
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
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:
|
|
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
|
-
|
|
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 =
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
<
|
|
133
|
-
<
|
|
134
|
-
<
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
package/dist/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,gBAAgB,EAAe,MAAM,SAAS,CAAC;AACxE,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,
|
|
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
|
package/dist/server.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AAGzB,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|