hzl-web 2.2.0 → 2.4.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/dist/server.d.ts +2 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +107 -64
- package/dist/server.js.map +1 -1
- package/dist/server.test.js +299 -189
- package/dist/server.test.js.map +1 -1
- package/dist/ui/assets/Paired-CHegtbHO.js +1 -0
- package/dist/ui/assets/force-graph-B5HrL0HG.js +42 -0
- package/dist/ui/assets/index-CdpHwHFG.css +1 -0
- package/dist/ui/assets/index-CgGSX2ei.js +5 -0
- package/dist/ui/assets/index-DhxVdKMf.js +109 -0
- package/dist/ui/index.html +9 -4466
- package/dist/ui/legacy.html +4473 -0
- package/dist/ui/screenshot-mobile.png +0 -0
- package/dist/ui/screenshot-wide.png +0 -0
- package/dist/ui/site.webmanifest +27 -0
- package/dist/ui-embed.d.ts +8 -8
- package/dist/ui-embed.d.ts.map +1 -1
- package/dist/ui-embed.js +71 -29
- package/dist/ui-embed.js.map +1 -1
- package/package.json +16 -3
|
Binary file
|
|
Binary file
|
package/dist/ui/site.webmanifest
CHANGED
|
@@ -6,6 +6,18 @@
|
|
|
6
6
|
"start_url": "/",
|
|
7
7
|
"scope": "/",
|
|
8
8
|
"icons": [
|
|
9
|
+
{
|
|
10
|
+
"src": "/web-app-manifest-192x192.png",
|
|
11
|
+
"sizes": "192x192",
|
|
12
|
+
"type": "image/png",
|
|
13
|
+
"purpose": "any"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"src": "/web-app-manifest-512x512.png",
|
|
17
|
+
"sizes": "512x512",
|
|
18
|
+
"type": "image/png",
|
|
19
|
+
"purpose": "any"
|
|
20
|
+
},
|
|
9
21
|
{
|
|
10
22
|
"src": "/web-app-manifest-192x192.png",
|
|
11
23
|
"sizes": "192x192",
|
|
@@ -19,6 +31,21 @@
|
|
|
19
31
|
"purpose": "maskable"
|
|
20
32
|
}
|
|
21
33
|
],
|
|
34
|
+
"screenshots": [
|
|
35
|
+
{
|
|
36
|
+
"src": "/screenshot-wide.png",
|
|
37
|
+
"sizes": "1280x720",
|
|
38
|
+
"type": "image/png",
|
|
39
|
+
"form_factor": "wide",
|
|
40
|
+
"label": "HZL task dashboard - desktop view"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"src": "/screenshot-mobile.png",
|
|
44
|
+
"sizes": "390x844",
|
|
45
|
+
"type": "image/png",
|
|
46
|
+
"label": "HZL task dashboard - mobile view"
|
|
47
|
+
}
|
|
48
|
+
],
|
|
22
49
|
"theme_color": "#1a1a1a",
|
|
23
50
|
"background_color": "#1a1a1a",
|
|
24
51
|
"display": "standalone"
|
package/dist/ui-embed.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export declare const
|
|
7
|
-
|
|
8
|
-
export declare const
|
|
1
|
+
export interface EmbeddedFile {
|
|
2
|
+
content: Buffer;
|
|
3
|
+
contentType: string;
|
|
4
|
+
}
|
|
5
|
+
/** All files from dist/ui/ keyed by URL path (e.g. "/index.html", "/assets/main-abc.js") */
|
|
6
|
+
export declare const UI_FILES: Map<string, EmbeddedFile>;
|
|
7
|
+
/** Legacy dashboard HTML for the HZL_LEGACY_DASHBOARD=1 feature toggle */
|
|
8
|
+
export declare const LEGACY_DASHBOARD_HTML: string;
|
|
9
9
|
//# sourceMappingURL=ui-embed.d.ts.map
|
package/dist/ui-embed.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-embed.d.ts","sourceRoot":"","sources":["../src/ui-embed.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ui-embed.d.ts","sourceRoot":"","sources":["../src/ui-embed.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAqED,4FAA4F;AAC5F,eAAO,MAAM,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAwB,CAAC;AAExE,0EAA0E;AAC1E,eAAO,MAAM,qBAAqB,EAAE,MAWhC,CAAC"}
|
package/dist/ui-embed.js
CHANGED
|
@@ -1,38 +1,80 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'fs';
|
|
2
2
|
import { fileURLToPath } from 'url';
|
|
3
|
-
import { dirname, join } from 'path';
|
|
3
|
+
import { dirname, join, extname } from 'path';
|
|
4
4
|
const __filename = fileURLToPath(import.meta.url);
|
|
5
5
|
const __dirname = dirname(__filename);
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
6
|
+
const MIME_TYPES = {
|
|
7
|
+
'.html': 'text/html; charset=utf-8',
|
|
8
|
+
'.css': 'text/css; charset=utf-8',
|
|
9
|
+
'.js': 'application/javascript; charset=utf-8',
|
|
10
|
+
'.json': 'application/json; charset=utf-8',
|
|
11
|
+
'.webmanifest': 'application/manifest+json; charset=utf-8',
|
|
12
|
+
'.png': 'image/png',
|
|
13
|
+
'.ico': 'image/x-icon',
|
|
14
|
+
'.svg': 'image/svg+xml',
|
|
15
|
+
'.woff': 'font/woff',
|
|
16
|
+
'.woff2': 'font/woff2',
|
|
17
|
+
'.txt': 'text/plain; charset=utf-8',
|
|
18
|
+
};
|
|
19
|
+
function getMimeType(filePath) {
|
|
20
|
+
return MIME_TYPES[extname(filePath).toLowerCase()] ?? 'application/octet-stream';
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Resolve the ui directory path.
|
|
24
|
+
* Prefers dist/ui/ (contains Vite-built React app + copied legacy.html).
|
|
25
|
+
* Falls back to src/ui/ when dist hasn't been built yet.
|
|
26
|
+
*/
|
|
27
|
+
function resolveUiDir() {
|
|
28
|
+
// When running from compiled JS (dist/), __dirname is dist/ so 'ui' = dist/ui/
|
|
29
|
+
// When running from source (src/) via vitest, __dirname is src/ so we look up to dist/ui/
|
|
30
|
+
const candidates = [
|
|
31
|
+
join(__dirname, 'ui'), // dist/ui/ when running from dist/
|
|
32
|
+
join(__dirname, '..', 'dist', 'ui'), // dist/ui/ when running from src/ (vitest)
|
|
33
|
+
join(__dirname, '..', 'src', 'ui'), // src/ui/ fallback (dev without build)
|
|
12
34
|
];
|
|
13
|
-
for (const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
35
|
+
for (const dir of candidates) {
|
|
36
|
+
if (existsSync(dir))
|
|
37
|
+
return dir;
|
|
38
|
+
}
|
|
39
|
+
throw new Error(`Could not find ui directory - checked: ${candidates.join(', ')}`);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Recursively load all files from a directory into a Map keyed by URL path.
|
|
43
|
+
* e.g. dist/ui/index.html -> "/index.html", dist/ui/assets/main-abc.js -> "/assets/main-abc.js"
|
|
44
|
+
*/
|
|
45
|
+
function loadDirectory(dir, prefix = '') {
|
|
46
|
+
const files = new Map();
|
|
47
|
+
for (const entry of readdirSync(dir)) {
|
|
48
|
+
const fullPath = join(dir, entry);
|
|
49
|
+
const urlPath = prefix + '/' + entry;
|
|
50
|
+
if (statSync(fullPath).isDirectory()) {
|
|
51
|
+
for (const [k, v] of loadDirectory(fullPath, urlPath)) {
|
|
52
|
+
files.set(k, v);
|
|
53
|
+
}
|
|
17
54
|
}
|
|
18
|
-
|
|
19
|
-
|
|
55
|
+
else {
|
|
56
|
+
files.set(urlPath, {
|
|
57
|
+
content: readFileSync(fullPath),
|
|
58
|
+
contentType: getMimeType(fullPath),
|
|
59
|
+
});
|
|
20
60
|
}
|
|
21
61
|
}
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
function loadUiText(relativePath) {
|
|
25
|
-
return readFileSync(resolveUiPath(relativePath), 'utf-8');
|
|
62
|
+
return files;
|
|
26
63
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
export const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
64
|
+
const uiDir = resolveUiDir();
|
|
65
|
+
/** All files from dist/ui/ keyed by URL path (e.g. "/index.html", "/assets/main-abc.js") */
|
|
66
|
+
export const UI_FILES = loadDirectory(uiDir);
|
|
67
|
+
/** Legacy dashboard HTML for the HZL_LEGACY_DASHBOARD=1 feature toggle */
|
|
68
|
+
export const LEGACY_DASHBOARD_HTML = (() => {
|
|
69
|
+
const legacyPath = join(uiDir, 'legacy.html');
|
|
70
|
+
if (existsSync(legacyPath)) {
|
|
71
|
+
return readFileSync(legacyPath, 'utf-8');
|
|
72
|
+
}
|
|
73
|
+
// Fallback: try src/ui/legacy.html when running from dist
|
|
74
|
+
const srcLegacy = join(__dirname, '..', 'src', 'ui', 'legacy.html');
|
|
75
|
+
if (existsSync(srcLegacy)) {
|
|
76
|
+
return readFileSync(srcLegacy, 'utf-8');
|
|
77
|
+
}
|
|
78
|
+
return '<html><body>Legacy dashboard not found.</body></html>';
|
|
79
|
+
})();
|
|
38
80
|
//# sourceMappingURL=ui-embed.js.map
|
package/dist/ui-embed.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-embed.js","sourceRoot":"","sources":["../src/ui-embed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"ui-embed.js","sourceRoot":"","sources":["../src/ui-embed.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hzl-web",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "Web dashboard for HZL - A Kanban-style task monitoring UI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -52,16 +52,29 @@
|
|
|
52
52
|
"visualization"
|
|
53
53
|
],
|
|
54
54
|
"dependencies": {
|
|
55
|
-
"
|
|
55
|
+
"d3": "^7.9.0",
|
|
56
|
+
"dompurify": "^3.3.1",
|
|
57
|
+
"force-graph": "^1.51.1",
|
|
58
|
+
"marked": "^17.0.3",
|
|
59
|
+
"react": "^19.1.0",
|
|
60
|
+
"react-dom": "^19.1.0",
|
|
61
|
+
"hzl-core": "2.4.0"
|
|
56
62
|
},
|
|
57
63
|
"devDependencies": {
|
|
64
|
+
"@types/d3": "^7.4.3",
|
|
65
|
+
"@types/dompurify": "^3.2.0",
|
|
58
66
|
"@types/node": "^25.2.1",
|
|
67
|
+
"@types/react": "^19.1.0",
|
|
68
|
+
"@types/react-dom": "^19.1.0",
|
|
69
|
+
"@vitejs/plugin-react": "^4.5.2",
|
|
59
70
|
"libsql": "^0.5.0",
|
|
60
71
|
"typescript": "^5.3.0",
|
|
72
|
+
"vite": "^6.3.5",
|
|
61
73
|
"vitest": "^4.0.18"
|
|
62
74
|
},
|
|
63
75
|
"scripts": {
|
|
64
|
-
"build": "tsc -b && cp
|
|
76
|
+
"build": "vite build && tsc -b && cp src/ui/legacy.html dist/ui/legacy.html",
|
|
77
|
+
"dev": "vite",
|
|
65
78
|
"test": "vitest run",
|
|
66
79
|
"test:ci": "vitest run --coverage",
|
|
67
80
|
"test:watch": "vitest"
|