diagram-tool 0.1.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 +64 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +239 -0
- package/dist/cli.js.map +1 -0
- package/dist/context.d.ts +27 -0
- package/dist/context.js +55 -0
- package/dist/context.js.map +1 -0
- package/dist/diagram.d.ts +51 -0
- package/dist/diagram.js +519 -0
- package/dist/diagram.js.map +1 -0
- package/dist/dom-shim.d.ts +1 -0
- package/dist/dom-shim.js +59 -0
- package/dist/dom-shim.js.map +1 -0
- package/dist/guide.d.ts +9 -0
- package/dist/guide.js +99 -0
- package/dist/guide.js.map +1 -0
- package/dist/library.d.ts +76 -0
- package/dist/library.js +364 -0
- package/dist/library.js.map +1 -0
- package/dist/llm.d.ts +23 -0
- package/dist/llm.js +124 -0
- package/dist/llm.js.map +1 -0
- package/dist/mcp-install.d.ts +1 -0
- package/dist/mcp-install.js +68 -0
- package/dist/mcp-install.js.map +1 -0
- package/dist/mcp.d.ts +6 -0
- package/dist/mcp.js +262 -0
- package/dist/mcp.js.map +1 -0
- package/dist/public/Assistant-Bold-ZDZZ6JHA.woff2 +0 -0
- package/dist/public/Assistant-Medium-DZ25RZU3.woff2 +0 -0
- package/dist/public/Assistant-Regular-PLF2XOGW.woff2 +0 -0
- package/dist/public/Assistant-SemiBold-CZ5MX6FK.woff2 +0 -0
- package/dist/public/viewer.css +2 -0
- package/dist/public/viewer.css.map +7 -0
- package/dist/public/viewer.js +3092 -0
- package/dist/public/viewer.js.map +7 -0
- package/dist/server.d.ts +9 -0
- package/dist/server.js +166 -0
- package/dist/server.js.map +1 -0
- package/libraries/UML-ER-library.excalidrawlib +5380 -0
- package/libraries/awesome-icons.excalidrawlib +4081 -0
- package/libraries/dev_ops.excalidrawlib +35468 -0
- package/libraries/network-topology-icons.excalidrawlib +5290 -0
- package/libraries/system-icons.excalidrawlib +4521 -0
- package/libraries/systemdesignicons.excalidrawlib +1307 -0
- package/package.json +38 -0
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function serve(contextPath: string, port: number): Promise<void>;
|
|
2
|
+
export interface StartedServer {
|
|
3
|
+
url: string;
|
|
4
|
+
port: number;
|
|
5
|
+
close: () => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
/** Non-blocking start for embedding (MCP server). Shares buildApp with serve().
|
|
8
|
+
* Falls back to a free port on EADDRINUSE; url always reflects the actual port. */
|
|
9
|
+
export declare function startServer(contextPath: string, port: number): Promise<StartedServer>;
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { watch } from "node:fs";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { join, dirname, extname } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { Hono } from "hono";
|
|
6
|
+
import { serve as serveHono } from "@hono/node-server";
|
|
7
|
+
import { streamSSE } from "hono/streaming";
|
|
8
|
+
import { loadContext, saveContext } from "./context.js";
|
|
9
|
+
import { loadLibraryItems, libraryDir } from "./library.js";
|
|
10
|
+
const HERE = dirname(fileURLToPath(import.meta.url)); // dist/
|
|
11
|
+
const PUBLIC = join(HERE, "public");
|
|
12
|
+
const SHELL = `<!doctype html>
|
|
13
|
+
<html><head><meta charset="utf-8"><title>Diagram Tool</title>
|
|
14
|
+
<link rel="stylesheet" href="/viewer.css">
|
|
15
|
+
<style>html,body{margin:0;height:100%}#app{height:100%}</style>
|
|
16
|
+
</head><body>
|
|
17
|
+
<div id="app"><div style="padding:24px;font-family:system-ui">loading…</div></div>
|
|
18
|
+
<script type="module" src="/viewer.js"></script>
|
|
19
|
+
</body></html>`;
|
|
20
|
+
const STATIC_TYPES = {
|
|
21
|
+
".js": "application/javascript",
|
|
22
|
+
".css": "text/css",
|
|
23
|
+
".woff2": "font/woff2",
|
|
24
|
+
".woff": "font/woff",
|
|
25
|
+
".ttf": "font/ttf",
|
|
26
|
+
".png": "image/png",
|
|
27
|
+
".svg": "image/svg+xml",
|
|
28
|
+
".map": "application/json",
|
|
29
|
+
};
|
|
30
|
+
export async function serve(contextPath, port) {
|
|
31
|
+
const app = buildApp(contextPath);
|
|
32
|
+
await new Promise((resolve, reject) => {
|
|
33
|
+
try {
|
|
34
|
+
const server = serveHono({ fetch: app.fetch, port }, () => {
|
|
35
|
+
console.log(`\nDiagram live at http://localhost:${port} (context: ${contextPath}, Ctrl+C to stop)`);
|
|
36
|
+
resolve();
|
|
37
|
+
});
|
|
38
|
+
server.on("error", reject);
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
reject(e);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
await new Promise(() => { }); // run until killed
|
|
45
|
+
}
|
|
46
|
+
/** Non-blocking start for embedding (MCP server). Shares buildApp with serve().
|
|
47
|
+
* Falls back to a free port on EADDRINUSE; url always reflects the actual port. */
|
|
48
|
+
export async function startServer(contextPath, port) {
|
|
49
|
+
const app = buildApp(contextPath);
|
|
50
|
+
let server;
|
|
51
|
+
const listen = (p) => {
|
|
52
|
+
const s = serveHono({ fetch: app.fetch, port: p });
|
|
53
|
+
const on = s;
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
on.once("listening", () => resolve(s));
|
|
56
|
+
on.once("error", (err) => reject(err));
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
try {
|
|
60
|
+
server = await listen(port);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
if (e?.code === "EADDRINUSE" && port !== 0) {
|
|
64
|
+
server = await listen(0);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
throw e;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const actual = server.address().port;
|
|
71
|
+
const url = `http://localhost:${actual}`;
|
|
72
|
+
console.error(`Diagram live at ${url} (context: ${contextPath})`);
|
|
73
|
+
return {
|
|
74
|
+
url,
|
|
75
|
+
port: actual,
|
|
76
|
+
close: () => new Promise((resolve) => {
|
|
77
|
+
server.close(() => resolve());
|
|
78
|
+
}),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function buildApp(contextPath) {
|
|
82
|
+
const app = new Hono();
|
|
83
|
+
app.get("/", (c) => c.html(SHELL));
|
|
84
|
+
app.get("/api/context", async (c) => {
|
|
85
|
+
try {
|
|
86
|
+
return c.json(await loadContext(contextPath));
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
return c.text(`error: ${e instanceof Error ? e.message : String(e)}`, 500);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
app.post("/api/scene", async (c) => {
|
|
93
|
+
let body;
|
|
94
|
+
try {
|
|
95
|
+
body = (await c.req.json());
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return c.json({ error: "invalid JSON" }, 400);
|
|
99
|
+
}
|
|
100
|
+
if (!Array.isArray(body.elements))
|
|
101
|
+
return c.json({ error: "elements[] required" }, 400);
|
|
102
|
+
const current = await loadContext(contextPath);
|
|
103
|
+
if (typeof body.rev === "number" && body.rev !== current.rev) {
|
|
104
|
+
return c.json({ error: "rev conflict", context: current }, 409);
|
|
105
|
+
}
|
|
106
|
+
const next = await saveContext(contextPath, { elements: body.elements });
|
|
107
|
+
console.error(`[sync] rev ${current.rev} -> ${next.rev} (${body.elements.length} elements)`);
|
|
108
|
+
return c.json({ rev: next.rev });
|
|
109
|
+
});
|
|
110
|
+
app.get("/api/libraries", async (c) => {
|
|
111
|
+
const items = await loadLibraryItems(libraryDir());
|
|
112
|
+
return c.json(items.map((it) => ({ id: it.id, status: "published", elements: it.elements })));
|
|
113
|
+
});
|
|
114
|
+
// Live updates: watch the context file, push rev bumps over SSE.
|
|
115
|
+
// Viewer refetches /api/context on each event (small event, big payload stays on pull).
|
|
116
|
+
app.get("/api/live", (c) => {
|
|
117
|
+
return streamSSE(c, async (stream) => {
|
|
118
|
+
let lastRev = (await loadContext(contextPath).catch(() => ({ rev: -1 }))).rev;
|
|
119
|
+
await stream.writeSSE({ event: "hello", data: String(lastRev) });
|
|
120
|
+
const watcher = watch(contextPath, async () => {
|
|
121
|
+
try {
|
|
122
|
+
const ctx = await loadContext(contextPath);
|
|
123
|
+
if (ctx.rev !== lastRev) {
|
|
124
|
+
lastRev = ctx.rev;
|
|
125
|
+
await stream.writeSSE({ event: "rev", data: String(ctx.rev) });
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
/* context temporarily unreadable mid-write — next event retries */
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
stream.onAbort(() => watcher.close());
|
|
133
|
+
await new Promise((resolve) => stream.onAbort(() => resolve()));
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
app.get("/scene.excalidraw.json", async (c) => {
|
|
137
|
+
const ctx = await loadContext(contextPath);
|
|
138
|
+
return c.json({ ...ctx.scene, source: "diagram-tool", appState: {} });
|
|
139
|
+
});
|
|
140
|
+
app.get("/scene.mmd", async (c) => {
|
|
141
|
+
const ctx = await loadContext(contextPath);
|
|
142
|
+
return c.text(ctx.mermaidSource ? ctx.mermaidSource + "\n" : "");
|
|
143
|
+
});
|
|
144
|
+
// Pre-bundled viewer + fonts (dist/public, absolute path so CWD doesn't matter).
|
|
145
|
+
app.use("/*", async (c, next) => {
|
|
146
|
+
const p = c.req.path;
|
|
147
|
+
if (p.startsWith("/api/") || p === "/" || p === "/scene.excalidraw.json" || p === "/scene.mmd") {
|
|
148
|
+
return next();
|
|
149
|
+
}
|
|
150
|
+
if (!/^\/[A-Za-z0-9._-]+$/.test(p))
|
|
151
|
+
return c.text("not found", 404);
|
|
152
|
+
try {
|
|
153
|
+
const body = await readFile(join(PUBLIC, p.slice(1)));
|
|
154
|
+
const type = STATIC_TYPES[extname(p)] ?? "application/octet-stream";
|
|
155
|
+
const cache = p === "/viewer.js" || p === "/viewer.css" ? "no-store" : "max-age=86400";
|
|
156
|
+
c.header("content-type", type);
|
|
157
|
+
c.header("cache-control", cache);
|
|
158
|
+
return c.body(body);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return c.text("not found", 404);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
return app;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|