@flight-framework/devtools 1.0.0 → 1.0.2
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 +181 -10
- package/dist/bundle-panel.d.ts +88 -0
- package/dist/bundle-panel.d.ts.map +1 -0
- package/dist/bundle-panel.js +371 -0
- package/dist/bundle-panel.js.map +1 -0
- package/dist/cache-panel.d.ts +104 -0
- package/dist/cache-panel.d.ts.map +1 -0
- package/dist/cache-panel.js +372 -0
- package/dist/cache-panel.js.map +1 -0
- package/dist/hydration-panel.d.ts +100 -0
- package/dist/hydration-panel.d.ts.map +1 -0
- package/dist/hydration-panel.js +329 -0
- package/dist/hydration-panel.js.map +1 -0
- package/dist/panel.d.ts.map +1 -1
- package/dist/panel.js +19 -1
- package/dist/panel.js.map +1 -1
- package/package.json +51 -39
- package/LICENSE +0 -21
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle-panel.js","sourceRoot":"","sources":["../src/bundle-panel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @flight-framework/devtools - Cache Panel (Enhanced)
|
|
3
|
+
*
|
|
4
|
+
* Enhanced cache inspection with real-time updates,
|
|
5
|
+
* tag management, and invalidation controls.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Enhanced cache entry information
|
|
9
|
+
*/
|
|
10
|
+
export interface CacheEntry {
|
|
11
|
+
/** Cache key */
|
|
12
|
+
key: string;
|
|
13
|
+
/** Size in bytes */
|
|
14
|
+
size: number;
|
|
15
|
+
/** Number of cache hits */
|
|
16
|
+
hits: number;
|
|
17
|
+
/** Number of cache misses */
|
|
18
|
+
misses: number;
|
|
19
|
+
/** When entry was created */
|
|
20
|
+
createdAt: number;
|
|
21
|
+
/** When entry was last accessed */
|
|
22
|
+
lastAccessedAt: number;
|
|
23
|
+
/** Time-to-live in seconds (if set) */
|
|
24
|
+
ttl?: number;
|
|
25
|
+
/** When entry expires */
|
|
26
|
+
expiresAt?: number;
|
|
27
|
+
/** Tags associated with this entry */
|
|
28
|
+
tags: string[];
|
|
29
|
+
/** Entry status */
|
|
30
|
+
status: 'fresh' | 'stale' | 'revalidating' | 'expired';
|
|
31
|
+
/** Data type hint */
|
|
32
|
+
dataType: 'json' | 'html' | 'text' | 'binary' | 'unknown';
|
|
33
|
+
/** Source of the cached data */
|
|
34
|
+
source?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Cache metrics
|
|
38
|
+
*/
|
|
39
|
+
export interface CacheMetrics {
|
|
40
|
+
/** Total entries */
|
|
41
|
+
totalEntries: number;
|
|
42
|
+
/** Total size in bytes */
|
|
43
|
+
totalSize: number;
|
|
44
|
+
/** Total hits across all entries */
|
|
45
|
+
totalHits: number;
|
|
46
|
+
/** Total misses */
|
|
47
|
+
totalMisses: number;
|
|
48
|
+
/** Hit rate percentage */
|
|
49
|
+
hitRate: number;
|
|
50
|
+
/** Number of stale entries */
|
|
51
|
+
staleEntries: number;
|
|
52
|
+
/** Number of expired entries */
|
|
53
|
+
expiredEntries: number;
|
|
54
|
+
/** Unique tags */
|
|
55
|
+
uniqueTags: string[];
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Register or update a cache entry
|
|
59
|
+
*/
|
|
60
|
+
export declare function updateCacheEntry(entry: CacheEntry): void;
|
|
61
|
+
/**
|
|
62
|
+
* Remove a cache entry
|
|
63
|
+
*/
|
|
64
|
+
export declare function removeCacheEntry(key: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Record a cache hit
|
|
67
|
+
*/
|
|
68
|
+
export declare function recordCacheHit(key: string): void;
|
|
69
|
+
/**
|
|
70
|
+
* Record a cache miss
|
|
71
|
+
*/
|
|
72
|
+
export declare function recordCacheMiss(key: string): void;
|
|
73
|
+
/**
|
|
74
|
+
* Invalidate entries by tag
|
|
75
|
+
*/
|
|
76
|
+
export declare function invalidateByTag(tag: string): number;
|
|
77
|
+
/**
|
|
78
|
+
* Invalidate entry by key
|
|
79
|
+
*/
|
|
80
|
+
export declare function invalidateByKey(key: string): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Clear all cache entries
|
|
83
|
+
*/
|
|
84
|
+
export declare function clearAllCache(): void;
|
|
85
|
+
/**
|
|
86
|
+
* Subscribe to cache updates
|
|
87
|
+
*/
|
|
88
|
+
export declare function subscribeToCache(callback: (entries: CacheEntry[], metrics: CacheMetrics) => void): () => void;
|
|
89
|
+
/**
|
|
90
|
+
* Get current cache state
|
|
91
|
+
*/
|
|
92
|
+
export declare function getCacheState(): {
|
|
93
|
+
entries: CacheEntry[];
|
|
94
|
+
metrics: CacheMetrics;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Generate HTML for the cache panel
|
|
98
|
+
*/
|
|
99
|
+
export declare function renderCachePanel(entriesList: CacheEntry[], metrics: CacheMetrics): string;
|
|
100
|
+
/**
|
|
101
|
+
* CSS styles for the cache panel
|
|
102
|
+
*/
|
|
103
|
+
export declare const cachePanelStyles = "\n.flight-dt-cache-panel {\n padding: 8px;\n}\n\n.flight-dt-cache-summary {\n display: flex;\n gap: 16px;\n padding: 8px;\n background: rgba(255, 255, 255, 0.05);\n border-radius: 6px;\n margin-bottom: 12px;\n}\n\n.flight-dt-metric--good .flight-dt-metric-value {\n color: #22c55e;\n}\n\n.flight-dt-cache-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n margin-bottom: 12px;\n}\n\n.flight-dt-tag {\n background: rgba(139, 92, 246, 0.2);\n border: 1px solid rgba(139, 92, 246, 0.3);\n color: #a78bfa;\n padding: 2px 8px;\n border-radius: 12px;\n font-size: 10px;\n cursor: pointer;\n}\n\n.flight-dt-tag:hover {\n background: rgba(139, 92, 246, 0.3);\n}\n\n.flight-dt-tag-more {\n font-size: 10px;\n color: #666;\n padding: 2px 8px;\n}\n\n.flight-dt-cache-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 200px;\n overflow-y: auto;\n}\n\n.flight-dt-cache-entry {\n padding: 6px 8px;\n background: rgba(255, 255, 255, 0.03);\n border-radius: 4px;\n}\n\n.flight-dt-cache-entry-header {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.flight-dt-cache-status {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n}\n\n.flight-dt-cache-key {\n flex: 1;\n font-family: monospace;\n font-size: 11px;\n color: #e0e0e0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.flight-dt-cache-size {\n font-family: monospace;\n font-size: 11px;\n color: #888;\n}\n\n.flight-dt-cache-entry-meta {\n display: flex;\n gap: 12px;\n margin-top: 4px;\n font-size: 10px;\n color: #666;\n}\n\n.flight-dt-cache-more {\n text-align: center;\n font-size: 11px;\n color: #666;\n padding: 8px;\n}\n\n.flight-dt-cache-actions {\n margin-top: 12px;\n display: flex;\n justify-content: flex-end;\n}\n\n.flight-dt-btn {\n padding: 4px 12px;\n border: 1px solid #444;\n border-radius: 4px;\n background: transparent;\n color: #888;\n font-size: 11px;\n cursor: pointer;\n}\n\n.flight-dt-btn:hover {\n color: #e0e0e0;\n border-color: #666;\n}\n\n.flight-dt-btn--danger {\n border-color: rgba(239, 68, 68, 0.3);\n color: #ef4444;\n}\n\n.flight-dt-btn--danger:hover {\n background: rgba(239, 68, 68, 0.1);\n}\n";
|
|
104
|
+
//# sourceMappingURL=cache-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-panel.d.ts","sourceRoot":"","sources":["../src/cache-panel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB,gBAAgB;IAChB,GAAG,EAAE,MAAM,CAAC;IAEZ,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IAEb,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IAEb,6BAA6B;IAC7B,MAAM,EAAE,MAAM,CAAC;IAEf,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAC;IAElB,mCAAmC;IACnC,cAAc,EAAE,MAAM,CAAC;IAEvB,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,sCAAsC;IACtC,IAAI,EAAE,MAAM,EAAE,CAAC;IAEf,mBAAmB;IACnB,MAAM,EAAE,OAAO,GAAG,OAAO,GAAG,cAAc,GAAG,SAAS,CAAC;IAEvD,qBAAqB;IACrB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAE1D,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,oBAAoB;IACpB,YAAY,EAAE,MAAM,CAAC;IAErB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAElB,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAElB,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IAEpB,0BAA0B;IAC1B,OAAO,EAAE,MAAM,CAAC;IAEhB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IAErB,gCAAgC;IAChC,cAAc,EAAE,MAAM,CAAC;IAEvB,kBAAkB;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;CACxB;AA8CD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAGxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAGlD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAQhD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAOjD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAanD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQpD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAGpC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC5B,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,YAAY,KAAK,IAAI,GACjE,MAAM,IAAI,CAOZ;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI;IAC7B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE,YAAY,CAAC;CACzB,CAMA;AAsBD;;GAEG;AACH,wBAAgB,gBAAgB,CAC5B,WAAW,EAAE,UAAU,EAAE,EACzB,OAAO,EAAE,YAAY,GACtB,MAAM,CAqER;AAeD;;GAEG;AACH,eAAO,MAAM,gBAAgB,0zEAmI5B,CAAC"}
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @flight-framework/devtools - Cache Panel (Enhanced)
|
|
3
|
+
*
|
|
4
|
+
* Enhanced cache inspection with real-time updates,
|
|
5
|
+
* tag management, and invalidation controls.
|
|
6
|
+
*/
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// State Management
|
|
9
|
+
// ============================================================================
|
|
10
|
+
const entries = new Map();
|
|
11
|
+
const subscribers = new Set();
|
|
12
|
+
function notify() {
|
|
13
|
+
const entriesList = Array.from(entries.values());
|
|
14
|
+
const metrics = calculateMetrics(entriesList);
|
|
15
|
+
for (const callback of subscribers) {
|
|
16
|
+
callback(entriesList, metrics);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function calculateMetrics(entriesList) {
|
|
20
|
+
const totalHits = entriesList.reduce((sum, e) => sum + e.hits, 0);
|
|
21
|
+
const totalMisses = entriesList.reduce((sum, e) => sum + e.misses, 0);
|
|
22
|
+
const total = totalHits + totalMisses;
|
|
23
|
+
const allTags = new Set();
|
|
24
|
+
for (const entry of entriesList) {
|
|
25
|
+
for (const tag of entry.tags) {
|
|
26
|
+
allTags.add(tag);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
totalEntries: entriesList.length,
|
|
31
|
+
totalSize: entriesList.reduce((sum, e) => sum + e.size, 0),
|
|
32
|
+
totalHits,
|
|
33
|
+
totalMisses,
|
|
34
|
+
hitRate: total > 0 ? (totalHits / total) * 100 : 0,
|
|
35
|
+
staleEntries: entriesList.filter(e => e.status === 'stale').length,
|
|
36
|
+
expiredEntries: entriesList.filter(e => e.status === 'expired').length,
|
|
37
|
+
uniqueTags: Array.from(allTags).sort(),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// ============================================================================
|
|
41
|
+
// Public API
|
|
42
|
+
// ============================================================================
|
|
43
|
+
/**
|
|
44
|
+
* Register or update a cache entry
|
|
45
|
+
*/
|
|
46
|
+
export function updateCacheEntry(entry) {
|
|
47
|
+
entries.set(entry.key, entry);
|
|
48
|
+
notify();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Remove a cache entry
|
|
52
|
+
*/
|
|
53
|
+
export function removeCacheEntry(key) {
|
|
54
|
+
entries.delete(key);
|
|
55
|
+
notify();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Record a cache hit
|
|
59
|
+
*/
|
|
60
|
+
export function recordCacheHit(key) {
|
|
61
|
+
const entry = entries.get(key);
|
|
62
|
+
if (!entry)
|
|
63
|
+
return;
|
|
64
|
+
entry.hits++;
|
|
65
|
+
entry.lastAccessedAt = Date.now();
|
|
66
|
+
entries.set(key, entry);
|
|
67
|
+
notify();
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Record a cache miss
|
|
71
|
+
*/
|
|
72
|
+
export function recordCacheMiss(key) {
|
|
73
|
+
const entry = entries.get(key);
|
|
74
|
+
if (!entry)
|
|
75
|
+
return;
|
|
76
|
+
entry.misses++;
|
|
77
|
+
entries.set(key, entry);
|
|
78
|
+
notify();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Invalidate entries by tag
|
|
82
|
+
*/
|
|
83
|
+
export function invalidateByTag(tag) {
|
|
84
|
+
let count = 0;
|
|
85
|
+
for (const [key, entry] of entries) {
|
|
86
|
+
if (entry.tags.includes(tag)) {
|
|
87
|
+
entry.status = 'stale';
|
|
88
|
+
entries.set(key, entry);
|
|
89
|
+
count++;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
notify();
|
|
93
|
+
return count;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Invalidate entry by key
|
|
97
|
+
*/
|
|
98
|
+
export function invalidateByKey(key) {
|
|
99
|
+
const entry = entries.get(key);
|
|
100
|
+
if (!entry)
|
|
101
|
+
return false;
|
|
102
|
+
entry.status = 'stale';
|
|
103
|
+
entries.set(key, entry);
|
|
104
|
+
notify();
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Clear all cache entries
|
|
109
|
+
*/
|
|
110
|
+
export function clearAllCache() {
|
|
111
|
+
entries.clear();
|
|
112
|
+
notify();
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Subscribe to cache updates
|
|
116
|
+
*/
|
|
117
|
+
export function subscribeToCache(callback) {
|
|
118
|
+
subscribers.add(callback);
|
|
119
|
+
const entriesList = Array.from(entries.values());
|
|
120
|
+
callback(entriesList, calculateMetrics(entriesList));
|
|
121
|
+
return () => subscribers.delete(callback);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get current cache state
|
|
125
|
+
*/
|
|
126
|
+
export function getCacheState() {
|
|
127
|
+
const entriesList = Array.from(entries.values());
|
|
128
|
+
return {
|
|
129
|
+
entries: entriesList,
|
|
130
|
+
metrics: calculateMetrics(entriesList),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// ============================================================================
|
|
134
|
+
// Panel Rendering
|
|
135
|
+
// ============================================================================
|
|
136
|
+
function formatBytes(bytes) {
|
|
137
|
+
if (bytes < 1024)
|
|
138
|
+
return `${bytes} B`;
|
|
139
|
+
if (bytes < 1024 * 1024)
|
|
140
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
141
|
+
return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
|
|
142
|
+
}
|
|
143
|
+
function formatRelativeTime(timestamp) {
|
|
144
|
+
const now = Date.now();
|
|
145
|
+
const diff = now - timestamp;
|
|
146
|
+
if (diff < 1000)
|
|
147
|
+
return 'now';
|
|
148
|
+
if (diff < 60000)
|
|
149
|
+
return `${Math.floor(diff / 1000)}s ago`;
|
|
150
|
+
if (diff < 3600000)
|
|
151
|
+
return `${Math.floor(diff / 60000)}m ago`;
|
|
152
|
+
return `${Math.floor(diff / 3600000)}h ago`;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Generate HTML for the cache panel
|
|
156
|
+
*/
|
|
157
|
+
export function renderCachePanel(entriesList, metrics) {
|
|
158
|
+
const statusColors = {
|
|
159
|
+
fresh: '#22c55e',
|
|
160
|
+
stale: '#fbbf24',
|
|
161
|
+
revalidating: '#3b82f6',
|
|
162
|
+
expired: '#ef4444',
|
|
163
|
+
};
|
|
164
|
+
const sortedEntries = [...entriesList].sort((a, b) => b.lastAccessedAt - a.lastAccessedAt);
|
|
165
|
+
return `
|
|
166
|
+
<div class="flight-dt-cache-panel">
|
|
167
|
+
<div class="flight-dt-cache-summary">
|
|
168
|
+
<div class="flight-dt-metric">
|
|
169
|
+
<span class="flight-dt-metric-value">${metrics.totalEntries}</span>
|
|
170
|
+
<span class="flight-dt-metric-label">Entries</span>
|
|
171
|
+
</div>
|
|
172
|
+
<div class="flight-dt-metric">
|
|
173
|
+
<span class="flight-dt-metric-value">${formatBytes(metrics.totalSize)}</span>
|
|
174
|
+
<span class="flight-dt-metric-label">Size</span>
|
|
175
|
+
</div>
|
|
176
|
+
<div class="flight-dt-metric ${metrics.hitRate >= 80 ? 'flight-dt-metric--good' : metrics.hitRate >= 50 ? '' : 'flight-dt-metric--warning'}">
|
|
177
|
+
<span class="flight-dt-metric-value">${metrics.hitRate.toFixed(1)}%</span>
|
|
178
|
+
<span class="flight-dt-metric-label">Hit Rate</span>
|
|
179
|
+
</div>
|
|
180
|
+
<div class="flight-dt-metric">
|
|
181
|
+
<span class="flight-dt-metric-value">${metrics.totalHits}</span>
|
|
182
|
+
<span class="flight-dt-metric-label">Hits</span>
|
|
183
|
+
</div>
|
|
184
|
+
</div>
|
|
185
|
+
|
|
186
|
+
${metrics.uniqueTags.length > 0 ? `
|
|
187
|
+
<div class="flight-dt-cache-tags">
|
|
188
|
+
${metrics.uniqueTags.slice(0, 8).map(tag => `
|
|
189
|
+
<button class="flight-dt-tag" data-tag="${escapeHtml(tag)}" title="Click to invalidate">
|
|
190
|
+
${escapeHtml(tag)}
|
|
191
|
+
</button>
|
|
192
|
+
`).join('')}
|
|
193
|
+
${metrics.uniqueTags.length > 8 ? `<span class="flight-dt-tag-more">+${metrics.uniqueTags.length - 8}</span>` : ''}
|
|
194
|
+
</div>
|
|
195
|
+
` : ''}
|
|
196
|
+
|
|
197
|
+
<div class="flight-dt-cache-list">
|
|
198
|
+
${sortedEntries.slice(0, 15).map(entry => `
|
|
199
|
+
<div class="flight-dt-cache-entry" data-key="${escapeHtml(entry.key)}">
|
|
200
|
+
<div class="flight-dt-cache-entry-header">
|
|
201
|
+
<span class="flight-dt-cache-status" style="background: ${statusColors[entry.status]}" title="${entry.status}"></span>
|
|
202
|
+
<span class="flight-dt-cache-key" title="${escapeHtml(entry.key)}">${escapeHtml(truncateKey(entry.key))}</span>
|
|
203
|
+
<span class="flight-dt-cache-size">${formatBytes(entry.size)}</span>
|
|
204
|
+
</div>
|
|
205
|
+
<div class="flight-dt-cache-entry-meta">
|
|
206
|
+
<span class="flight-dt-cache-hits">${entry.hits} hits</span>
|
|
207
|
+
<span class="flight-dt-cache-time">${formatRelativeTime(entry.lastAccessedAt)}</span>
|
|
208
|
+
${entry.ttl ? `<span class="flight-dt-cache-ttl">TTL: ${entry.ttl}s</span>` : ''}
|
|
209
|
+
</div>
|
|
210
|
+
</div>
|
|
211
|
+
`).join('')}
|
|
212
|
+
${sortedEntries.length > 15 ? `<div class="flight-dt-cache-more">+ ${sortedEntries.length - 15} more entries</div>` : ''}
|
|
213
|
+
</div>
|
|
214
|
+
|
|
215
|
+
${sortedEntries.length === 0 ? '<div class="flight-dt-empty">No cache entries</div>' : ''}
|
|
216
|
+
|
|
217
|
+
<div class="flight-dt-cache-actions">
|
|
218
|
+
<button class="flight-dt-btn flight-dt-btn--danger" data-action="clear-cache">
|
|
219
|
+
Clear All
|
|
220
|
+
</button>
|
|
221
|
+
</div>
|
|
222
|
+
</div>
|
|
223
|
+
`;
|
|
224
|
+
}
|
|
225
|
+
function truncateKey(key) {
|
|
226
|
+
if (key.length <= 40)
|
|
227
|
+
return key;
|
|
228
|
+
return key.slice(0, 20) + '...' + key.slice(-15);
|
|
229
|
+
}
|
|
230
|
+
function escapeHtml(str) {
|
|
231
|
+
return str
|
|
232
|
+
.replace(/&/g, '&')
|
|
233
|
+
.replace(/</g, '<')
|
|
234
|
+
.replace(/>/g, '>')
|
|
235
|
+
.replace(/"/g, '"');
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* CSS styles for the cache panel
|
|
239
|
+
*/
|
|
240
|
+
export const cachePanelStyles = `
|
|
241
|
+
.flight-dt-cache-panel {
|
|
242
|
+
padding: 8px;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
.flight-dt-cache-summary {
|
|
246
|
+
display: flex;
|
|
247
|
+
gap: 16px;
|
|
248
|
+
padding: 8px;
|
|
249
|
+
background: rgba(255, 255, 255, 0.05);
|
|
250
|
+
border-radius: 6px;
|
|
251
|
+
margin-bottom: 12px;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.flight-dt-metric--good .flight-dt-metric-value {
|
|
255
|
+
color: #22c55e;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
.flight-dt-cache-tags {
|
|
259
|
+
display: flex;
|
|
260
|
+
flex-wrap: wrap;
|
|
261
|
+
gap: 6px;
|
|
262
|
+
margin-bottom: 12px;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
.flight-dt-tag {
|
|
266
|
+
background: rgba(139, 92, 246, 0.2);
|
|
267
|
+
border: 1px solid rgba(139, 92, 246, 0.3);
|
|
268
|
+
color: #a78bfa;
|
|
269
|
+
padding: 2px 8px;
|
|
270
|
+
border-radius: 12px;
|
|
271
|
+
font-size: 10px;
|
|
272
|
+
cursor: pointer;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.flight-dt-tag:hover {
|
|
276
|
+
background: rgba(139, 92, 246, 0.3);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.flight-dt-tag-more {
|
|
280
|
+
font-size: 10px;
|
|
281
|
+
color: #666;
|
|
282
|
+
padding: 2px 8px;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.flight-dt-cache-list {
|
|
286
|
+
display: flex;
|
|
287
|
+
flex-direction: column;
|
|
288
|
+
gap: 4px;
|
|
289
|
+
max-height: 200px;
|
|
290
|
+
overflow-y: auto;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
.flight-dt-cache-entry {
|
|
294
|
+
padding: 6px 8px;
|
|
295
|
+
background: rgba(255, 255, 255, 0.03);
|
|
296
|
+
border-radius: 4px;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.flight-dt-cache-entry-header {
|
|
300
|
+
display: flex;
|
|
301
|
+
align-items: center;
|
|
302
|
+
gap: 8px;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.flight-dt-cache-status {
|
|
306
|
+
width: 8px;
|
|
307
|
+
height: 8px;
|
|
308
|
+
border-radius: 50%;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
.flight-dt-cache-key {
|
|
312
|
+
flex: 1;
|
|
313
|
+
font-family: monospace;
|
|
314
|
+
font-size: 11px;
|
|
315
|
+
color: #e0e0e0;
|
|
316
|
+
overflow: hidden;
|
|
317
|
+
text-overflow: ellipsis;
|
|
318
|
+
white-space: nowrap;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.flight-dt-cache-size {
|
|
322
|
+
font-family: monospace;
|
|
323
|
+
font-size: 11px;
|
|
324
|
+
color: #888;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
.flight-dt-cache-entry-meta {
|
|
328
|
+
display: flex;
|
|
329
|
+
gap: 12px;
|
|
330
|
+
margin-top: 4px;
|
|
331
|
+
font-size: 10px;
|
|
332
|
+
color: #666;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
.flight-dt-cache-more {
|
|
336
|
+
text-align: center;
|
|
337
|
+
font-size: 11px;
|
|
338
|
+
color: #666;
|
|
339
|
+
padding: 8px;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
.flight-dt-cache-actions {
|
|
343
|
+
margin-top: 12px;
|
|
344
|
+
display: flex;
|
|
345
|
+
justify-content: flex-end;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
.flight-dt-btn {
|
|
349
|
+
padding: 4px 12px;
|
|
350
|
+
border: 1px solid #444;
|
|
351
|
+
border-radius: 4px;
|
|
352
|
+
background: transparent;
|
|
353
|
+
color: #888;
|
|
354
|
+
font-size: 11px;
|
|
355
|
+
cursor: pointer;
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
.flight-dt-btn:hover {
|
|
359
|
+
color: #e0e0e0;
|
|
360
|
+
border-color: #666;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
.flight-dt-btn--danger {
|
|
364
|
+
border-color: rgba(239, 68, 68, 0.3);
|
|
365
|
+
color: #ef4444;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
.flight-dt-btn--danger:hover {
|
|
369
|
+
background: rgba(239, 68, 68, 0.1);
|
|
370
|
+
}
|
|
371
|
+
`;
|
|
372
|
+
//# sourceMappingURL=cache-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-panel.js","sourceRoot":"","sources":["../src/cache-panel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @flight-framework/devtools - Hydration Panel
|
|
3
|
+
*
|
|
4
|
+
* Visualizes island hydration timing and status.
|
|
5
|
+
* Shows which islands have hydrated, their triggers, and timing.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Information about a single hydrated island
|
|
9
|
+
*/
|
|
10
|
+
export interface IslandHydrationInfo {
|
|
11
|
+
/** Unique identifier for this island instance */
|
|
12
|
+
id: string;
|
|
13
|
+
/** Island component name */
|
|
14
|
+
name: string;
|
|
15
|
+
/** Hydration trigger type */
|
|
16
|
+
trigger: 'load' | 'idle' | 'visible' | 'interaction' | 'media' | 'never';
|
|
17
|
+
/** Current status */
|
|
18
|
+
status: 'pending' | 'hydrating' | 'hydrated' | 'error';
|
|
19
|
+
/** Time when hydration was scheduled */
|
|
20
|
+
scheduledAt: number;
|
|
21
|
+
/** Time when hydration started */
|
|
22
|
+
startedAt?: number;
|
|
23
|
+
/** Time when hydration completed */
|
|
24
|
+
completedAt?: number;
|
|
25
|
+
/** Duration of hydration in ms */
|
|
26
|
+
duration?: number;
|
|
27
|
+
/** Error message if hydration failed */
|
|
28
|
+
error?: string;
|
|
29
|
+
/** Component file path */
|
|
30
|
+
filePath?: string;
|
|
31
|
+
/** Props size in bytes (serialized) */
|
|
32
|
+
propsSize?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Aggregated hydration metrics
|
|
36
|
+
*/
|
|
37
|
+
export interface HydrationMetrics {
|
|
38
|
+
/** Total islands on page */
|
|
39
|
+
totalIslands: number;
|
|
40
|
+
/** Number of hydrated islands */
|
|
41
|
+
hydratedCount: number;
|
|
42
|
+
/** Number of pending islands */
|
|
43
|
+
pendingCount: number;
|
|
44
|
+
/** Number of failed islands */
|
|
45
|
+
errorCount: number;
|
|
46
|
+
/** Total hydration time (sum of all durations) */
|
|
47
|
+
totalHydrationTime: number;
|
|
48
|
+
/** Average hydration time per island */
|
|
49
|
+
averageHydrationTime: number;
|
|
50
|
+
/** Longest single hydration */
|
|
51
|
+
longestHydration?: IslandHydrationInfo;
|
|
52
|
+
/** First Hydration Time (first island) */
|
|
53
|
+
firstHydrationTime?: number;
|
|
54
|
+
/** Last Hydration Time (all islands done) */
|
|
55
|
+
lastHydrationTime?: number;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Register an island for tracking
|
|
59
|
+
*/
|
|
60
|
+
export declare function registerIsland(info: Omit<IslandHydrationInfo, 'scheduledAt' | 'status'>): void;
|
|
61
|
+
/**
|
|
62
|
+
* Mark island as started hydrating
|
|
63
|
+
*/
|
|
64
|
+
export declare function startHydration(id: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Mark island as hydrated
|
|
67
|
+
*/
|
|
68
|
+
export declare function completeHydration(id: string): void;
|
|
69
|
+
/**
|
|
70
|
+
* Mark island hydration as failed
|
|
71
|
+
*/
|
|
72
|
+
export declare function failHydration(id: string, error: string): void;
|
|
73
|
+
/**
|
|
74
|
+
* Subscribe to hydration updates
|
|
75
|
+
*/
|
|
76
|
+
export declare function subscribeToHydration(callback: (islands: IslandHydrationInfo[], metrics: HydrationMetrics) => void): () => void;
|
|
77
|
+
/**
|
|
78
|
+
* Get current hydration state
|
|
79
|
+
*/
|
|
80
|
+
export declare function getHydrationState(): {
|
|
81
|
+
islands: IslandHydrationInfo[];
|
|
82
|
+
metrics: HydrationMetrics;
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Clear all tracked islands (for testing or page navigation)
|
|
86
|
+
*/
|
|
87
|
+
export declare function clearHydrationState(): void;
|
|
88
|
+
/**
|
|
89
|
+
* Setup automatic hydration tracking by listening to Flight events
|
|
90
|
+
*/
|
|
91
|
+
export declare function setupHydrationTracking(): void;
|
|
92
|
+
/**
|
|
93
|
+
* Generate HTML for the hydration panel
|
|
94
|
+
*/
|
|
95
|
+
export declare function renderHydrationPanel(islandsList: IslandHydrationInfo[], metrics: HydrationMetrics): string;
|
|
96
|
+
/**
|
|
97
|
+
* CSS styles for the hydration panel
|
|
98
|
+
*/
|
|
99
|
+
export declare const hydrationPanelStyles = "\n.flight-dt-hydration-panel {\n padding: 8px;\n}\n\n.flight-dt-hydration-summary {\n display: flex;\n gap: 16px;\n padding: 8px;\n background: rgba(255, 255, 255, 0.05);\n border-radius: 6px;\n margin-bottom: 12px;\n}\n\n.flight-dt-metric {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.flight-dt-metric-value {\n font-size: 18px;\n font-weight: 600;\n color: #e0e0e0;\n}\n\n.flight-dt-metric-label {\n font-size: 10px;\n color: #888;\n text-transform: uppercase;\n}\n\n.flight-dt-metric--warning .flight-dt-metric-value {\n color: #fbbf24;\n}\n\n.flight-dt-hydration-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 200px;\n overflow-y: auto;\n}\n\n.flight-dt-island {\n display: flex;\n flex-direction: column;\n padding: 6px 8px;\n background: rgba(255, 255, 255, 0.03);\n border-radius: 4px;\n font-size: 12px;\n}\n\n.flight-dt-island-header {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.flight-dt-island-status {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n}\n\n.flight-dt-island-trigger {\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(255, 255, 255, 0.1);\n border-radius: 3px;\n font-size: 10px;\n font-weight: 600;\n color: #888;\n}\n\n.flight-dt-island-name {\n flex: 1;\n color: #e0e0e0;\n font-family: monospace;\n}\n\n.flight-dt-island-time {\n color: #888;\n font-family: monospace;\n}\n\n.flight-dt-island-error {\n margin-top: 4px;\n padding: 4px 8px;\n background: rgba(239, 68, 68, 0.1);\n border-radius: 3px;\n color: #ef4444;\n font-size: 11px;\n}\n\n.flight-dt-empty {\n text-align: center;\n color: #666;\n padding: 20px;\n}\n";
|
|
100
|
+
//# sourceMappingURL=hydration-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hydration-panel.d.ts","sourceRoot":"","sources":["../src/hydration-panel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAC;IAEX,4BAA4B;IAC5B,IAAI,EAAE,MAAM,CAAC;IAEb,6BAA6B;IAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC;IAEzE,qBAAqB;IACrB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;IAEvD,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IAEpB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,0BAA0B;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAC;IAErB,iCAAiC;IACjC,aAAa,EAAE,MAAM,CAAC;IAEtB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IAErB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IAEnB,kDAAkD;IAClD,kBAAkB,EAAE,MAAM,CAAC;IAE3B,wCAAwC;IACxC,oBAAoB,EAAE,MAAM,CAAC;IAE7B,+BAA+B;IAC/B,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IAEvC,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B;AA4CD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,mBAAmB,EAAE,aAAa,GAAG,QAAQ,CAAC,GAAG,IAAI,CAS9F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAQ/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAiBlD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAS7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAChC,QAAQ,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,EAAE,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAC9E,MAAM,IAAI,CAQZ;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI;IACjC,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,OAAO,EAAE,gBAAgB,CAAC;CAC7B,CAMA;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAG1C;AAMD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAoB7C;AAMD;;GAEG;AACH,wBAAgB,oBAAoB,CAChC,WAAW,EAAE,mBAAmB,EAAE,EAClC,OAAO,EAAE,gBAAgB,GAC1B,MAAM,CA+DR;AASD;;GAEG;AACH,eAAO,MAAM,oBAAoB,m1DAuGhC,CAAC"}
|