@luutuankiet/gsd-reader 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 +77 -0
- package/cli.cjs +215 -0
- package/dist/assets/_baseUniq-CIPUpMAZ.js +1 -0
- package/dist/assets/arc-Br99N0VK.js +1 -0
- package/dist/assets/architectureDiagram-VXUJARFQ-CnDgLlps.js +36 -0
- package/dist/assets/blockDiagram-VD42YOAC-DfC57oz9.js +122 -0
- package/dist/assets/c4Diagram-YG6GDRKO-CMOSglVb.js +10 -0
- package/dist/assets/channel-CQKYTGLH.js +1 -0
- package/dist/assets/chunk-4BX2VUAB-D6LBiRlQ.js +1 -0
- package/dist/assets/chunk-55IACEB6-BO539cu3.js +1 -0
- package/dist/assets/chunk-B4BG7PRW-D5sUsnig.js +165 -0
- package/dist/assets/chunk-DI55MBZ5-Bk_ryD3i.js +220 -0
- package/dist/assets/chunk-FMBD7UC4-Ra4v9gkm.js +15 -0
- package/dist/assets/chunk-QN33PNHL-t3oGvgwA.js +1 -0
- package/dist/assets/chunk-QZHKN3VN-auqEfnzi.js +1 -0
- package/dist/assets/chunk-TZMSLE5B-BJEML2bc.js +1 -0
- package/dist/assets/classDiagram-2ON5EDUG-iPflhCki.js +1 -0
- package/dist/assets/classDiagram-v2-WZHVMYZB-iPflhCki.js +1 -0
- package/dist/assets/clone-CBLy9m5M.js +1 -0
- package/dist/assets/cose-bilkent-S5V4N54A-Dnh7MK-o.js +1 -0
- package/dist/assets/cytoscape.esm-BQaXIfA_.js +331 -0
- package/dist/assets/dagre-6UL2VRFP-yqolbkxb.js +4 -0
- package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/assets/diagram-PSM6KHXK-DNlswJeO.js +24 -0
- package/dist/assets/diagram-QEK2KX5R-DIhPPMly.js +43 -0
- package/dist/assets/diagram-S2PKOQOG-BpsQU6g-.js +24 -0
- package/dist/assets/erDiagram-Q2GNP2WA-ekvtRHZe.js +60 -0
- package/dist/assets/flowDiagram-NV44I4VS-BZVzZirk.js +162 -0
- package/dist/assets/ganttDiagram-JELNMOA3-ZL-Lvri5.js +267 -0
- package/dist/assets/gitGraphDiagram-NY62KEGX-CWINqymz.js +65 -0
- package/dist/assets/graph-BwuUgdUo.js +1 -0
- package/dist/assets/index-DBfOfu2r.js +584 -0
- package/dist/assets/infoDiagram-WHAUD3N6-DEWOExRO.js +2 -0
- package/dist/assets/init-Gi6I4Gst.js +1 -0
- package/dist/assets/journeyDiagram-XKPGCS4Q-DKXUBm8W.js +139 -0
- package/dist/assets/kanban-definition-3W4ZIXB7-BWGprGSC.js +89 -0
- package/dist/assets/katex-CBSAILhF.js +261 -0
- package/dist/assets/layout-CvO1_uww.js +1 -0
- package/dist/assets/linear-CEwiQp1W.js +1 -0
- package/dist/assets/mermaid.core-Bwyq-ixB.js +256 -0
- package/dist/assets/min-DoNrXYhX.js +1 -0
- package/dist/assets/mindmap-definition-VGOIOE7T-CM8WjOQr.js +68 -0
- package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/assets/pieDiagram-ADFJNKIX-C8s15H7H.js +30 -0
- package/dist/assets/quadrantDiagram-AYHSOK5B-D0g5wxCs.js +7 -0
- package/dist/assets/requirementDiagram-UZGBJVZJ-BZrk_Yop.js +64 -0
- package/dist/assets/sankeyDiagram-TZEHDZUN-DDmydxiD.js +10 -0
- package/dist/assets/sequenceDiagram-WL72ISMW-BFNOA8XU.js +145 -0
- package/dist/assets/stateDiagram-FKZM4ZOC-BWdtvbgT.js +1 -0
- package/dist/assets/stateDiagram-v2-4FDKWEC3-XQx3VZwI.js +1 -0
- package/dist/assets/timeline-definition-IT6M3QCI-D0HUIjfN.js +61 -0
- package/dist/assets/treemap-KMMF4GRG-B_Gv7V-c.js +128 -0
- package/dist/assets/xychartDiagram-PRI3JC2R-B8ImiHYg.js +7 -0
- package/dist/index.html +589 -0
- package/package.json +48 -0
package/README.md
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# GSD-Lite Worklog Reader (Vite)
|
|
2
|
+
|
|
3
|
+
Hot-reloading viewer for GSD-Lite WORK.md files. When you edit WORK.md, the browser updates instantly.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
cd plugins/reader-vite
|
|
9
|
+
|
|
10
|
+
# Install dependencies (one-time)
|
|
11
|
+
pnpm install
|
|
12
|
+
|
|
13
|
+
# Start dev server (watches ../../gsd-lite/WORK.md by default)
|
|
14
|
+
pnpm dev
|
|
15
|
+
|
|
16
|
+
# Or specify a custom WORK.md path:
|
|
17
|
+
WORKLOG_PATH=../../../other-project/gsd-lite/WORK.md pnpm dev
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Then open http://localhost:3000 β the page auto-refreshes when WORK.md changes.
|
|
21
|
+
|
|
22
|
+
## Features
|
|
23
|
+
|
|
24
|
+
- π₯ **Hot Reload** β Browser updates instantly when WORK.md changes (no manual refresh)
|
|
25
|
+
- π **Mermaid Diagrams** β Native SVG rendering with error handling
|
|
26
|
+
- π¨ **Full Markdown** β Tables, code blocks, lists, links, strikethrough
|
|
27
|
+
- π± **Mobile Ready** β Responsive layout, touch-friendly navigation
|
|
28
|
+
- β‘ **Fast** β Vite's instant HMR, sub-second rebuilds
|
|
29
|
+
|
|
30
|
+
## How It Works
|
|
31
|
+
|
|
32
|
+
The Vite plugin (`src/vite-plugin-worklog.ts`) does three things:
|
|
33
|
+
|
|
34
|
+
1. **Watches** β Uses chokidar to monitor the external WORK.md file
|
|
35
|
+
2. **Serves** β Exposes `/_worklog` endpoint that returns the file content
|
|
36
|
+
3. **Pushes** β Sends HMR events to the browser when the file changes
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
βββββββββββββββββββ ββββββββββββββββββββββββ βββββββββββββββ
|
|
40
|
+
β WORK.md ββββββΆβ vite-plugin-worklog ββββββΆβ Browser β
|
|
41
|
+
β (external) β β (watch + serve) β β (HMR) β
|
|
42
|
+
βββββββββββββββββββ ββββββββββββββββββββββββ βββββββββββββββ
|
|
43
|
+
β β β
|
|
44
|
+
β chokidar detects β WebSocket push β re-fetch
|
|
45
|
+
β file change β 'worklog-update' β & re-render
|
|
46
|
+
βΌ βΌ βΌ
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Architecture
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
src/
|
|
53
|
+
βββ main.ts # Entry point, HMR setup, Mermaid init
|
|
54
|
+
βββ parser.ts # WORK.md β WorklogAST
|
|
55
|
+
βββ renderer.ts # WorklogAST β HTML
|
|
56
|
+
βββ types.ts # TypeScript interfaces
|
|
57
|
+
βββ vite-plugin-worklog.ts # Custom Vite plugin for file watching
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Configuration
|
|
61
|
+
|
|
62
|
+
| Environment Variable | Default | Description |
|
|
63
|
+
|---------------------|---------|-------------|
|
|
64
|
+
| `WORKLOG_PATH` | `../../gsd-lite/WORK.md` | Path to WORK.md (relative to plugin root) |
|
|
65
|
+
|
|
66
|
+
## Build (Static Export)
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Build static HTML for sharing/mobile (TODO: READER-002e)
|
|
70
|
+
pnpm build
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Related Logs
|
|
74
|
+
|
|
75
|
+
- **LOG-047** β Original Worklog Reader vision
|
|
76
|
+
- **LOG-048** β Python POC implementation
|
|
77
|
+
- **LOG-049** β Decision to pivot to Node/TypeScript + Vite
|
package/cli.cjs
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GSD-Lite Worklog Reader CLI
|
|
5
|
+
*
|
|
6
|
+
* A lightweight server for viewing WORK.md files with live reload.
|
|
7
|
+
* Uses chokidar for native file watching and WebSocket for push updates.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* npx @gsd-lite/reader [path-to-worklog] [--port=3000]
|
|
11
|
+
*
|
|
12
|
+
* Examples:
|
|
13
|
+
* npx @gsd-lite/reader # Watch ./gsd-lite/WORK.md on :3000
|
|
14
|
+
* npx @gsd-lite/reader ./my-project/WORK.md # Custom path
|
|
15
|
+
* npx @gsd-lite/reader --port=3001 # Custom port
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const http = require('http');
|
|
19
|
+
const fs = require('fs');
|
|
20
|
+
const path = require('path');
|
|
21
|
+
const { WebSocketServer } = require('ws');
|
|
22
|
+
const chokidar = require('chokidar');
|
|
23
|
+
|
|
24
|
+
// =============================================================================
|
|
25
|
+
// Configuration
|
|
26
|
+
// =============================================================================
|
|
27
|
+
|
|
28
|
+
// Parse command line arguments
|
|
29
|
+
const args = process.argv.slice(2);
|
|
30
|
+
|
|
31
|
+
// Find port from --port=XXXX argument
|
|
32
|
+
const portArg = args.find(a => a.startsWith('--port='));
|
|
33
|
+
const PORT = parseInt(portArg?.split('=')[1] || process.env.PORT || '3000', 10);
|
|
34
|
+
|
|
35
|
+
// First non-flag argument is the worklog path
|
|
36
|
+
const WORKLOG = args.find(a => !a.startsWith('--')) || './gsd-lite/WORK.md';
|
|
37
|
+
const WORKLOG_PATH = path.resolve(WORKLOG);
|
|
38
|
+
|
|
39
|
+
// Static assets directory (bundled with this package)
|
|
40
|
+
const DIST = path.join(__dirname, 'dist');
|
|
41
|
+
|
|
42
|
+
// MIME types for static file serving
|
|
43
|
+
const MIME_TYPES = {
|
|
44
|
+
'.html': 'text/html',
|
|
45
|
+
'.js': 'application/javascript',
|
|
46
|
+
'.css': 'text/css',
|
|
47
|
+
'.json': 'application/json',
|
|
48
|
+
'.png': 'image/png',
|
|
49
|
+
'.jpg': 'image/jpeg',
|
|
50
|
+
'.gif': 'image/gif',
|
|
51
|
+
'.svg': 'image/svg+xml',
|
|
52
|
+
'.ico': 'image/x-icon',
|
|
53
|
+
'.woff': 'font/woff',
|
|
54
|
+
'.woff2': 'font/woff2',
|
|
55
|
+
'.ttf': 'font/ttf',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// =============================================================================
|
|
59
|
+
// HTTP Server
|
|
60
|
+
// =============================================================================
|
|
61
|
+
|
|
62
|
+
const server = http.createServer((req, res) => {
|
|
63
|
+
const url = new URL(req.url, `http://${req.headers.host}`);
|
|
64
|
+
const pathname = url.pathname;
|
|
65
|
+
|
|
66
|
+
// API endpoint: serve WORK.md content
|
|
67
|
+
if (pathname === '/_worklog') {
|
|
68
|
+
try {
|
|
69
|
+
const content = fs.readFileSync(WORKLOG_PATH, 'utf-8');
|
|
70
|
+
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
|
|
71
|
+
res.setHeader('Cache-Control', 'no-cache');
|
|
72
|
+
res.end(content);
|
|
73
|
+
} catch (err) {
|
|
74
|
+
res.statusCode = 404;
|
|
75
|
+
res.setHeader('Content-Type', 'text/plain');
|
|
76
|
+
res.end(`WORK.md not found: ${WORKLOG_PATH}\n\nError: ${err.message}`);
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Static file serving from dist/
|
|
82
|
+
let filePath = pathname === '/' ? '/index.html' : pathname;
|
|
83
|
+
const fullPath = path.join(DIST, filePath);
|
|
84
|
+
|
|
85
|
+
// Security: prevent directory traversal
|
|
86
|
+
if (!fullPath.startsWith(DIST)) {
|
|
87
|
+
res.statusCode = 403;
|
|
88
|
+
res.end('Forbidden');
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Check if file exists
|
|
93
|
+
if (!fs.existsSync(fullPath)) {
|
|
94
|
+
// SPA fallback: serve index.html for non-file routes
|
|
95
|
+
const indexPath = path.join(DIST, 'index.html');
|
|
96
|
+
if (fs.existsSync(indexPath)) {
|
|
97
|
+
serveFile(indexPath, '.html', res);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
res.statusCode = 404;
|
|
101
|
+
res.end('Not found');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Serve the file
|
|
106
|
+
const ext = path.extname(fullPath).toLowerCase();
|
|
107
|
+
serveFile(fullPath, ext, res);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
function serveFile(filePath, ext, res) {
|
|
111
|
+
const mimeType = MIME_TYPES[ext] || 'application/octet-stream';
|
|
112
|
+
|
|
113
|
+
try {
|
|
114
|
+
const content = fs.readFileSync(filePath);
|
|
115
|
+
res.setHeader('Content-Type', mimeType);
|
|
116
|
+
res.setHeader('Cache-Control', 'public, max-age=3600');
|
|
117
|
+
res.end(content);
|
|
118
|
+
} catch (err) {
|
|
119
|
+
res.statusCode = 500;
|
|
120
|
+
res.end(`Error reading file: ${err.message}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// =============================================================================
|
|
125
|
+
// WebSocket Server (Live Reload)
|
|
126
|
+
// =============================================================================
|
|
127
|
+
|
|
128
|
+
const wss = new WebSocketServer({ server });
|
|
129
|
+
|
|
130
|
+
wss.on('connection', (ws) => {
|
|
131
|
+
console.log('[gsd-reader] Client connected');
|
|
132
|
+
|
|
133
|
+
ws.on('close', () => {
|
|
134
|
+
console.log('[gsd-reader] Client disconnected');
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
function broadcastReload() {
|
|
139
|
+
let clientCount = 0;
|
|
140
|
+
wss.clients.forEach((client) => {
|
|
141
|
+
if (client.readyState === 1) { // WebSocket.OPEN
|
|
142
|
+
client.send('reload');
|
|
143
|
+
clientCount++;
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
if (clientCount > 0) {
|
|
147
|
+
console.log(`[gsd-reader] Notified ${clientCount} client(s)`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// =============================================================================
|
|
152
|
+
// File Watcher (Chokidar)
|
|
153
|
+
// =============================================================================
|
|
154
|
+
|
|
155
|
+
// Check if worklog exists before starting
|
|
156
|
+
if (!fs.existsSync(WORKLOG_PATH)) {
|
|
157
|
+
console.error(`\nβ WORK.md not found: ${WORKLOG_PATH}`);
|
|
158
|
+
console.error('\nUsage: npx @gsd-lite/reader [path-to-worklog] [--port=3000]');
|
|
159
|
+
console.error('\nExamples:');
|
|
160
|
+
console.error(' npx @gsd-lite/reader # Watch ./gsd-lite/WORK.md');
|
|
161
|
+
console.error(' npx @gsd-lite/reader ./my-project/WORK.md # Custom path');
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Watch the worklog file
|
|
166
|
+
const watcher = chokidar.watch(WORKLOG_PATH, {
|
|
167
|
+
persistent: true,
|
|
168
|
+
ignoreInitial: true,
|
|
169
|
+
awaitWriteFinish: {
|
|
170
|
+
stabilityThreshold: 100,
|
|
171
|
+
pollInterval: 50,
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
watcher.on('change', (filepath) => {
|
|
176
|
+
console.log(`[gsd-reader] ${path.basename(filepath)} changed`);
|
|
177
|
+
broadcastReload();
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
watcher.on('error', (error) => {
|
|
181
|
+
console.error('[gsd-reader] Watcher error:', error.message);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
// =============================================================================
|
|
185
|
+
// Startup
|
|
186
|
+
// =============================================================================
|
|
187
|
+
|
|
188
|
+
server.listen(PORT, () => {
|
|
189
|
+
console.log('');
|
|
190
|
+
console.log('βββββββββββββββββββββββββββββββββββββββββββββββββββββββ');
|
|
191
|
+
console.log('β π GSD-Lite Worklog Reader β');
|
|
192
|
+
console.log('βββββββββββββββββββββββββββββββββββββββββββββββββββββββ€');
|
|
193
|
+
console.log(`β Server: http://localhost:${PORT.toString().padEnd(25)}β`);
|
|
194
|
+
console.log(`β Watching: ${path.basename(WORKLOG_PATH).padEnd(40)}β`);
|
|
195
|
+
console.log('βββββββββββββββββββββββββββββββββββββββββββββββββββββββ€');
|
|
196
|
+
console.log('β Press Ctrl+C to stop β');
|
|
197
|
+
console.log('βββββββββββββββββββββββββββββββββββββββββββββββββββββββ');
|
|
198
|
+
console.log('');
|
|
199
|
+
console.log(`[gsd-reader] Full path: ${WORKLOG_PATH}`);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
// Graceful shutdown
|
|
203
|
+
process.on('SIGINT', () => {
|
|
204
|
+
console.log('\n[gsd-reader] Shutting down...');
|
|
205
|
+
watcher.close();
|
|
206
|
+
wss.close();
|
|
207
|
+
server.close(() => {
|
|
208
|
+
console.log('[gsd-reader] Goodbye!');
|
|
209
|
+
process.exit(0);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
process.on('SIGTERM', () => {
|
|
214
|
+
process.emit('SIGINT');
|
|
215
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{aU as L,bq as ln,aE as A,aS as P,aD as z,br as gn,bs as dn,bt as hn,bu as W,bv as pn,bl as An,bw as m,aV as N,a_ as U,b1 as T,bx as _n,aY as on,by as wn,bo as On,aF as V,bm as vn,bz as I}from"./mermaid.core-Bwyq-ixB.js";var Pn="[object Symbol]";function x(n){return typeof n=="symbol"||L(n)&&ln(n)==Pn}function yn(n,r){for(var e=-1,i=n==null?0:n.length,f=Array(i);++e<i;)f[e]=r(n[e],e,n);return f}var B=P?P.prototype:void 0,K=B?B.toString:void 0;function k(n){if(typeof n=="string")return n;if(A(n))return yn(n,k)+"";if(x(n))return K?K.call(n):"";var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function En(){}function bn(n,r){for(var e=-1,i=n==null?0:n.length;++e<i&&r(n[e],e,n)!==!1;);return n}function cn(n,r,e,i){for(var f=n.length,t=e+-1;++t<f;)if(r(n[t],t,n))return t;return-1}function Tn(n){return n!==n}function Rn(n,r,e){for(var i=e-1,f=n.length;++i<f;)if(n[i]===r)return i;return-1}function In(n,r,e){return r===r?Rn(n,r,e):cn(n,Tn,e)}function Sn(n,r){var e=n==null?0:n.length;return!!e&&In(n,r,0)>-1}function M(n){return z(n)?gn(n):dn(n)}var Ln=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,xn=/^\w*$/;function $(n,r){if(A(n))return!1;var e=typeof n;return e=="number"||e=="symbol"||e=="boolean"||n==null||x(n)?!0:xn.test(n)||!Ln.test(n)||r!=null&&n in Object(r)}var Mn=500;function $n(n){var r=hn(n,function(i){return e.size===Mn&&e.clear(),i}),e=r.cache;return r}var Cn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Dn=/\\(\\)?/g,Fn=$n(function(n){var r=[];return n.charCodeAt(0)===46&&r.push(""),n.replace(Cn,function(e,i,f,t){r.push(f?t.replace(Dn,"$1"):i||e)}),r});function Gn(n){return n==null?"":k(n)}function j(n,r){return A(n)?n:$(n,r)?[n]:Fn(Gn(n))}function R(n){if(typeof n=="string"||x(n))return n;var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function nn(n,r){r=j(r,n);for(var e=0,i=r.length;n!=null&&e<i;)n=n[R(r[e++])];return e&&e==i?n:void 0}function mn(n,r,e){var i=n==null?void 0:nn(n,r);return i===void 0?e:i}function rn(n,r){for(var e=-1,i=r.length,f=n.length;++e<i;)n[f+e]=r[e];return n}var H=P?P.isConcatSpreadable:void 0;function Nn(n){return A(n)||W(n)||!!(H&&n&&n[H])}function Hr(n,r,e,i,f){var t=-1,s=n.length;for(e||(e=Nn),f||(f=[]);++t<s;){var u=n[t];e(u)?rn(f,u):i||(f[f.length]=u)}return f}function Un(n,r,e,i){var f=-1,t=n==null?0:n.length;for(i&&t&&(e=n[++f]);++f<t;)e=r(e,n[f],f,n);return e}function en(n,r){for(var e=-1,i=n==null?0:n.length,f=0,t=[];++e<i;){var s=n[e];r(s,e,n)&&(t[f++]=s)}return t}function Bn(){return[]}var Kn=Object.prototype,Hn=Kn.propertyIsEnumerable,q=Object.getOwnPropertySymbols,qn=q?function(n){return n==null?[]:(n=Object(n),en(q(n),function(r){return Hn.call(n,r)}))}:Bn;function Yn(n,r,e){var i=r(n);return A(n)?i:rn(i,e(n))}function Y(n){return Yn(n,M,qn)}var Zn="__lodash_hash_undefined__";function Xn(n){return this.__data__.set(n,Zn),this}function Jn(n){return this.__data__.has(n)}function y(n){var r=-1,e=n==null?0:n.length;for(this.__data__=new pn;++r<e;)this.add(n[r])}y.prototype.add=y.prototype.push=Xn;y.prototype.has=Jn;function Qn(n,r){for(var e=-1,i=n==null?0:n.length;++e<i;)if(r(n[e],e,n))return!0;return!1}function tn(n,r){return n.has(r)}var zn=1,Wn=2;function fn(n,r,e,i,f,t){var s=e&zn,u=n.length,a=r.length;if(u!=a&&!(s&&a>u))return!1;var h=t.get(n),g=t.get(r);if(h&&g)return h==r&&g==n;var l=-1,d=!0,o=e&Wn?new y:void 0;for(t.set(n,r),t.set(r,n);++l<u;){var p=n[l],_=r[l];if(i)var w=s?i(_,p,l,r,n,t):i(p,_,l,n,r,t);if(w!==void 0){if(w)continue;d=!1;break}if(o){if(!Qn(r,function(O,v){if(!tn(o,v)&&(p===O||f(p,O,e,i,t)))return o.push(v)})){d=!1;break}}else if(!(p===_||f(p,_,e,i,t))){d=!1;break}}return t.delete(n),t.delete(r),d}function Vn(n){var r=-1,e=Array(n.size);return n.forEach(function(i,f){e[++r]=[f,i]}),e}function C(n){var r=-1,e=Array(n.size);return n.forEach(function(i){e[++r]=i}),e}var kn=1,jn=2,nr="[object Boolean]",rr="[object Date]",er="[object Error]",ir="[object Map]",tr="[object Number]",fr="[object RegExp]",sr="[object Set]",ur="[object String]",ar="[object Symbol]",lr="[object ArrayBuffer]",gr="[object DataView]",Z=P?P.prototype:void 0,S=Z?Z.valueOf:void 0;function dr(n,r,e,i,f,t,s){switch(e){case gr:if(n.byteLength!=r.byteLength||n.byteOffset!=r.byteOffset)return!1;n=n.buffer,r=r.buffer;case lr:return!(n.byteLength!=r.byteLength||!t(new m(n),new m(r)));case nr:case rr:case tr:return An(+n,+r);case er:return n.name==r.name&&n.message==r.message;case fr:case ur:return n==r+"";case ir:var u=Vn;case sr:var a=i&kn;if(u||(u=C),n.size!=r.size&&!a)return!1;var h=s.get(n);if(h)return h==r;i|=jn,s.set(n,r);var g=fn(u(n),u(r),i,f,t,s);return s.delete(n),g;case ar:if(S)return S.call(n)==S.call(r)}return!1}var hr=1,pr=Object.prototype,Ar=pr.hasOwnProperty;function _r(n,r,e,i,f,t){var s=e&hr,u=Y(n),a=u.length,h=Y(r),g=h.length;if(a!=g&&!s)return!1;for(var l=a;l--;){var d=u[l];if(!(s?d in r:Ar.call(r,d)))return!1}var o=t.get(n),p=t.get(r);if(o&&p)return o==r&&p==n;var _=!0;t.set(n,r),t.set(r,n);for(var w=s;++l<a;){d=u[l];var O=n[d],v=r[d];if(i)var G=s?i(v,O,d,r,n,t):i(O,v,d,n,r,t);if(!(G===void 0?O===v||f(O,v,e,i,t):G)){_=!1;break}w||(w=d=="constructor")}if(_&&!w){var E=n.constructor,b=r.constructor;E!=b&&"constructor"in n&&"constructor"in r&&!(typeof E=="function"&&E instanceof E&&typeof b=="function"&&b instanceof b)&&(_=!1)}return t.delete(n),t.delete(r),_}var or=1,X="[object Arguments]",J="[object Array]",c="[object Object]",wr=Object.prototype,Q=wr.hasOwnProperty;function Or(n,r,e,i,f,t){var s=A(n),u=A(r),a=s?J:N(n),h=u?J:N(r);a=a==X?c:a,h=h==X?c:h;var g=a==c,l=h==c,d=a==h;if(d&&U(n)){if(!U(r))return!1;s=!0,g=!1}if(d&&!g)return t||(t=new T),s||_n(n)?fn(n,r,e,i,f,t):dr(n,r,a,e,i,f,t);if(!(e&or)){var o=g&&Q.call(n,"__wrapped__"),p=l&&Q.call(r,"__wrapped__");if(o||p){var _=o?n.value():n,w=p?r.value():r;return t||(t=new T),f(_,w,e,i,t)}}return d?(t||(t=new T),_r(n,r,e,i,f,t)):!1}function D(n,r,e,i,f){return n===r?!0:n==null||r==null||!L(n)&&!L(r)?n!==n&&r!==r:Or(n,r,e,i,D,f)}var vr=1,Pr=2;function yr(n,r,e,i){var f=e.length,t=f;if(n==null)return!t;for(n=Object(n);f--;){var s=e[f];if(s[2]?s[1]!==n[s[0]]:!(s[0]in n))return!1}for(;++f<t;){s=e[f];var u=s[0],a=n[u],h=s[1];if(s[2]){if(a===void 0&&!(u in n))return!1}else{var g=new T,l;if(!(l===void 0?D(h,a,vr|Pr,i,g):l))return!1}}return!0}function sn(n){return n===n&&!on(n)}function Er(n){for(var r=M(n),e=r.length;e--;){var i=r[e],f=n[i];r[e]=[i,f,sn(f)]}return r}function un(n,r){return function(e){return e==null?!1:e[n]===r&&(r!==void 0||n in Object(e))}}function br(n){var r=Er(n);return r.length==1&&r[0][2]?un(r[0][0],r[0][1]):function(e){return e===n||yr(e,n,r)}}function cr(n,r){return n!=null&&r in Object(n)}function Tr(n,r,e){r=j(r,n);for(var i=-1,f=r.length,t=!1;++i<f;){var s=R(r[i]);if(!(t=n!=null&&e(n,s)))break;n=n[s]}return t||++i!=f?t:(f=n==null?0:n.length,!!f&&wn(f)&&On(s,f)&&(A(n)||W(n)))}function Rr(n,r){return n!=null&&Tr(n,r,cr)}var Ir=1,Sr=2;function Lr(n,r){return $(n)&&sn(r)?un(R(n),r):function(e){var i=mn(e,n);return i===void 0&&i===r?Rr(e,n):D(r,i,Ir|Sr)}}function xr(n){return function(r){return r==null?void 0:r[n]}}function Mr(n){return function(r){return nn(r,n)}}function $r(n){return $(n)?xr(R(n)):Mr(n)}function an(n){return typeof n=="function"?n:n==null?V:typeof n=="object"?A(n)?Lr(n[0],n[1]):br(n):$r(n)}function Cr(n,r){return n&&vn(n,r,M)}function Dr(n,r){return function(e,i){if(e==null)return e;if(!z(e))return n(e,i);for(var f=e.length,t=-1,s=Object(e);++t<f&&i(s[t],t,s)!==!1;);return e}}var F=Dr(Cr);function Fr(n){return typeof n=="function"?n:V}function qr(n,r){var e=A(n)?bn:F;return e(n,Fr(r))}function Gr(n,r){var e=[];return F(n,function(i,f,t){r(i,f,t)&&e.push(i)}),e}function Yr(n,r){var e=A(n)?en:Gr;return e(n,an(r))}function mr(n,r,e,i,f){return f(n,function(t,s,u){e=i?(i=!1,t):r(e,t,s,u)}),e}function Zr(n,r,e){var i=A(n)?Un:mr,f=arguments.length<3;return i(n,an(r),e,f,F)}var Nr=1/0,Ur=I&&1/C(new I([,-0]))[1]==Nr?function(n){return new I(n)}:En,Br=200;function Xr(n,r,e){var i=-1,f=Sn,t=n.length,s=!0,u=[],a=u;if(t>=Br){var h=r?null:Ur(n);if(h)return C(h);s=!1,f=tn,a=new y}else a=r?[]:u;n:for(;++i<t;){var g=n[i],l=r?r(g):g;if(g=g!==0?g:0,s&&l===l){for(var d=a.length;d--;)if(a[d]===l)continue n;r&&a.push(l),u.push(g)}else f(a,l,e)||(a!==u&&a.push(l),u.push(g))}return u}export{F as a,Hr as b,an as c,yn as d,rn as e,Yn as f,qn as g,bn as h,x as i,Y as j,M as k,Xr as l,Yr as m,qr as n,cn as o,Fr as p,Cr as q,Zr as r,Bn as s,Tr as t,j as u,R as v,nn as w,Rr as x,Gn as y};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a0 as ln,a1 as an,a2 as H,a3 as q,a4 as B,a5 as un,a6 as y,a7 as tn,a8 as L,a9 as _,aa as rn,ab as o,ac as on,ad as sn,ae as fn}from"./mermaid.core-Bwyq-ixB.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,C,a){var O=I-l,i=D-h,n=C-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function W(l,h,I,D,v,A,C){var a=l-I,O=h-D,i=(C?A:-A)/L(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,F=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*L(on(0,T*T*R-P*P)),j=(P*g-m*S)/R,z=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=j-F,e=z-t,r=w-F,G=p-t;return x*x+e*e>r*r+G*G&&(j=w,z=p),{cx:j,cy:z,x01:-n,y01:-d,x11:j*(v/T-1),y11:z*(v/T-1)}}function hn(){var l=cn,h=yn,I=B(0),D=null,v=gn,A=dn,C=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,F=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(F>tn-y)a.moveTo(s*H(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*H(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=F,S=F,j=C.apply(this,arguments)/2,z=j>y&&(D?+D.apply(this,arguments):L(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if(z>y){var G=sn(z/u*q(j)),M=sn(z/s*q(j));(P-=G*2)>y?(G*=t?1:-1,R+=G,T-=G):(P=0,R=T=(f+c)/2),(S-=M*2)>y?(M*=t?1:-1,m+=M,g-=M):(S=0,m=g=(f+c)/2)}var J=s*H(m),K=s*q(m),N=u*H(T),Q=u*q(T);if(w>y){var U=s*H(g),V=s*q(g),X=u*H(R),Y=u*q(R),E;if(F<an)if(E=pn(J,K,X,Y,U,V,N,Q)){var Z=J-E[0],$=K-E[1],b=U-E[0],k=V-E[1],nn=1/q(fn((Z*b+$*k)/(L(Z*Z+$*$)*L(b*b+k*k)))/2),en=L(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=W(X,Y,J,K,s,x,t),r=W(U,V,N,Q,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(J,K),a.arc(0,0,s,m,g,!t)):a.moveTo(J,K),!(u>y)||!(P>y)?a.lineTo(N,Q):p>y?(e=W(N,Q,U,V,u,-p,t),r=W(J,K,X,Y,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[H(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:B(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:B(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:B(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:B(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:B(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:B(+n),i):A},i.padAngle=function(n){return arguments.length?(C=typeof n=="function"?n:B(+n),i):C},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
|