@facet-coverage/core 0.4.0 → 0.5.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.
Files changed (63) hide show
  1. package/README.md +5 -4
  2. package/dist/cli/commands/serve.d.ts +12 -0
  3. package/dist/cli/commands/serve.d.ts.map +1 -0
  4. package/dist/cli/commands/serve.js +76 -0
  5. package/dist/cli/commands/serve.js.map +1 -0
  6. package/dist/cli/index.js +10 -0
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/client/index.js +60 -0
  9. package/dist/core/FacetParser.d.ts +5 -4
  10. package/dist/core/FacetParser.d.ts.map +1 -1
  11. package/dist/core/FacetParser.js +43 -31
  12. package/dist/core/FacetParser.js.map +1 -1
  13. package/dist/server/DevServer.d.ts +48 -0
  14. package/dist/server/DevServer.d.ts.map +1 -0
  15. package/dist/server/DevServer.js +126 -0
  16. package/dist/server/DevServer.js.map +1 -0
  17. package/dist/server/HotReloadManager.d.ts +49 -0
  18. package/dist/server/HotReloadManager.d.ts.map +1 -0
  19. package/dist/server/HotReloadManager.js +187 -0
  20. package/dist/server/HotReloadManager.js.map +1 -0
  21. package/dist/server/index.d.ts +3 -0
  22. package/dist/server/index.d.ts.map +1 -0
  23. package/dist/server/index.js +6 -0
  24. package/dist/server/index.js.map +1 -0
  25. package/dist/server/routes.d.ts +12 -0
  26. package/dist/server/routes.d.ts.map +1 -0
  27. package/dist/server/routes.js +272 -0
  28. package/dist/server/routes.js.map +1 -0
  29. package/dist/server/views/Dashboard.d.ts +6 -0
  30. package/dist/server/views/Dashboard.d.ts.map +1 -0
  31. package/dist/server/views/Dashboard.js +121 -0
  32. package/dist/server/views/Dashboard.js.map +1 -0
  33. package/dist/server/views/FacetPage.d.ts +6 -0
  34. package/dist/server/views/FacetPage.d.ts.map +1 -0
  35. package/dist/server/views/FacetPage.js +190 -0
  36. package/dist/server/views/FacetPage.js.map +1 -0
  37. package/dist/server/views/FeaturePage.d.ts +6 -0
  38. package/dist/server/views/FeaturePage.d.ts.map +1 -0
  39. package/dist/server/views/FeaturePage.js +98 -0
  40. package/dist/server/views/FeaturePage.js.map +1 -0
  41. package/dist/server/views/Layout.d.ts +17 -0
  42. package/dist/server/views/Layout.d.ts.map +1 -0
  43. package/dist/server/views/Layout.js +59 -0
  44. package/dist/server/views/Layout.js.map +1 -0
  45. package/dist/server/views/Sidebar.d.ts +6 -0
  46. package/dist/server/views/Sidebar.d.ts.map +1 -0
  47. package/dist/server/views/Sidebar.js +59 -0
  48. package/dist/server/views/Sidebar.js.map +1 -0
  49. package/dist/server/views/TestPanel.d.ts +6 -0
  50. package/dist/server/views/TestPanel.d.ts.map +1 -0
  51. package/dist/server/views/TestPanel.js +69 -0
  52. package/dist/server/views/TestPanel.js.map +1 -0
  53. package/dist/server/views/scripts.d.ts +5 -0
  54. package/dist/server/views/scripts.d.ts.map +1 -0
  55. package/dist/server/views/scripts.js +203 -0
  56. package/dist/server/views/scripts.js.map +1 -0
  57. package/dist/server/views/styles.d.ts +6 -0
  58. package/dist/server/views/styles.d.ts.map +1 -0
  59. package/dist/server/views/styles.js +608 -0
  60. package/dist/server/views/styles.js.map +1 -0
  61. package/dist/types.d.ts +7 -7
  62. package/dist/types.d.ts.map +1 -1
  63. package/package.json +9 -4
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DevServer = void 0;
4
+ const CoverageCalculator_js_1 = require("../core/CoverageCalculator.js");
5
+ const HotReloadManager_js_1 = require("./HotReloadManager.js");
6
+ const routes_js_1 = require("./routes.js");
7
+ /**
8
+ * Development server for browsing facet documentation with live coverage
9
+ */
10
+ class DevServer {
11
+ server = null;
12
+ hotReload;
13
+ config;
14
+ cwd;
15
+ options;
16
+ router;
17
+ coverageReport = null;
18
+ constructor(config, cwd, options) {
19
+ this.config = config;
20
+ this.cwd = cwd;
21
+ this.options = options;
22
+ this.hotReload = new HotReloadManager_js_1.HotReloadManager(config, cwd);
23
+ this.hotReload.setPackageRoot(options.packageRoot);
24
+ this.router = (0, routes_js_1.createRouter)(this, options.packageRoot);
25
+ }
26
+ /**
27
+ * Get the current coverage report
28
+ */
29
+ getCoverageReport() {
30
+ return this.coverageReport;
31
+ }
32
+ /**
33
+ * Get config
34
+ */
35
+ getConfig() {
36
+ return this.config;
37
+ }
38
+ /**
39
+ * Get current working directory
40
+ */
41
+ getCwd() {
42
+ return this.cwd;
43
+ }
44
+ /**
45
+ * Calculate coverage and update the cached report
46
+ */
47
+ async refreshCoverage() {
48
+ const calculator = new CoverageCalculator_js_1.CoverageCalculator(this.config);
49
+ this.coverageReport = await calculator.calculateCoverage(this.cwd);
50
+ return this.coverageReport;
51
+ }
52
+ /**
53
+ * Start the development server
54
+ */
55
+ async start() {
56
+ // Initial coverage calculation
57
+ console.log('Calculating initial coverage...');
58
+ await this.refreshCoverage();
59
+ const self = this;
60
+ this.server = Bun.serve({
61
+ port: this.options.port,
62
+ hostname: this.options.host,
63
+ fetch(req, server) {
64
+ const url = new URL(req.url);
65
+ // Handle WebSocket upgrade
66
+ if (url.pathname === '/ws') {
67
+ const upgraded = server.upgrade(req, {
68
+ data: { id: crypto.randomUUID() },
69
+ });
70
+ if (upgraded)
71
+ return undefined;
72
+ return new Response('WebSocket upgrade failed', { status: 400 });
73
+ }
74
+ // Handle HTTP requests via router
75
+ return self.router.handle(req);
76
+ },
77
+ websocket: {
78
+ open(ws) {
79
+ self.hotReload.addClient(ws);
80
+ ws.send(JSON.stringify({ type: 'connected', data: { timestamp: new Date().toISOString() } }));
81
+ },
82
+ close(ws) {
83
+ self.hotReload.removeClient(ws);
84
+ },
85
+ message(_ws, _message) {
86
+ // Client messages not needed for now
87
+ },
88
+ },
89
+ });
90
+ // Start file watching for hot reload
91
+ this.hotReload.start(async () => {
92
+ await this.refreshCoverage();
93
+ return this.coverageReport;
94
+ }, () => {
95
+ (0, routes_js_1.clearClientBundleCache)();
96
+ console.log(' Client bundle cache cleared');
97
+ });
98
+ const url = `http://${this.options.host}:${this.options.port}`;
99
+ console.log(`
100
+ \x1b[36m\x1b[1m Facet Documentation Server\x1b[0m
101
+
102
+ Local: ${url}
103
+
104
+ Watching for changes...
105
+ Press Ctrl+C to stop.
106
+ `);
107
+ // Open browser if requested
108
+ if (this.options.open) {
109
+ const { exec } = await import('child_process');
110
+ const command = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';
111
+ exec(`${command} ${url}`);
112
+ }
113
+ }
114
+ /**
115
+ * Stop the server
116
+ */
117
+ async stop() {
118
+ this.hotReload.stop();
119
+ if (this.server) {
120
+ this.server.stop();
121
+ this.server = null;
122
+ }
123
+ }
124
+ }
125
+ exports.DevServer = DevServer;
126
+ //# sourceMappingURL=DevServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevServer.js","sourceRoot":"","sources":["../../src/server/DevServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { ServerWebSocket } from 'bun';
2
+ import type { FacetConfig, CoverageReport } from '../types.js';
3
+ import type { WebSocketData } from './DevServer.js';
4
+ /**
5
+ * Manages WebSocket connections and file watching for hot reload
6
+ */
7
+ export declare class HotReloadManager {
8
+ private watcher;
9
+ private clientWatcher;
10
+ private clients;
11
+ private config;
12
+ private cwd;
13
+ private packageRoot;
14
+ private debounceTimer;
15
+ private clientDebounceTimer;
16
+ private onRefresh;
17
+ private onClientChange;
18
+ constructor(config: FacetConfig, cwd: string);
19
+ setPackageRoot(packageRoot: string): void;
20
+ /**
21
+ * Add a WebSocket client
22
+ */
23
+ addClient(ws: ServerWebSocket<WebSocketData>): void;
24
+ /**
25
+ * Remove a WebSocket client
26
+ */
27
+ removeClient(ws: ServerWebSocket<WebSocketData>): void;
28
+ /**
29
+ * Start watching for file changes
30
+ */
31
+ start(onRefresh: () => Promise<CoverageReport>, onClientChange?: () => void): void;
32
+ /**
33
+ * Stop watching and clean up
34
+ */
35
+ stop(): void;
36
+ /**
37
+ * Handle file change event with debouncing
38
+ */
39
+ private handleFileChange;
40
+ /**
41
+ * Handle client source file change with debouncing
42
+ */
43
+ private handleClientFileChange;
44
+ /**
45
+ * Broadcast a message to all connected clients
46
+ */
47
+ private broadcast;
48
+ }
49
+ //# sourceMappingURL=HotReloadManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HotReloadManager.d.ts","sourceRoot":"","sources":["../../src/server/HotReloadManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,OAAO,CAAkD;IACjE,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,mBAAmB,CAA8C;IACzE,OAAO,CAAC,SAAS,CAAgD;IACjE,OAAO,CAAC,cAAc,CAA6B;gBAEvC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM;IAK5C,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIzC;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,eAAe,CAAC,aAAa,CAAC,GAAG,IAAI;IAInD;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,eAAe,CAAC,aAAa,CAAC,GAAG,IAAI;IAItD;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI;IAmClF;;OAEG;IACH,IAAI,IAAI,IAAI;IAoBZ;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyDxB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAuB9B;;OAEG;IACH,OAAO,CAAC,SAAS;CAWlB"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HotReloadManager = void 0;
4
+ const chokidar_1 = require("chokidar");
5
+ const generate_js_1 = require("../cli/commands/generate.js");
6
+ /**
7
+ * Manages WebSocket connections and file watching for hot reload
8
+ */
9
+ class HotReloadManager {
10
+ watcher = null;
11
+ clientWatcher = null;
12
+ clients = new Set();
13
+ config;
14
+ cwd;
15
+ packageRoot = '';
16
+ debounceTimer = null;
17
+ clientDebounceTimer = null;
18
+ onRefresh = null;
19
+ onClientChange = null;
20
+ constructor(config, cwd) {
21
+ this.config = config;
22
+ this.cwd = cwd;
23
+ }
24
+ setPackageRoot(packageRoot) {
25
+ this.packageRoot = packageRoot;
26
+ }
27
+ /**
28
+ * Add a WebSocket client
29
+ */
30
+ addClient(ws) {
31
+ this.clients.add(ws);
32
+ }
33
+ /**
34
+ * Remove a WebSocket client
35
+ */
36
+ removeClient(ws) {
37
+ this.clients.delete(ws);
38
+ }
39
+ /**
40
+ * Start watching for file changes
41
+ */
42
+ start(onRefresh, onClientChange) {
43
+ this.onRefresh = onRefresh;
44
+ this.onClientChange = onClientChange || null;
45
+ // Watch patterns matching facet markdown files and test files
46
+ const watchPatterns = [
47
+ ...this.config.structureFiles,
48
+ 'features/**/facets/**/*.md',
49
+ `${this.config.testDir}/**/*.{ts,js,tsx,jsx}`,
50
+ ];
51
+ this.watcher = (0, chokidar_1.watch)(watchPatterns, {
52
+ cwd: this.cwd,
53
+ ignoreInitial: true,
54
+ persistent: true,
55
+ });
56
+ this.watcher.on('all', (event, path) => {
57
+ this.handleFileChange(event, path);
58
+ });
59
+ // Watch client source files for hot reload
60
+ if (this.packageRoot) {
61
+ const clientPath = `${this.packageRoot}/src/server/client`;
62
+ this.clientWatcher = (0, chokidar_1.watch)(`${clientPath}/**/*.{ts,tsx,css}`, {
63
+ ignoreInitial: true,
64
+ persistent: true,
65
+ });
66
+ this.clientWatcher.on('all', (event, path) => {
67
+ this.handleClientFileChange(event, path);
68
+ });
69
+ }
70
+ }
71
+ /**
72
+ * Stop watching and clean up
73
+ */
74
+ stop() {
75
+ if (this.debounceTimer) {
76
+ clearTimeout(this.debounceTimer);
77
+ this.debounceTimer = null;
78
+ }
79
+ if (this.clientDebounceTimer) {
80
+ clearTimeout(this.clientDebounceTimer);
81
+ this.clientDebounceTimer = null;
82
+ }
83
+ if (this.watcher) {
84
+ this.watcher.close();
85
+ this.watcher = null;
86
+ }
87
+ if (this.clientWatcher) {
88
+ this.clientWatcher.close();
89
+ this.clientWatcher = null;
90
+ }
91
+ this.clients.clear();
92
+ }
93
+ /**
94
+ * Handle file change event with debouncing
95
+ */
96
+ handleFileChange(event, path) {
97
+ // Clear existing timer
98
+ if (this.debounceTimer) {
99
+ clearTimeout(this.debounceTimer);
100
+ }
101
+ // Notify clients that a change was detected
102
+ this.broadcast({
103
+ type: 'file-change',
104
+ data: { event, path, timestamp: new Date().toISOString() },
105
+ });
106
+ // Check if this is a markdown file (facet definition)
107
+ const isMarkdownChange = path.endsWith('.md');
108
+ // Debounce to avoid multiple rapid refreshes
109
+ this.debounceTimer = setTimeout(async () => {
110
+ console.log(`\n Change detected: ${path} (${event})`);
111
+ // If markdown changed, regenerate facet structure first
112
+ if (isMarkdownChange) {
113
+ console.log(' Regenerating facet structure...');
114
+ try {
115
+ // Save and restore cwd since generateCommand uses process.cwd()
116
+ const originalCwd = process.cwd();
117
+ process.chdir(this.cwd);
118
+ await (0, generate_js_1.generateCommand)(undefined, { quiet: true });
119
+ process.chdir(originalCwd);
120
+ }
121
+ catch (error) {
122
+ console.error(' Error regenerating structure:', error);
123
+ }
124
+ }
125
+ console.log(' Refreshing coverage...');
126
+ if (this.onRefresh) {
127
+ try {
128
+ const report = await this.onRefresh();
129
+ console.log(` Coverage: ${report.summary.percentage}% (${report.summary.coveredFacets}/${report.summary.totalFacets})`);
130
+ this.broadcast({
131
+ type: 'coverage-update',
132
+ data: {
133
+ timestamp: new Date().toISOString(),
134
+ summary: report.summary,
135
+ },
136
+ });
137
+ }
138
+ catch (error) {
139
+ console.error(' Error refreshing coverage:', error);
140
+ this.broadcast({
141
+ type: 'error',
142
+ data: { message: String(error), timestamp: new Date().toISOString() },
143
+ });
144
+ }
145
+ }
146
+ }, 300);
147
+ }
148
+ /**
149
+ * Handle client source file change with debouncing
150
+ */
151
+ handleClientFileChange(event, path) {
152
+ // Clear existing timer
153
+ if (this.clientDebounceTimer) {
154
+ clearTimeout(this.clientDebounceTimer);
155
+ }
156
+ // Debounce to avoid multiple rapid rebuilds
157
+ this.clientDebounceTimer = setTimeout(() => {
158
+ console.log(`\n Client change detected: ${path} (${event})`);
159
+ console.log(' Rebuilding client bundle...');
160
+ // Clear the bundle cache and notify clients to reload
161
+ if (this.onClientChange) {
162
+ this.onClientChange();
163
+ }
164
+ this.broadcast({
165
+ type: 'client-reload',
166
+ data: { timestamp: new Date().toISOString() },
167
+ });
168
+ }, 200);
169
+ }
170
+ /**
171
+ * Broadcast a message to all connected clients
172
+ */
173
+ broadcast(message) {
174
+ const json = JSON.stringify(message);
175
+ for (const client of this.clients) {
176
+ try {
177
+ client.send(json);
178
+ }
179
+ catch {
180
+ // Client may have disconnected
181
+ this.clients.delete(client);
182
+ }
183
+ }
184
+ }
185
+ }
186
+ exports.HotReloadManager = HotReloadManager;
187
+ //# sourceMappingURL=HotReloadManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HotReloadManager.js","sourceRoot":"","sources":["../../src/server/HotReloadManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { DevServer } from './DevServer.js';
2
+ export type { DevServerOptions } from './DevServer.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DevServer = void 0;
4
+ var DevServer_js_1 = require("./DevServer.js");
5
+ Object.defineProperty(exports, "DevServer", { enumerable: true, get: function () { return DevServer_js_1.DevServer; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;AAAA,+CAA2C;AAAlC,yGAAA,SAAS,OAAA"}
@@ -0,0 +1,12 @@
1
+ import type { DevServer } from './DevServer.js';
2
+ /**
3
+ * Clear the client bundle cache (for hot reload)
4
+ */
5
+ export declare function clearClientBundleCache(): void;
6
+ /**
7
+ * Simple router for handling HTTP requests
8
+ */
9
+ export declare function createRouter(server: DevServer, packageRoot: string): {
10
+ handle(req: Request): Promise<Response>;
11
+ };
12
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/server/routes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAahD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAuFD;;GAEG;AAEH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM;gBAqK7C,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;EA2BhD"}