hzl-web 2.1.0 → 2.2.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.
@@ -0,0 +1,25 @@
1
+ {
2
+ "id": "/",
3
+ "name": "HZL",
4
+ "short_name": "HZL",
5
+ "description": "HZL task dashboard",
6
+ "start_url": "/",
7
+ "scope": "/",
8
+ "icons": [
9
+ {
10
+ "src": "/web-app-manifest-192x192.png",
11
+ "sizes": "192x192",
12
+ "type": "image/png",
13
+ "purpose": "maskable"
14
+ },
15
+ {
16
+ "src": "/web-app-manifest-512x512.png",
17
+ "sizes": "512x512",
18
+ "type": "image/png",
19
+ "purpose": "maskable"
20
+ }
21
+ ],
22
+ "theme_color": "#1a1a1a",
23
+ "background_color": "#1a1a1a",
24
+ "display": "standalone"
25
+ }
package/dist/ui/sw.js ADDED
@@ -0,0 +1,76 @@
1
+ const CACHE_VERSION = 'hzl-shell-v2';
2
+ const SHELL_CACHE = CACHE_VERSION;
3
+ const SHELL_ASSETS = [
4
+ '/',
5
+ '/site.webmanifest',
6
+ '/favicon-96x96.png',
7
+ '/favicon.ico',
8
+ '/apple-touch-icon.png',
9
+ '/web-app-manifest-192x192.png',
10
+ '/web-app-manifest-512x512.png',
11
+ ];
12
+
13
+ self.addEventListener('install', (event) => {
14
+ event.waitUntil(
15
+ caches.open(SHELL_CACHE).then((cache) => {
16
+ return cache.addAll(SHELL_ASSETS);
17
+ })
18
+ );
19
+ self.skipWaiting();
20
+ });
21
+
22
+ self.addEventListener('activate', (event) => {
23
+ event.waitUntil(
24
+ caches.keys().then((keys) =>
25
+ Promise.all(
26
+ keys
27
+ .filter((key) => key !== SHELL_CACHE)
28
+ .map((key) => caches.delete(key))
29
+ )
30
+ )
31
+ );
32
+ self.clients.claim();
33
+ });
34
+
35
+ self.addEventListener('fetch', (event) => {
36
+ const request = event.request;
37
+ if (request.method !== 'GET') {
38
+ return;
39
+ }
40
+
41
+ const url = new URL(request.url);
42
+ if (url.origin !== self.location.origin) {
43
+ return;
44
+ }
45
+
46
+ if (url.pathname.startsWith('/api/')) {
47
+ return;
48
+ }
49
+
50
+ if (request.mode === 'navigate') {
51
+ event.respondWith(
52
+ fetch(request).catch(async () => {
53
+ const cached = await caches.match('/');
54
+ if (cached) return cached;
55
+ throw new Error('Offline and no cached dashboard shell');
56
+ })
57
+ );
58
+ return;
59
+ }
60
+
61
+ event.respondWith(
62
+ caches.match(request).then((cached) => {
63
+ if (cached) return cached;
64
+
65
+ return fetch(request).then((response) => {
66
+ if (!response || response.status !== 200) {
67
+ return response;
68
+ }
69
+
70
+ const clone = response.clone();
71
+ caches.open(SHELL_CACHE).then((cache) => cache.put(request, clone));
72
+ return response;
73
+ });
74
+ })
75
+ );
76
+ });
@@ -1,2 +1,9 @@
1
1
  export declare const DASHBOARD_HTML: string;
2
+ export declare const DASHBOARD_SITE_MANIFEST: string;
3
+ export declare const DASHBOARD_SERVICE_WORKER: string;
4
+ export declare const DASHBOARD_FAVICON_PNG_96: Buffer<ArrayBufferLike>;
5
+ export declare const DASHBOARD_FAVICON_ICO: Buffer<ArrayBufferLike>;
6
+ export declare const DASHBOARD_APPLE_TOUCH_ICON: Buffer<ArrayBufferLike>;
7
+ export declare const DASHBOARD_WEB_APP_ICON_192: Buffer<ArrayBufferLike>;
8
+ export declare const DASHBOARD_WEB_APP_ICON_512: Buffer<ArrayBufferLike>;
2
9
  //# sourceMappingURL=ui-embed.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui-embed.d.ts","sourceRoot":"","sources":["../src/ui-embed.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,cAAc,QAAa,CAAC"}
1
+ {"version":3,"file":"ui-embed.d.ts","sourceRoot":"","sources":["../src/ui-embed.ts"],"names":[],"mappings":"AAmCA,eAAO,MAAM,cAAc,QAA2B,CAAC;AACvD,eAAO,MAAM,uBAAuB,QAAiC,CAAC;AACtE,eAAO,MAAM,wBAAwB,QAAsB,CAAC;AAC5D,eAAO,MAAM,wBAAwB,yBAAoC,CAAC;AAC1E,eAAO,MAAM,qBAAqB,yBAA8B,CAAC;AACjE,eAAO,MAAM,0BAA0B,yBAAuC,CAAC;AAC/E,eAAO,MAAM,0BAA0B,yBAA+C,CAAC;AACvF,eAAO,MAAM,0BAA0B,yBAA+C,CAAC"}
package/dist/ui-embed.js CHANGED
@@ -1,24 +1,38 @@
1
- import { readFileSync } from 'fs';
1
+ import { accessSync, readFileSync } from 'fs';
2
2
  import { fileURLToPath } from 'url';
