mdts 0.4.3 → 0.4.5
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 +31 -61
- package/dist/frontend/bundle.js +134 -68
- package/dist/frontend/index.html +1 -2
- package/dist/server/public/welcome.md +1 -1
- package/dist/server/server.js +63 -13
- package/package.json +1 -1
package/dist/frontend/index.html
CHANGED
|
@@ -6,9 +6,8 @@
|
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<link rel="stylesheet" href="/markdown.css" />
|
|
8
8
|
<title>mdts - Markdown file viewer</title>
|
|
9
|
-
<script defer src="bundle.js"></script></head>
|
|
9
|
+
<script defer src="/bundle.js"></script></head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
|
12
|
-
<script defer src="/bundle.js"></script>
|
|
13
12
|
</body>
|
|
14
13
|
</html>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<h1 align="center">
|
|
2
|
-
<img src="
|
|
2
|
+
<img src="/logo.svg" alt="mdts" width="400">
|
|
3
3
|
</h1>
|
|
4
4
|
|
|
5
5
|
mdts (Markdown Tree Server) is a simple and efficient tool for serving and viewing markdown files with an interactive file tree and outline. It's designed to help you navigate and read your markdown-based documentation or notes with ease.
|
package/dist/server/server.js
CHANGED
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
36
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
37
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -15,7 +48,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
48
|
exports.createApp = exports.serve = void 0;
|
|
16
49
|
const chokidar_1 = __importDefault(require("chokidar"));
|
|
17
50
|
const express_1 = __importDefault(require("express"));
|
|
18
|
-
const
|
|
51
|
+
const fs = __importStar(require("fs"));
|
|
19
52
|
const path_1 = __importDefault(require("path"));
|
|
20
53
|
const ws_1 = require("ws");
|
|
21
54
|
const filetree_1 = require("./routes/filetree");
|
|
@@ -25,7 +58,7 @@ const serve = (directory, port) => {
|
|
|
25
58
|
const server = app.listen(port, () => {
|
|
26
59
|
console.log(`🚀 Server listening at http://localhost:${port}`);
|
|
27
60
|
});
|
|
28
|
-
setupWatcher(directory, server);
|
|
61
|
+
setupWatcher(directory, server, port);
|
|
29
62
|
return server;
|
|
30
63
|
};
|
|
31
64
|
exports.serve = serve;
|
|
@@ -47,7 +80,7 @@ const createApp = (directory, currentLocation = __dirname) => {
|
|
|
47
80
|
const filePath = path_1.default.join(directory, req.path);
|
|
48
81
|
let isDirectory = false;
|
|
49
82
|
try {
|
|
50
|
-
const stats =
|
|
83
|
+
const stats = fs.statSync(filePath);
|
|
51
84
|
isDirectory = stats.isDirectory();
|
|
52
85
|
}
|
|
53
86
|
catch (_a) {
|
|
@@ -65,26 +98,43 @@ const createApp = (directory, currentLocation = __dirname) => {
|
|
|
65
98
|
return app;
|
|
66
99
|
};
|
|
67
100
|
exports.createApp = createApp;
|
|
68
|
-
const setupWatcher = (directory, server) => {
|
|
101
|
+
const setupWatcher = (directory, server, port) => {
|
|
69
102
|
const wss = new ws_1.WebSocketServer({ server });
|
|
103
|
+
wss.on('listening', () => {
|
|
104
|
+
console.log(`🚀 WebSocket server listening at ws://localhost:${port}`);
|
|
105
|
+
});
|
|
106
|
+
wss.on('connection', () => {
|
|
107
|
+
console.log('🤝 Livereload Client connected');
|
|
108
|
+
wss.on('close', () => {
|
|
109
|
+
console.log('👋 Livereload Client closed');
|
|
110
|
+
});
|
|
111
|
+
wss.on('wsClientError', (e) => {
|
|
112
|
+
console.error('🚫 Error on WebSocket server:', e);
|
|
113
|
+
});
|
|
114
|
+
wss.on('error', (e) => {
|
|
115
|
+
console.error('🚫 Error on WebSocket server:', e);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
70
118
|
const isMarkdownOrSimpleAsset = (filePath) => {
|
|
71
119
|
const ext = filePath.toLowerCase().split('.').pop();
|
|
72
|
-
return (ext
|
|
73
|
-
(ext === 'md' ||
|
|
74
|
-
ext === 'markdown' ||
|
|
75
|
-
ext === 'png' ||
|
|
76
|
-
ext === 'jpg' ||
|
|
77
|
-
ext === 'jpeg' ||
|
|
78
|
-
ext === 'gif' ||
|
|
79
|
-
ext === 'svg'));
|
|
120
|
+
return ext && (ext === 'md' || ext === 'markdown');
|
|
80
121
|
};
|
|
81
|
-
let watcher;
|
|
122
|
+
let watcher = null;
|
|
82
123
|
try {
|
|
83
124
|
watcher = chokidar_1.default.watch(directory, {
|
|
84
125
|
ignored: (watchedFilePath) => {
|
|
85
126
|
if (watchedFilePath.includes('node_modules')) {
|
|
86
127
|
return true;
|
|
87
128
|
}
|
|
129
|
+
try {
|
|
130
|
+
if (fs.statSync(watchedFilePath).isDirectory()) {
|
|
131
|
+
return false; // Don't ignore directories
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (_a) {
|
|
135
|
+
// On error (e.g., file not found), let chokidar handle it
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
88
138
|
return !isMarkdownOrSimpleAsset(watchedFilePath);
|
|
89
139
|
},
|
|
90
140
|
ignoreInitial: true,
|