markmap-cli 0.15.7 → 0.15.8
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/dist/index.js +155 -37
- package/dist/util.d.ts +5 -0
- package/package.json +12 -11
package/dist/index.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import { readFile, stat, mkdir, writeFile } from "fs/promises";
|
|
2
|
-
import { resolve,
|
|
2
|
+
import { resolve, join, dirname } from "path";
|
|
3
3
|
import { fileURLToPath } from "url";
|
|
4
4
|
import { Command } from "commander";
|
|
5
5
|
import open from "open";
|
|
6
6
|
import updateNotifier from "update-notifier";
|
|
7
|
-
import { readPackageUp } from "read-
|
|
7
|
+
import { readPackageUp } from "read-package-up";
|
|
8
8
|
import { buildCSSItem, buildJSItem, defer } from "markmap-common";
|
|
9
9
|
import { Transformer, baseJsPaths } from "markmap-lib";
|
|
10
10
|
export * from "markmap-lib";
|
|
11
11
|
import { packageDirectory } from "pkg-dir";
|
|
12
12
|
import { createReadStream, createWriteStream } from "fs";
|
|
13
13
|
import { EventEmitter } from "events";
|
|
14
|
-
import
|
|
15
|
-
import
|
|
14
|
+
import { serve } from "@hono/node-server";
|
|
15
|
+
import { Hono } from "hono";
|
|
16
16
|
import chokidar from "chokidar";
|
|
17
17
|
import { Readable } from "stream";
|
|
18
18
|
import { finished } from "stream/promises";
|
|
19
|
-
const TOOLBAR_VERSION = "0.15.
|
|
19
|
+
const TOOLBAR_VERSION = "0.15.8";
|
|
20
20
|
const TOOLBAR_CSS = `markmap-toolbar@${TOOLBAR_VERSION}/dist/style.css`;
|
|
21
21
|
const TOOLBAR_JS = `markmap-toolbar@${TOOLBAR_VERSION}/dist/index.js`;
|
|
22
22
|
const ASSETS_PREFIX = "/assets/";
|
|
@@ -60,6 +60,114 @@ const assetsDirPromise = rootDirPromise.then((rootDir) => {
|
|
|
60
60
|
throw new Error("Could not find root dir");
|
|
61
61
|
return resolve(rootDir, `.${ASSETS_PREFIX}`);
|
|
62
62
|
});
|
|
63
|
+
function createStreamBody(stream) {
|
|
64
|
+
const body = new ReadableStream({
|
|
65
|
+
start(controller) {
|
|
66
|
+
stream.on("data", (chunk) => {
|
|
67
|
+
controller.enqueue(chunk);
|
|
68
|
+
});
|
|
69
|
+
stream.on("end", () => {
|
|
70
|
+
controller.close();
|
|
71
|
+
});
|
|
72
|
+
},
|
|
73
|
+
cancel() {
|
|
74
|
+
stream.destroy();
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
return body;
|
|
78
|
+
}
|
|
79
|
+
var getMimeType = (filename) => {
|
|
80
|
+
const regexp = /\.([a-zA-Z0-9]+?)$/;
|
|
81
|
+
const match = filename.match(regexp);
|
|
82
|
+
if (!match)
|
|
83
|
+
return;
|
|
84
|
+
let mimeType = mimes[match[1]];
|
|
85
|
+
if (mimeType && mimeType.startsWith("text") || mimeType === "application/json") {
|
|
86
|
+
mimeType += "; charset=utf-8";
|
|
87
|
+
}
|
|
88
|
+
return mimeType;
|
|
89
|
+
};
|
|
90
|
+
var mimes = {
|
|
91
|
+
aac: "audio/aac",
|
|
92
|
+
abw: "application/x-abiword",
|
|
93
|
+
arc: "application/x-freearc",
|
|
94
|
+
avi: "video/x-msvideo",
|
|
95
|
+
avif: "image/avif",
|
|
96
|
+
av1: "video/av1",
|
|
97
|
+
azw: "application/vnd.amazon.ebook",
|
|
98
|
+
bin: "application/octet-stream",
|
|
99
|
+
bmp: "image/bmp",
|
|
100
|
+
bz: "application/x-bzip",
|
|
101
|
+
bz2: "application/x-bzip2",
|
|
102
|
+
csh: "application/x-csh",
|
|
103
|
+
css: "text/css",
|
|
104
|
+
csv: "text/csv",
|
|
105
|
+
doc: "application/msword",
|
|
106
|
+
docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
107
|
+
eot: "application/vnd.ms-fontobject",
|
|
108
|
+
epub: "application/epub+zip",
|
|
109
|
+
gif: "image/gif",
|
|
110
|
+
gz: "application/gzip",
|
|
111
|
+
htm: "text/html",
|
|
112
|
+
html: "text/html",
|
|
113
|
+
ico: "image/x-icon",
|
|
114
|
+
ics: "text/calendar",
|
|
115
|
+
jar: "application/java-archive",
|
|
116
|
+
jpeg: "image/jpeg",
|
|
117
|
+
jpg: "image/jpeg",
|
|
118
|
+
js: "text/javascript",
|
|
119
|
+
json: "application/json",
|
|
120
|
+
jsonld: "application/ld+json",
|
|
121
|
+
map: "application/json",
|
|
122
|
+
mid: "audio/x-midi",
|
|
123
|
+
midi: "audio/x-midi",
|
|
124
|
+
mjs: "text/javascript",
|
|
125
|
+
mp3: "audio/mpeg",
|
|
126
|
+
mp4: "video/mp4",
|
|
127
|
+
mpeg: "video/mpeg",
|
|
128
|
+
mpkg: "application/vnd.apple.installer+xml",
|
|
129
|
+
odp: "application/vnd.oasis.opendocument.presentation",
|
|
130
|
+
ods: "application/vnd.oasis.opendocument.spreadsheet",
|
|
131
|
+
odt: "application/vnd.oasis.opendocument.text",
|
|
132
|
+
oga: "audio/ogg",
|
|
133
|
+
ogv: "video/ogg",
|
|
134
|
+
ogx: "application/ogg",
|
|
135
|
+
opus: "audio/opus",
|
|
136
|
+
otf: "font/otf",
|
|
137
|
+
pdf: "application/pdf",
|
|
138
|
+
php: "application/php",
|
|
139
|
+
png: "image/png",
|
|
140
|
+
ppt: "application/vnd.ms-powerpoint",
|
|
141
|
+
pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
142
|
+
rtf: "application/rtf",
|
|
143
|
+
sh: "application/x-sh",
|
|
144
|
+
svg: "image/svg+xml",
|
|
145
|
+
swf: "application/x-shockwave-flash",
|
|
146
|
+
tar: "application/x-tar",
|
|
147
|
+
tif: "image/tiff",
|
|
148
|
+
tiff: "image/tiff",
|
|
149
|
+
ts: "video/mp2t",
|
|
150
|
+
ttf: "font/ttf",
|
|
151
|
+
txt: "text/plain",
|
|
152
|
+
vsd: "application/vnd.visio",
|
|
153
|
+
wasm: "application/wasm",
|
|
154
|
+
webm: "video/webm",
|
|
155
|
+
weba: "audio/webm",
|
|
156
|
+
webp: "image/webp",
|
|
157
|
+
woff: "font/woff",
|
|
158
|
+
woff2: "font/woff2",
|
|
159
|
+
xhtml: "application/xhtml+xml",
|
|
160
|
+
xls: "application/vnd.ms-excel",
|
|
161
|
+
xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
162
|
+
xml: "application/xml",
|
|
163
|
+
xul: "application/vnd.mozilla.xul+xml",
|
|
164
|
+
zip: "application/zip",
|
|
165
|
+
"3gp": "video/3gpp",
|
|
166
|
+
"3g2": "video/3gpp2",
|
|
167
|
+
"7z": "application/x-7z-compressed",
|
|
168
|
+
gltf: "model/gltf+json",
|
|
169
|
+
glb: "model/gltf-binary"
|
|
170
|
+
};
|
|
63
171
|
function sequence(fn) {
|
|
64
172
|
let promise;
|
|
65
173
|
return () => {
|
|
@@ -148,7 +256,7 @@ function startServer(paddingBottom) {
|
|
|
148
256
|
const { mm, markmap } = window;
|
|
149
257
|
refresh();
|
|
150
258
|
function refresh() {
|
|
151
|
-
fetch(
|
|
259
|
+
fetch(`/~data?ts=${ts}`).then((res) => res.json()).then((res) => {
|
|
152
260
|
if (res.ts && res.ts > ts && res.result) {
|
|
153
261
|
let frontmatter;
|
|
154
262
|
({ root, frontmatter, contentLineOffset: offset } = res.result);
|
|
@@ -183,7 +291,7 @@ function startServer(paddingBottom) {
|
|
|
183
291
|
}
|
|
184
292
|
}
|
|
185
293
|
}
|
|
186
|
-
function setUpServer(transformer, provider, options) {
|
|
294
|
+
async function setUpServer(transformer, provider, options) {
|
|
187
295
|
let assets = transformer.getAssets();
|
|
188
296
|
if (options.toolbar)
|
|
189
297
|
assets = addToolbar(transformer.urlBuilder, assets);
|
|
@@ -191,38 +299,48 @@ function setUpServer(transformer, provider, options) {
|
|
|
191
299
|
null,
|
|
192
300
|
assets
|
|
193
301
|
)}<script>(${startServer.toString()})(${options.toolbar ? 60 : 0})<\/script>`;
|
|
194
|
-
const app = new
|
|
195
|
-
app.
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
const result = update.content == null ? null : transformer.transform(update.content || "");
|
|
201
|
-
ctx.body = { ts: update.ts, result, line: update.line };
|
|
202
|
-
} else {
|
|
203
|
-
if (ctx.path.startsWith(ASSETS_PREFIX)) {
|
|
204
|
-
const relpath = ctx.path.slice(ASSETS_PREFIX.length);
|
|
205
|
-
const assetsDir = await assetsDirPromise;
|
|
206
|
-
try {
|
|
207
|
-
const realpath = resolve(assetsDir, relpath);
|
|
208
|
-
ctx.type = extname(relpath);
|
|
209
|
-
ctx.body = createReadStream(realpath);
|
|
210
|
-
return;
|
|
211
|
-
} catch (err) {
|
|
212
|
-
console.error(err);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
await next();
|
|
216
|
-
}
|
|
302
|
+
const app = new Hono();
|
|
303
|
+
app.get("/", (c) => c.html(html));
|
|
304
|
+
app.get("/~data", async (c) => {
|
|
305
|
+
const update = await provider.getUpdate(+(c.req.query("ts") || 0));
|
|
306
|
+
const result = update.content == null ? null : transformer.transform(update.content || "");
|
|
307
|
+
return c.json({ ts: update.ts, result, line: update.line });
|
|
217
308
|
});
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
if (options.open)
|
|
224
|
-
open(`http://localhost:${port}`);
|
|
309
|
+
app.post("/~api", async (c) => {
|
|
310
|
+
var _a;
|
|
311
|
+
const { cmd, args } = await c.req.json();
|
|
312
|
+
await ((_a = provider[cmd]) == null ? void 0 : _a.call(provider, ...args));
|
|
313
|
+
return c.body(null, 204);
|
|
225
314
|
});
|
|
315
|
+
const assetsDir = await assetsDirPromise;
|
|
316
|
+
app.get(`${ASSETS_PREFIX}*`, async (c) => {
|
|
317
|
+
const relpath = c.req.path.slice(ASSETS_PREFIX.length);
|
|
318
|
+
const realpath = join(assetsDir, relpath);
|
|
319
|
+
try {
|
|
320
|
+
const result = await stat(realpath);
|
|
321
|
+
if (!result.isFile())
|
|
322
|
+
throw new Error("File not found");
|
|
323
|
+
} catch {
|
|
324
|
+
return c.body("File not found", 404);
|
|
325
|
+
}
|
|
326
|
+
const stream = createReadStream(realpath);
|
|
327
|
+
const type = getMimeType(relpath);
|
|
328
|
+
if (type)
|
|
329
|
+
c.header("content-type", type);
|
|
330
|
+
return c.body(createStreamBody(stream));
|
|
331
|
+
});
|
|
332
|
+
const server = serve(
|
|
333
|
+
{
|
|
334
|
+
fetch: app.fetch,
|
|
335
|
+
port: options.port
|
|
336
|
+
},
|
|
337
|
+
(info) => {
|
|
338
|
+
const { port } = info;
|
|
339
|
+
console.info(`Listening at http://localhost:${port}`);
|
|
340
|
+
if (options.open)
|
|
341
|
+
open(`http://localhost:${port}`);
|
|
342
|
+
}
|
|
343
|
+
);
|
|
226
344
|
let closing;
|
|
227
345
|
return {
|
|
228
346
|
provider,
|
package/dist/util.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { ReadStream } from 'fs';
|
|
1
3
|
import { UrlBuilder } from 'markmap-common';
|
|
2
4
|
import { IAssets } from 'markmap-lib';
|
|
3
5
|
export declare const ASSETS_PREFIX = "/assets/";
|
|
@@ -15,8 +17,11 @@ export interface IDevelopOptions {
|
|
|
15
17
|
* Ignored in watching mode.
|
|
16
18
|
*/
|
|
17
19
|
offline: boolean;
|
|
20
|
+
/** Port number for the devServer to listen. */
|
|
21
|
+
port?: number;
|
|
18
22
|
}
|
|
19
23
|
export declare function addToolbar(urlBuilder: UrlBuilder, assets: IAssets): IAssets;
|
|
20
24
|
export declare function localProvider(path: string): string;
|
|
21
25
|
export declare const rootDirPromise: Promise<string | undefined>;
|
|
22
26
|
export declare const assetsDirPromise: Promise<string>;
|
|
27
|
+
export declare function createStreamBody(stream: ReadStream): ReadableStream<any>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "markmap-cli",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.8",
|
|
4
4
|
"description": "Create markmaps from CLI",
|
|
5
5
|
"author": "Gerald <gera2ld@live.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -42,17 +42,18 @@
|
|
|
42
42
|
],
|
|
43
43
|
"typings": "dist/index.d.ts",
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@babel/runtime": "^7.
|
|
45
|
+
"@babel/runtime": "^7.23.6",
|
|
46
|
+
"@hono/node-server": "^1.3.3",
|
|
46
47
|
"chokidar": "^3.5.3",
|
|
47
|
-
"commander": "^11.
|
|
48
|
-
"
|
|
48
|
+
"commander": "^11.1.0",
|
|
49
|
+
"hono": "^3.11.8",
|
|
49
50
|
"markmap-common": "0.15.6",
|
|
50
|
-
"markmap-lib": "0.15.
|
|
51
|
-
"markmap-toolbar": "0.15.
|
|
52
|
-
"open": "^
|
|
53
|
-
"pkg-dir": "^
|
|
54
|
-
"read-
|
|
55
|
-
"update-notifier": "^
|
|
51
|
+
"markmap-lib": "0.15.8",
|
|
52
|
+
"markmap-toolbar": "0.15.8",
|
|
53
|
+
"open": "^10.0.0",
|
|
54
|
+
"pkg-dir": "^8.0.0",
|
|
55
|
+
"read-package-up": "^11.0.0",
|
|
56
|
+
"update-notifier": "^7.0.0"
|
|
56
57
|
},
|
|
57
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "d5a29ab4064a5496f879de04d730d7192461d3c5"
|
|
58
59
|
}
|