3
3
  import { dirname, join } from 'path';
4
4
  const __filename = fileURLToPath(import.meta.url);
5
5
  const __dirname = dirname(__filename);
6
6
  // In development, read from source. In production, this will be the dist folder.
7
7
  // For dev, we try the src folder first, then fall back to the build location.
8
- function loadHtml() {
8
+ function resolveUiPath(relativePath) {
9
9
  const paths = [
10
- join(__dirname, 'ui', 'index.html'), // dist/ui/index.html (prod)
11
- join(__dirname, '..', 'src', 'ui', 'index.html'), // src/ui/index.html (dev from dist)
10
+ join(__dirname, 'ui', relativePath), // dist/ui/* (prod)
11
+ join(__dirname, '..', 'src', 'ui', relativePath), // src/ui/* (dev from dist)
12
12
  ];
13
13
  for (const p of paths) {
14
14
  try {
15
- return readFileSync(p, 'utf-8');
15
+ accessSync(p);
16
+ return p;
16
17
  }
17
18
  catch {
18
19
  // Try next path
19
20
  }
20
21
  }
21
- throw new Error('Could not find index.html - checked: ' + paths.join(', '));
22
+ throw new Error(`Could not find ${relativePath} - checked: ${paths.join(', ')}`);
22
23
  }
23
- export const DASHBOARD_HTML = loadHtml();
24
+ function loadUiText(relativePath) {
25
+ return readFileSync(resolveUiPath(relativePath), 'utf-8');
26
+ }
27
+ function loadUiBinary(relativePath) {
28
+ return readFileSync(resolveUiPath(relativePath));
29
+ }
30
+ export const DASHBOARD_HTML = loadUiText('index.html');
31
+ export const DASHBOARD_SITE_MANIFEST = loadUiText('site.webmanifest');
32
+ export const DASHBOARD_SERVICE_WORKER = loadUiText('sw.js');
33
+ export const DASHBOARD_FAVICON_PNG_96 = loadUiBinary('favicon-96x96.png');
34
+ export const DASHBOARD_FAVICON_ICO = loadUiBinary('favicon.ico');
35
+ export const DASHBOARD_APPLE_TOUCH_ICON = loadUiBinary('apple-touch-icon.png');
36
+ export const DASHBOARD_WEB_APP_ICON_192 = loadUiBinary('web-app-manifest-192x192.png');
37
+ export const DASHBOARD_WEB_APP_ICON_512 = loadUiBinary('web-app-manifest-512x512.png');
24
38
  //# sourceMappingURL=ui-embed.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ui-embed.js","sourceRoot":"","sources":["../src/ui-embed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,iFAAiF;AACjF,8EAA8E;AAC9E,SAAS,QAAQ;IACf,MAAM,KAAK,GAAG;QACZ,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,EAAY,4BAA4B;QAC3E,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,oCAAoC;KACvF,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,uCAAuC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,QAAQ,EAAE,CAAC"}
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;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,iFAAiF;AACjF,8EAA8E;AAC9E,SAAS,aAAa,CAAC,YAAoB;IACzC,MAAM,KAAK,GAAG;QACZ,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,mBAAmB;QACxD,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,2BAA2B;KAC9E,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,UAAU,CAAC,CAAC,CAAC,CAAC;YACd,OAAO,CAAC,CAAC;QACX,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,kBAAkB,YAAY,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,SAAS,UAAU,CAAC,YAAoB;IACtC,OAAO,YAAY,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,YAAY,CAAC,YAAoB;IACxC,OAAO,YAAY,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,uBAAuB,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC;AACtE,MAAM,CAAC,MAAM,wBAAwB,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,wBAAwB,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;AAC1E,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,0BAA0B,GAAG,YAAY,CAAC,sBAAsB,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,0BAA0B,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC;AACvF,MAAM,CAAC,MAAM,0BAA0B,GAAG,YAAY,CAAC,8BAA8B,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hzl-web",
3
- "version": "2.1.0",
3
+ "version": "2.2.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,7 +52,7 @@
52
52
  "visualization"
53
53
  ],
54
54
  "dependencies": {
55
- "hzl-core": "2.1.0"
55
+ "hzl-core": "2.2.0"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@types/node": "^25.2.1",
@@ -63,6 +63,7 @@
63
63
  "scripts": {
64
64
  "build": "tsc -b && cp -r src/ui dist/",
65
65
  "test": "vitest run",
66
+ "test:ci": "vitest run --coverage",
66
67
  "test:watch": "vitest"
67
68
  }
68
69
  }