@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.
- package/README.md +5 -4
- package/dist/cli/commands/serve.d.ts +12 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +76 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/index.js +10 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/client/index.js +60 -0
- package/dist/core/FacetParser.d.ts +5 -4
- package/dist/core/FacetParser.d.ts.map +1 -1
- package/dist/core/FacetParser.js +43 -31
- package/dist/core/FacetParser.js.map +1 -1
- package/dist/server/DevServer.d.ts +48 -0
- package/dist/server/DevServer.d.ts.map +1 -0
- package/dist/server/DevServer.js +126 -0
- package/dist/server/DevServer.js.map +1 -0
- package/dist/server/HotReloadManager.d.ts +49 -0
- package/dist/server/HotReloadManager.d.ts.map +1 -0
- package/dist/server/HotReloadManager.js +187 -0
- package/dist/server/HotReloadManager.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +6 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes.d.ts +12 -0
- package/dist/server/routes.d.ts.map +1 -0
- package/dist/server/routes.js +272 -0
- package/dist/server/routes.js.map +1 -0
- package/dist/server/views/Dashboard.d.ts +6 -0
- package/dist/server/views/Dashboard.d.ts.map +1 -0
- package/dist/server/views/Dashboard.js +121 -0
- package/dist/server/views/Dashboard.js.map +1 -0
- package/dist/server/views/FacetPage.d.ts +6 -0
- package/dist/server/views/FacetPage.d.ts.map +1 -0
- package/dist/server/views/FacetPage.js +190 -0
- package/dist/server/views/FacetPage.js.map +1 -0
- package/dist/server/views/FeaturePage.d.ts +6 -0
- package/dist/server/views/FeaturePage.d.ts.map +1 -0
- package/dist/server/views/FeaturePage.js +98 -0
- package/dist/server/views/FeaturePage.js.map +1 -0
- package/dist/server/views/Layout.d.ts +17 -0
- package/dist/server/views/Layout.d.ts.map +1 -0
- package/dist/server/views/Layout.js +59 -0
- package/dist/server/views/Layout.js.map +1 -0
- package/dist/server/views/Sidebar.d.ts +6 -0
- package/dist/server/views/Sidebar.d.ts.map +1 -0
- package/dist/server/views/Sidebar.js +59 -0
- package/dist/server/views/Sidebar.js.map +1 -0
- package/dist/server/views/TestPanel.d.ts +6 -0
- package/dist/server/views/TestPanel.d.ts.map +1 -0
- package/dist/server/views/TestPanel.js +69 -0
- package/dist/server/views/TestPanel.js.map +1 -0
- package/dist/server/views/scripts.d.ts +5 -0
- package/dist/server/views/scripts.d.ts.map +1 -0
- package/dist/server/views/scripts.js +203 -0
- package/dist/server/views/scripts.js.map +1 -0
- package/dist/server/views/styles.d.ts +6 -0
- package/dist/server/views/styles.d.ts.map +1 -0
- package/dist/server/views/styles.js +608 -0
- package/dist/server/views/styles.js.map +1 -0
- package/dist/types.d.ts +7 -7
- package/dist/types.d.ts.map +1 -1
- 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 @@
|
|
|
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"}
|