@ereo/dev-inspector 0.1.6
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 +222 -0
- package/dist/devtools/CacheTab.d.ts +21 -0
- package/dist/devtools/CacheTab.d.ts.map +1 -0
- package/dist/devtools/DataPipelineTab.d.ts +24 -0
- package/dist/devtools/DataPipelineTab.d.ts.map +1 -0
- package/dist/devtools/DevToolsPanel.d.ts +27 -0
- package/dist/devtools/DevToolsPanel.d.ts.map +1 -0
- package/dist/devtools/IslandsTab.d.ts +21 -0
- package/dist/devtools/IslandsTab.d.ts.map +1 -0
- package/dist/devtools/RoutesTab.d.ts +21 -0
- package/dist/devtools/RoutesTab.d.ts.map +1 -0
- package/dist/devtools/index.d.ts +14 -0
- package/dist/devtools/index.d.ts.map +1 -0
- package/dist/devtools/plugin.d.ts +38 -0
- package/dist/devtools/plugin.d.ts.map +1 -0
- package/dist/devtools/types.d.ts +157 -0
- package/dist/devtools/types.d.ts.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2538 -0
- package/dist/inspector.d.ts +37 -0
- package/dist/inspector.d.ts.map +1 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# @ereo/dev-inspector
|
|
2
|
+
|
|
3
|
+
Visual route inspector and DevTools for EreoJS framework development. Provides comprehensive UI for exploring routes, data pipelines, islands, and cache during development.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
bun add -D @ereo/dev-inspector
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
### Route Inspector Only
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { createDevInspector } from '@ereo/dev-inspector';
|
|
17
|
+
import { defineConfig } from '@ereo/core';
|
|
18
|
+
|
|
19
|
+
export default defineConfig({
|
|
20
|
+
plugins: [
|
|
21
|
+
createDevInspector({
|
|
22
|
+
mountPath: '/__ereo', // default
|
|
23
|
+
}),
|
|
24
|
+
],
|
|
25
|
+
});
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Visit `http://localhost:3000/__ereo` to open the route inspector.
|
|
29
|
+
|
|
30
|
+
### Full DevTools Panel
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
import { createDevToolsPlugin } from '@ereo/dev-inspector';
|
|
34
|
+
import { defineConfig } from '@ereo/core';
|
|
35
|
+
|
|
36
|
+
export default defineConfig({
|
|
37
|
+
plugins: [
|
|
38
|
+
createDevToolsPlugin({
|
|
39
|
+
mountPath: '/__devtools',
|
|
40
|
+
dataPipeline: true,
|
|
41
|
+
routes: true,
|
|
42
|
+
islands: true,
|
|
43
|
+
cache: true,
|
|
44
|
+
position: 'bottom-right',
|
|
45
|
+
}),
|
|
46
|
+
],
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
A floating button appears on your page. Click it to open the DevTools panel.
|
|
51
|
+
|
|
52
|
+
## Features
|
|
53
|
+
|
|
54
|
+
### Route Inspector
|
|
55
|
+
|
|
56
|
+
Visual interface for exploring routes at `/__ereo`:
|
|
57
|
+
|
|
58
|
+
- Route paths with file locations
|
|
59
|
+
- Render mode badges (SSR, SSG, CSR, API, RSC)
|
|
60
|
+
- Feature tags (loader, action, islands count, auth)
|
|
61
|
+
- Search filtering by path
|
|
62
|
+
- Statistics cards (total, SSR, SSG, API counts)
|
|
63
|
+
|
|
64
|
+
### DevTools Panel
|
|
65
|
+
|
|
66
|
+
Comprehensive development panel with five tabs:
|
|
67
|
+
|
|
68
|
+
1. **Data Pipeline** - Loader timeline visualization with waterfall detection
|
|
69
|
+
2. **Routes** - Route list with filtering by render mode
|
|
70
|
+
3. **Islands** - Hydration status and strategy breakdown
|
|
71
|
+
4. **Cache** - Cache entries, tags, TTL, and hit rates
|
|
72
|
+
5. **HMR** - Hot Module Replacement event history
|
|
73
|
+
|
|
74
|
+
## API Reference
|
|
75
|
+
|
|
76
|
+
### createDevInspector(config?)
|
|
77
|
+
|
|
78
|
+
Creates the route inspector plugin.
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
interface InspectorConfig {
|
|
82
|
+
/** Path to mount inspector (default: '/__ereo') */
|
|
83
|
+
mountPath?: string;
|
|
84
|
+
/** Enable route testing (reserved for future use) */
|
|
85
|
+
enableTesting?: boolean;
|
|
86
|
+
/** Show loader data (reserved for future use) */
|
|
87
|
+
showLoaderData?: boolean;
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Note**: Currently only `mountPath` is functional. Other options are reserved for future implementation.
|
|
92
|
+
|
|
93
|
+
### createDevToolsPlugin(config?)
|
|
94
|
+
|
|
95
|
+
Creates the full DevTools panel plugin.
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
interface DevToolsConfig {
|
|
99
|
+
/** Mount path for DevTools panel (default: '/__devtools') */
|
|
100
|
+
mountPath?: string;
|
|
101
|
+
/** Enable data pipeline visualization (default: true) */
|
|
102
|
+
dataPipeline?: boolean;
|
|
103
|
+
/** Enable routes visualization (default: true) */
|
|
104
|
+
routes?: boolean;
|
|
105
|
+
/** Enable islands visualization (default: true) */
|
|
106
|
+
islands?: boolean;
|
|
107
|
+
/** Enable cache visualization (default: true) */
|
|
108
|
+
cache?: boolean;
|
|
109
|
+
/** Position of overlay button (default: 'bottom-right') */
|
|
110
|
+
position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Utility Functions
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
// Generate inspector HTML from route info
|
|
118
|
+
generateInspectorHTML(routes: RouteInfo[]): string
|
|
119
|
+
|
|
120
|
+
// Convert framework routes to RouteInfo format
|
|
121
|
+
createRouteInfo(routes: Route[]): RouteInfo[]
|
|
122
|
+
|
|
123
|
+
// Format routes as CLI tree output
|
|
124
|
+
formatRouteTree(routes: RouteInfo[]): string
|
|
125
|
+
|
|
126
|
+
// DevTools HTML generators
|
|
127
|
+
generateDevToolsPanelHTML(data: DevToolsPanelData): string
|
|
128
|
+
generateDataPipelineHTML(data: DataPipelineVisualization): string
|
|
129
|
+
generateRoutesTabHTML(routes: RouteVisualization[]): string
|
|
130
|
+
generateIslandsTabHTML(islands: IslandVisualization[]): string
|
|
131
|
+
generateCacheTabHTML(cache: CacheVisualization): string
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Type Exports
|
|
135
|
+
|
|
136
|
+
```typescript
|
|
137
|
+
export type {
|
|
138
|
+
InspectorConfig,
|
|
139
|
+
RouteInfo,
|
|
140
|
+
DevToolsConfig,
|
|
141
|
+
DataPipelineVisualization,
|
|
142
|
+
IslandVisualization,
|
|
143
|
+
CacheVisualization,
|
|
144
|
+
HMREvent,
|
|
145
|
+
LoaderTiming,
|
|
146
|
+
CacheEntry,
|
|
147
|
+
} from '@ereo/dev-inspector';
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## CLI Output Example
|
|
151
|
+
|
|
152
|
+
```typescript
|
|
153
|
+
import { createRouteInfo, formatRouteTree } from '@ereo/dev-inspector';
|
|
154
|
+
|
|
155
|
+
const routes = router.getRoutes();
|
|
156
|
+
const info = createRouteInfo(routes);
|
|
157
|
+
console.log(formatRouteTree(info));
|
|
158
|
+
|
|
159
|
+
// Output:
|
|
160
|
+
// Route Tree:
|
|
161
|
+
//
|
|
162
|
+
// ⚡ / [loader]
|
|
163
|
+
// → src/routes/index.tsx
|
|
164
|
+
// 📄 /about
|
|
165
|
+
// → src/routes/about.ssg.tsx
|
|
166
|
+
// 🔌 /api/posts [loader, action]
|
|
167
|
+
// → src/routes/api/posts.api.ts
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Render mode icons:
|
|
171
|
+
- ⚡ SSR (Server-Side Rendering)
|
|
172
|
+
- 📄 SSG (Static Site Generation)
|
|
173
|
+
- 💻 CSR (Client-Side Rendering)
|
|
174
|
+
- 🔌 API
|
|
175
|
+
- 🚀 RSC (React Server Components)
|
|
176
|
+
- • Unknown/Custom
|
|
177
|
+
|
|
178
|
+
## Production Usage
|
|
179
|
+
|
|
180
|
+
Exclude DevTools from production builds:
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
const plugins = [];
|
|
184
|
+
|
|
185
|
+
if (process.env.NODE_ENV === 'development') {
|
|
186
|
+
const { createDevToolsPlugin } = await import('@ereo/dev-inspector');
|
|
187
|
+
plugins.push(createDevToolsPlugin());
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const app = createApp({ plugins });
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## API Endpoints
|
|
194
|
+
|
|
195
|
+
The DevTools plugin exposes the following HTTP endpoints:
|
|
196
|
+
|
|
197
|
+
| Endpoint | Method | Description |
|
|
198
|
+
|----------|--------|-------------|
|
|
199
|
+
| `/__devtools` | GET | DevTools panel HTML |
|
|
200
|
+
| `/__devtools/api/routes` | GET | JSON array of route data |
|
|
201
|
+
| `/__devtools/api/pipeline` | GET | JSON array of pipeline metrics history |
|
|
202
|
+
| `/__devtools/api/hmr` | GET | JSON array of HMR events |
|
|
203
|
+
| `/__devtools/api/pipeline/record` | POST | Record custom pipeline metrics |
|
|
204
|
+
|
|
205
|
+
The Route Inspector exposes:
|
|
206
|
+
|
|
207
|
+
| Endpoint | Method | Description |
|
|
208
|
+
|----------|--------|-------------|
|
|
209
|
+
| `/__ereo` | GET | Route inspector HTML |
|
|
210
|
+
| `/__ereo/api/routes` | GET | JSON array of routes |
|
|
211
|
+
|
|
212
|
+
## Documentation
|
|
213
|
+
|
|
214
|
+
For full documentation, visit [https://ereo.dev/docs/dev-inspector](https://ereo.dev/docs/dev-inspector)
|
|
215
|
+
|
|
216
|
+
## Part of EreoJS
|
|
217
|
+
|
|
218
|
+
This package is part of the [EreoJS monorepo](https://github.com/anthropics/ereo-js).
|
|
219
|
+
|
|
220
|
+
## License
|
|
221
|
+
|
|
222
|
+
MIT
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ereo/dev-inspector - Cache Tab
|
|
3
|
+
*
|
|
4
|
+
* Visualize cache entries, tags, TTL, and hit rates.
|
|
5
|
+
*/
|
|
6
|
+
import type { CacheVisualization } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Generate HTML for the Cache tab.
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateCacheTabHTML(cache: CacheVisualization): string;
|
|
11
|
+
/**
|
|
12
|
+
* CSS styles for the Cache tab.
|
|
13
|
+
*/
|
|
14
|
+
export declare const CACHE_TAB_STYLES = "\n .cache-container {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: #0f172a;\n color: #e2e8f0;\n padding: 1.5rem;\n border-radius: 12px;\n }\n\n .cache-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 1.5rem;\n padding-bottom: 1rem;\n border-bottom: 1px solid #334155;\n }\n\n .cache-header h3 {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n .cache-stats {\n display: flex;\n gap: 1.5rem;\n }\n\n .stat {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .stat-value {\n font-size: 1.5rem;\n font-weight: 700;\n color: #3b82f6;\n }\n\n .stat-label {\n font-size: 0.75rem;\n color: #64748b;\n text-transform: uppercase;\n }\n\n .hit-rate.excellent { color: #10b981; }\n .hit-rate.good { color: #3b82f6; }\n .hit-rate.fair { color: #f59e0b; }\n .hit-rate.poor { color: #ef4444; }\n\n .cache-tabs {\n display: flex;\n gap: 0.5rem;\n margin-bottom: 1rem;\n }\n\n .cache-tab {\n padding: 0.5rem 1rem;\n background: #1e293b;\n border: none;\n border-radius: 6px;\n color: #94a3b8;\n font-size: 0.875rem;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .cache-tab:hover {\n color: #f8fafc;\n }\n\n .cache-tab.active {\n background: #3b82f6;\n color: white;\n }\n\n .cache-table,\n .tags-table {\n background: #1e293b;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .cache-table-header,\n .tags-table-header {\n display: grid;\n grid-template-columns: 2fr 1fr 80px 80px 60px 70px;\n gap: 1rem;\n padding: 0.75rem 1rem;\n background: #0f172a;\n font-size: 0.75rem;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .tags-table-header {\n grid-template-columns: 1fr 80px 80px 80px 80px 50px;\n }\n\n .cache-entry-row,\n .tag-row {\n display: grid;\n grid-template-columns: 2fr 1fr 80px 80px 60px 70px;\n gap: 1rem;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid #0f172a;\n align-items: center;\n font-size: 0.875rem;\n }\n\n .tag-row {\n grid-template-columns: 1fr 80px 80px 80px 80px 50px;\n }\n\n .cache-entry-row:hover,\n .tag-row:hover {\n background: #334155;\n }\n\n .entry-key {\n font-family: 'Monaco', 'Menlo', monospace;\n font-size: 0.75rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .entry-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n }\n\n .tag {\n padding: 0.125rem 0.375rem;\n background: #334155;\n border-radius: 4px;\n font-size: 0.625rem;\n color: #94a3b8;\n }\n\n .tag-badge {\n padding: 0.25rem 0.5rem;\n background: #3b82f6;\n border-radius: 4px;\n font-size: 0.75rem;\n color: white;\n }\n\n .entry-ttl.expired { color: #ef4444; }\n .entry-ttl.expiring-soon { color: #f59e0b; }\n .entry-ttl.healthy { color: #10b981; }\n\n .entry-actions,\n .tag-actions {\n display: flex;\n gap: 0.25rem;\n }\n\n .entry-action,\n .tag-action {\n padding: 0.25rem;\n background: transparent;\n border: none;\n cursor: pointer;\n font-size: 0.875rem;\n border-radius: 4px;\n transition: background 0.2s;\n }\n\n .entry-action:hover,\n .tag-action:hover {\n background: #334155;\n }\n\n .no-entries {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem;\n color: #64748b;\n }\n\n .no-entries-icon {\n font-size: 3rem;\n margin-bottom: 1rem;\n }\n\n .cache-actions {\n display: flex;\n gap: 0.5rem;\n justify-content: flex-end;\n margin-top: 1rem;\n }\n\n .action-btn {\n padding: 0.5rem 1rem;\n background: #3b82f6;\n border: none;\n border-radius: 6px;\n color: white;\n font-size: 0.875rem;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .action-btn:hover {\n background: #2563eb;\n }\n\n .action-btn.danger {\n background: #ef4444;\n }\n\n .action-btn.danger:hover {\n background: #dc2626;\n }\n";
|
|
15
|
+
/**
|
|
16
|
+
* React component placeholder.
|
|
17
|
+
*/
|
|
18
|
+
export declare function CacheTab({ cache }: {
|
|
19
|
+
cache: CacheVisualization;
|
|
20
|
+
}): null;
|
|
21
|
+
//# sourceMappingURL=CacheTab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CacheTab.d.ts","sourceRoot":"","sources":["../../src/devtools/CacheTab.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAc,MAAM,SAAS,CAAC;AAE9D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAiHtE;AA6HD;;GAEG;AACH,eAAO,MAAM,gBAAgB,ulIA4N5B,CAAC;AAEF;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,kBAAkB,CAAA;CAAE,QAEhE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ereo/dev-inspector - Data Pipeline Tab
|
|
3
|
+
*
|
|
4
|
+
* FLAGSHIP FEATURE: Visual representation of data loading with
|
|
5
|
+
* waterfall detection and optimization suggestions.
|
|
6
|
+
*/
|
|
7
|
+
import type { DataPipelineVisualization } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* Generate HTML for the Data Pipeline visualization.
|
|
10
|
+
* This is the flagship feature of EreoJS DevTools.
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateDataPipelineHTML(data: DataPipelineVisualization): string;
|
|
13
|
+
/**
|
|
14
|
+
* CSS styles for the Data Pipeline tab.
|
|
15
|
+
*/
|
|
16
|
+
export declare const DATA_PIPELINE_STYLES = "\n .pipeline-container {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: #0f172a;\n color: #e2e8f0;\n padding: 1.5rem;\n border-radius: 12px;\n }\n\n .pipeline-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 1.5rem;\n padding-bottom: 1rem;\n border-bottom: 1px solid #334155;\n }\n\n .pipeline-header h3 {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n color: #f8fafc;\n }\n\n .route-info {\n display: flex;\n align-items: center;\n gap: 1rem;\n }\n\n .route-path {\n font-family: 'Monaco', 'Menlo', monospace;\n font-size: 0.875rem;\n color: #94a3b8;\n background: #1e293b;\n padding: 0.25rem 0.75rem;\n border-radius: 4px;\n }\n\n .total-time {\n font-size: 1.5rem;\n font-weight: 700;\n color: #3b82f6;\n }\n\n /* Efficiency Meter */\n .efficiency-meter {\n margin-bottom: 1.5rem;\n padding: 1rem;\n background: #1e293b;\n border-radius: 8px;\n }\n\n .efficiency-label {\n display: flex;\n justify-content: space-between;\n margin-bottom: 0.5rem;\n font-size: 0.875rem;\n }\n\n .efficiency-label .excellent { color: #10b981; }\n .efficiency-label .good { color: #3b82f6; }\n .efficiency-label .fair { color: #f59e0b; }\n .efficiency-label .poor { color: #ef4444; }\n\n .efficiency-bar {\n height: 8px;\n background: #334155;\n border-radius: 4px;\n overflow: hidden;\n }\n\n .efficiency-fill {\n height: 100%;\n background: linear-gradient(90deg, #10b981, #3b82f6);\n border-radius: 4px;\n transition: width 0.3s ease;\n }\n\n .efficiency-hint {\n margin-top: 0.5rem;\n font-size: 0.75rem;\n color: #64748b;\n }\n\n /* Timeline */\n .timeline-container {\n margin-bottom: 1.5rem;\n }\n\n .timeline-header {\n display: grid;\n grid-template-columns: 150px 1fr 100px;\n gap: 1rem;\n padding: 0.5rem 0;\n font-size: 0.75rem;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .timeline-bar-header {\n display: flex;\n justify-content: space-between;\n }\n\n .loader-row {\n display: grid;\n grid-template-columns: 150px 1fr 100px;\n gap: 1rem;\n align-items: center;\n padding: 0.5rem 0;\n border-bottom: 1px solid #1e293b;\n }\n\n .loader-row:hover {\n background: #1e293b;\n margin: 0 -1rem;\n padding-left: 1rem;\n padding-right: 1rem;\n border-radius: 4px;\n }\n\n .loader-name {\n font-family: 'Monaco', 'Menlo', monospace;\n font-size: 0.875rem;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .loader-bar-container {\n position: relative;\n height: 24px;\n background: #1e293b;\n border-radius: 4px;\n }\n\n .wait-indicator {\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n height: 2px;\n background: repeating-linear-gradient(\n 90deg,\n transparent,\n transparent 4px,\n #475569 4px,\n #475569 8px\n );\n }\n\n .wait-arrow {\n position: absolute;\n right: 0;\n top: 50%;\n transform: translateY(-50%);\n color: #64748b;\n font-size: 10px;\n }\n\n .loader-bar {\n position: absolute;\n top: 4px;\n height: 16px;\n border-radius: 4px;\n min-width: 2px;\n transition: all 0.2s ease;\n }\n\n .loader-bar:hover {\n filter: brightness(1.2);\n }\n\n .bar-default { background: linear-gradient(90deg, #6366f1, #8b5cf6); }\n .bar-db { background: linear-gradient(90deg, #3b82f6, #2563eb); }\n .bar-api { background: linear-gradient(90deg, #f59e0b, #d97706); }\n .bar-cache { background: linear-gradient(90deg, #10b981, #059669); }\n\n .loader-stats {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n font-size: 0.875rem;\n }\n\n .duration {\n font-family: 'Monaco', 'Menlo', monospace;\n color: #94a3b8;\n }\n\n .source-icon {\n font-size: 0.875rem;\n }\n\n .cache-badge {\n font-size: 0.625rem;\n padding: 0.125rem 0.375rem;\n background: #059669;\n color: white;\n border-radius: 2px;\n font-weight: 600;\n }\n\n .cache-hit .loader-name {\n color: #10b981;\n }\n\n /* Waterfall Warnings */\n .waterfall-section {\n margin-bottom: 1rem;\n }\n\n .waterfall-section h4 {\n margin: 0 0 0.75rem;\n font-size: 0.875rem;\n color: #f59e0b;\n }\n\n .waterfall-warning {\n display: flex;\n align-items: flex-start;\n gap: 0.75rem;\n padding: 0.75rem;\n background: #1e293b;\n border-radius: 8px;\n margin-bottom: 0.5rem;\n border-left: 3px solid #f59e0b;\n }\n\n .waterfall-warning.unnecessary {\n border-left-color: #10b981;\n }\n\n .waterfall-warning .icon {\n font-size: 1rem;\n }\n\n .waterfall-warning .message {\n font-size: 0.875rem;\n line-height: 1.4;\n color: #cbd5e1;\n }\n\n .all-good {\n padding: 1rem;\n background: rgba(16, 185, 129, 0.1);\n border: 1px solid rgba(16, 185, 129, 0.2);\n border-radius: 8px;\n text-align: center;\n color: #10b981;\n font-size: 0.875rem;\n }\n\n .pipeline-footer {\n text-align: right;\n font-size: 0.75rem;\n color: #475569;\n margin-top: 1rem;\n padding-top: 1rem;\n border-top: 1px solid #1e293b;\n }\n";
|
|
17
|
+
/**
|
|
18
|
+
* React component for Data Pipeline visualization.
|
|
19
|
+
* Used when rendering in React context.
|
|
20
|
+
*/
|
|
21
|
+
export declare function DataPipelineTab({ data }: {
|
|
22
|
+
data: DataPipelineVisualization;
|
|
23
|
+
}): null;
|
|
24
|
+
//# sourceMappingURL=DataPipelineTab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DataPipelineTab.d.ts","sourceRoot":"","sources":["../../src/devtools/DataPipelineTab.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAgB,MAAM,SAAS,CAAC;AAEvE;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,yBAAyB,GAAG,MAAM,CAyEhF;AA8FD;;GAEG;AACH,eAAO,MAAM,oBAAoB,4vKAuQhC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,yBAAyB,CAAA;CAAE,QAI5E"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ereo/dev-inspector - DevTools Panel
|
|
3
|
+
*
|
|
4
|
+
* Main DevTools panel combining all tabs.
|
|
5
|
+
*/
|
|
6
|
+
import type { DataPipelineVisualization, RouteVisualization, IslandVisualization, CacheVisualization, HMREvent } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* DevTools panel data.
|
|
9
|
+
*/
|
|
10
|
+
export interface DevToolsPanelData {
|
|
11
|
+
pipeline?: DataPipelineVisualization;
|
|
12
|
+
routes: RouteVisualization[];
|
|
13
|
+
islands: IslandVisualization[];
|
|
14
|
+
cache: CacheVisualization;
|
|
15
|
+
hmrEvents: HMREvent[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Generate the complete DevTools panel HTML.
|
|
19
|
+
*/
|
|
20
|
+
export declare function generateDevToolsPanelHTML(data: DevToolsPanelData): string;
|
|
21
|
+
/**
|
|
22
|
+
* React component placeholder.
|
|
23
|
+
*/
|
|
24
|
+
export declare function DevToolsPanel({ data }: {
|
|
25
|
+
data: DevToolsPanelData;
|
|
26
|
+
}): null;
|
|
27
|
+
//# sourceMappingURL=DevToolsPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevToolsPanel.d.ts","sourceRoot":"","sources":["../../src/devtools/DevToolsPanel.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EACV,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,QAAQ,EACT,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAgFzE;AAgaD;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,iBAAiB,CAAA;CAAE,QAElE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ereo/dev-inspector - Islands Tab
|
|
3
|
+
*
|
|
4
|
+
* Visualize island components with hydration status and strategies.
|
|
5
|
+
*/
|
|
6
|
+
import type { IslandVisualization } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Generate HTML for the Islands tab.
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateIslandsTabHTML(islands: IslandVisualization[]): string;
|
|
11
|
+
/**
|
|
12
|
+
* CSS styles for the Islands tab.
|
|
13
|
+
*/
|
|
14
|
+
export declare const ISLANDS_TAB_STYLES = "\n .islands-container {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: #0f172a;\n color: #e2e8f0;\n padding: 1.5rem;\n border-radius: 12px;\n }\n\n .islands-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 1.5rem;\n padding-bottom: 1rem;\n border-bottom: 1px solid #334155;\n }\n\n .islands-header h3 {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n .islands-stats {\n display: flex;\n gap: 1.5rem;\n }\n\n .stat {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .stat-value {\n font-size: 1.5rem;\n font-weight: 700;\n color: #3b82f6;\n }\n\n .stat-label {\n font-size: 0.75rem;\n color: #64748b;\n text-transform: uppercase;\n }\n\n .hydration-strategies {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 1rem;\n margin-bottom: 1.5rem;\n }\n\n .strategy-card {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 1rem;\n background: #1e293b;\n border-radius: 8px;\n }\n\n .strategy-icon {\n font-size: 1.5rem;\n }\n\n .strategy-info {\n display: flex;\n flex-direction: column;\n }\n\n .strategy-name {\n font-size: 0.875rem;\n color: #94a3b8;\n }\n\n .strategy-count {\n font-size: 1.25rem;\n font-weight: 700;\n color: #f8fafc;\n }\n\n .islands-list {\n background: #1e293b;\n border-radius: 8px;\n overflow: hidden;\n margin-bottom: 1rem;\n }\n\n .island-row {\n display: grid;\n grid-template-columns: 1fr 150px 100px 70px;\n gap: 1rem;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid #0f172a;\n align-items: center;\n }\n\n .island-row:hover {\n background: #334155;\n }\n\n .island-row.pending {\n opacity: 0.7;\n }\n\n .island-main {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n\n .island-status {\n font-size: 1rem;\n }\n\n .island-info {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .island-component {\n font-family: 'Monaco', 'Menlo', monospace;\n font-size: 0.875rem;\n color: #f8fafc;\n }\n\n .island-selector {\n font-size: 0.75rem;\n color: #64748b;\n }\n\n .strategy-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.75rem;\n font-weight: 500;\n }\n\n .strategy-load { background: #3b82f6; color: white; }\n .strategy-idle { background: #6366f1; color: white; }\n .strategy-visible { background: #10b981; color: white; }\n .strategy-media { background: #f59e0b; color: white; }\n .strategy-none { background: #64748b; color: white; }\n\n .media-query {\n font-size: 0.625rem;\n color: #94a3b8;\n display: block;\n margin-top: 0.25rem;\n }\n\n .island-metrics {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n text-align: right;\n }\n\n .hydration-time {\n font-family: 'Monaco', 'Menlo', monospace;\n font-size: 0.875rem;\n color: #10b981;\n }\n\n .props-size {\n font-size: 0.75rem;\n color: #64748b;\n }\n\n .island-actions {\n display: flex;\n gap: 0.25rem;\n }\n\n .island-action {\n padding: 0.25rem;\n background: transparent;\n border: none;\n cursor: pointer;\n font-size: 1rem;\n border-radius: 4px;\n transition: background 0.2s;\n }\n\n .island-action:hover {\n background: #334155;\n }\n\n .no-islands {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 3rem;\n color: #64748b;\n }\n\n .no-islands-icon {\n font-size: 3rem;\n margin-bottom: 1rem;\n }\n\n .islands-actions {\n display: flex;\n gap: 0.5rem;\n justify-content: flex-end;\n }\n\n .action-btn {\n padding: 0.5rem 1rem;\n background: #3b82f6;\n border: none;\n border-radius: 6px;\n color: white;\n font-size: 0.875rem;\n cursor: pointer;\n transition: background 0.2s;\n }\n\n .action-btn:hover {\n background: #2563eb;\n }\n";
|
|
15
|
+
/**
|
|
16
|
+
* React component placeholder.
|
|
17
|
+
*/
|
|
18
|
+
export declare function IslandsTab({ islands }: {
|
|
19
|
+
islands: IslandVisualization[];
|
|
20
|
+
}): null;
|
|
21
|
+
//# sourceMappingURL=IslandsTab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IslandsTab.d.ts","sourceRoot":"","sources":["../../src/devtools/IslandsTab.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAgF7E;AAmGD;;GAEG;AACH,eAAO,MAAM,kBAAkB,2lIAmO9B,CAAC;AAEF;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,mBAAmB,EAAE,CAAA;CAAE,QAEzE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ereo/dev-inspector - Routes Tab
|
|
3
|
+
*
|
|
4
|
+
* Visualize all routes with render modes, middleware, and configuration.
|
|
5
|
+
*/
|
|
6
|
+
import type { RouteVisualization } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Generate HTML for the Routes tab.
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateRoutesTabHTML(routes: RouteVisualization[]): string;
|
|
11
|
+
/**
|
|
12
|
+
* CSS styles for the Routes tab.
|
|
13
|
+
*/
|
|
14
|
+
export declare const ROUTES_TAB_STYLES = "\n .routes-container {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: #0f172a;\n color: #e2e8f0;\n padding: 1.5rem;\n border-radius: 12px;\n }\n\n .routes-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 1.5rem;\n padding-bottom: 1rem;\n border-bottom: 1px solid #334155;\n }\n\n .routes-header h3 {\n margin: 0;\n font-size: 1.25rem;\n font-weight: 600;\n }\n\n .route-stats {\n display: flex;\n gap: 1.5rem;\n }\n\n .stat {\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .stat-value {\n font-size: 1.5rem;\n font-weight: 700;\n color: #3b82f6;\n }\n\n .stat-label {\n font-size: 0.75rem;\n color: #64748b;\n text-transform: uppercase;\n }\n\n .routes-filter {\n display: flex;\n gap: 1rem;\n margin-bottom: 1rem;\n }\n\n .search-input {\n flex: 1;\n padding: 0.5rem 1rem;\n background: #1e293b;\n border: 1px solid #334155;\n border-radius: 6px;\n color: #e2e8f0;\n font-size: 0.875rem;\n }\n\n .search-input:focus {\n outline: none;\n border-color: #3b82f6;\n }\n\n .filter-buttons {\n display: flex;\n gap: 0.5rem;\n }\n\n .filter-btn {\n padding: 0.5rem 1rem;\n background: #1e293b;\n border: 1px solid #334155;\n border-radius: 6px;\n color: #94a3b8;\n font-size: 0.75rem;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .filter-btn:hover {\n border-color: #3b82f6;\n }\n\n .filter-btn.active {\n background: #3b82f6;\n border-color: #3b82f6;\n color: white;\n }\n\n .routes-table {\n background: #1e293b;\n border-radius: 8px;\n overflow: hidden;\n }\n\n .routes-table-header {\n display: grid;\n grid-template-columns: 2fr 100px 1fr 80px;\n gap: 1rem;\n padding: 0.75rem 1rem;\n background: #0f172a;\n font-size: 0.75rem;\n color: #64748b;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .route-row {\n display: grid;\n grid-template-columns: 2fr 100px 1fr 80px;\n gap: 1rem;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid #0f172a;\n transition: background 0.2s;\n }\n\n .route-row:hover {\n background: #334155;\n }\n\n .route-path-cell {\n display: flex;\n flex-direction: column;\n gap: 0.25rem;\n }\n\n .route-path {\n font-family: 'Monaco', 'Menlo', monospace;\n font-size: 0.875rem;\n color: #f8fafc;\n }\n\n .route-file {\n font-size: 0.75rem;\n color: #64748b;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .mode-badge {\n display: inline-block;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n font-size: 0.625rem;\n font-weight: 600;\n }\n\n .mode-ssr { background: #3b82f6; color: white; }\n .mode-ssg { background: #10b981; color: white; }\n .mode-csr { background: #f59e0b; color: white; }\n .mode-api { background: #8b5cf6; color: white; }\n .mode-rsc { background: #ec4899; color: white; }\n\n .route-features-cell {\n display: flex;\n flex-wrap: wrap;\n gap: 0.25rem;\n }\n\n .feature-tag {\n padding: 0.125rem 0.375rem;\n background: #334155;\n border-radius: 4px;\n font-size: 0.625rem;\n color: #94a3b8;\n }\n\n .route-timing-cell {\n text-align: right;\n }\n\n .timing {\n font-family: 'Monaco', 'Menlo', monospace;\n font-size: 0.875rem;\n color: #10b981;\n }\n\n .timing-na {\n color: #475569;\n }\n";
|
|
15
|
+
/**
|
|
16
|
+
* React component placeholder.
|
|
17
|
+
*/
|
|
18
|
+
export declare function RoutesTab({ routes }: {
|
|
19
|
+
routes: RouteVisualization[];
|
|
20
|
+
}): null;
|
|
21
|
+
//# sourceMappingURL=RoutesTab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RoutesTab.d.ts","sourceRoot":"","sources":["../../src/devtools/RoutesTab.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAyF1E;AAoED;;GAEG;AACH,eAAO,MAAM,iBAAiB,s/GA0L7B,CAAC;AAEF;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;CAAE,QAErE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ereo/dev-inspector - DevTools
|
|
3
|
+
*
|
|
4
|
+
* Browser DevTools panel for EreoJS framework.
|
|
5
|
+
* Provides visibility into routes, data loading, islands, and cache.
|
|
6
|
+
*/
|
|
7
|
+
export { DataPipelineTab, generateDataPipelineHTML } from './DataPipelineTab';
|
|
8
|
+
export { RoutesTab, generateRoutesTabHTML } from './RoutesTab';
|
|
9
|
+
export { IslandsTab, generateIslandsTabHTML } from './IslandsTab';
|
|
10
|
+
export { CacheTab, generateCacheTabHTML } from './CacheTab';
|
|
11
|
+
export { DevToolsPanel, generateDevToolsPanelHTML } from './DevToolsPanel';
|
|
12
|
+
export { createDevToolsPlugin } from './plugin';
|
|
13
|
+
export type { DevToolsConfig, DataPipelineVisualization, IslandVisualization, CacheVisualization, } from './types';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/devtools/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEhD,YAAY,EACV,cAAc,EACd,yBAAyB,EACzB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ereo/dev-inspector - DevTools Plugin
|
|
3
|
+
*
|
|
4
|
+
* Plugin that adds DevTools to the EreoJS dev server.
|
|
5
|
+
*/
|
|
6
|
+
import type { Plugin } from '@ereo/core';
|
|
7
|
+
import type { DevToolsConfig, DataPipelineVisualization, RouteVisualization, HMREvent } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* DevTools state.
|
|
10
|
+
*/
|
|
11
|
+
interface DevToolsState {
|
|
12
|
+
routes: RouteVisualization[];
|
|
13
|
+
pipelineHistory: DataPipelineVisualization[];
|
|
14
|
+
hmrEvents: HMREvent[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create the DevTools plugin.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* import { createDevToolsPlugin } from '@ereo/dev-inspector';
|
|
21
|
+
*
|
|
22
|
+
* export default defineConfig({
|
|
23
|
+
* plugins: [
|
|
24
|
+
* createDevToolsPlugin({
|
|
25
|
+
* dataPipeline: true,
|
|
26
|
+
* islands: true,
|
|
27
|
+
* cache: true,
|
|
28
|
+
* }),
|
|
29
|
+
* ],
|
|
30
|
+
* });
|
|
31
|
+
*/
|
|
32
|
+
export declare function createDevToolsPlugin(config?: DevToolsConfig): Plugin;
|
|
33
|
+
/**
|
|
34
|
+
* Record HMR event (called by HMR system).
|
|
35
|
+
*/
|
|
36
|
+
export declare function recordHMREvent(state: DevToolsState, event: Omit<HMREvent, 'timestamp'>): void;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/devtools/plugin.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAS,MAAM,YAAY,CAAC;AAEhD,OAAO,KAAK,EACV,cAAc,EACd,yBAAyB,EACzB,kBAAkB,EAGlB,QAAQ,EACT,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,UAAU,aAAa;IACrB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,eAAe,EAAE,yBAAyB,EAAE,CAAC;IAC7C,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,GAAE,cAAmB,GAAG,MAAM,CAkKxE;AAyJD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,GACjC,IAAI,CAUN"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ereo/dev-inspector - DevTools Types
|
|
3
|
+
*/
|
|
4
|
+
import type { WaterfallInfo } from '@ereo/data';
|
|
5
|
+
/**
|
|
6
|
+
* DevTools configuration.
|
|
7
|
+
*/
|
|
8
|
+
export interface DevToolsConfig {
|
|
9
|
+
/** Mount path for DevTools panel (default: /__devtools) */
|
|
10
|
+
mountPath?: string;
|
|
11
|
+
/** Enable data pipeline visualization */
|
|
12
|
+
dataPipeline?: boolean;
|
|
13
|
+
/** Enable routes visualization */
|
|
14
|
+
routes?: boolean;
|
|
15
|
+
/** Enable islands visualization */
|
|
16
|
+
islands?: boolean;
|
|
17
|
+
/** Enable cache visualization */
|
|
18
|
+
cache?: boolean;
|
|
19
|
+
/** Position of overlay (default: bottom-right) */
|
|
20
|
+
position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Data pipeline visualization data.
|
|
24
|
+
*/
|
|
25
|
+
export interface DataPipelineVisualization {
|
|
26
|
+
/** Route path */
|
|
27
|
+
route: string;
|
|
28
|
+
/** Total execution time */
|
|
29
|
+
totalTime: number;
|
|
30
|
+
/** Individual loader timings */
|
|
31
|
+
loaders: LoaderTiming[];
|
|
32
|
+
/** Parallel efficiency score (0-1) */
|
|
33
|
+
efficiency: number;
|
|
34
|
+
/** Detected waterfalls */
|
|
35
|
+
waterfalls: WaterfallInfo[];
|
|
36
|
+
/** Timestamp of request */
|
|
37
|
+
timestamp: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Individual loader timing data.
|
|
41
|
+
*/
|
|
42
|
+
export interface LoaderTiming {
|
|
43
|
+
/** Loader key/name */
|
|
44
|
+
key: string;
|
|
45
|
+
/** Start time relative to request start (ms) */
|
|
46
|
+
start: number;
|
|
47
|
+
/** End time relative to request start (ms) */
|
|
48
|
+
end: number;
|
|
49
|
+
/** Duration (ms) */
|
|
50
|
+
duration: number;
|
|
51
|
+
/** Whether result came from cache */
|
|
52
|
+
cacheHit: boolean;
|
|
53
|
+
/** Data source type */
|
|
54
|
+
source: 'db' | 'api' | 'cache' | 'compute' | 'unknown';
|
|
55
|
+
/** Loaders this was waiting for */
|
|
56
|
+
waitingFor: string[];
|
|
57
|
+
/** Data size in bytes (if available) */
|
|
58
|
+
size?: number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Island visualization data.
|
|
62
|
+
*/
|
|
63
|
+
export interface IslandVisualization {
|
|
64
|
+
/** Island ID */
|
|
65
|
+
id: string;
|
|
66
|
+
/** Component name */
|
|
67
|
+
component: string;
|
|
68
|
+
/** Hydration strategy */
|
|
69
|
+
strategy: 'load' | 'idle' | 'visible' | 'media' | 'none';
|
|
70
|
+
/** Media query (if strategy is 'media') */
|
|
71
|
+
mediaQuery?: string;
|
|
72
|
+
/** Whether island is currently hydrated */
|
|
73
|
+
hydrated: boolean;
|
|
74
|
+
/** Time to hydration (ms) */
|
|
75
|
+
hydrationTime?: number;
|
|
76
|
+
/** Props size in bytes */
|
|
77
|
+
propsSize: number;
|
|
78
|
+
/** DOM element selector */
|
|
79
|
+
selector: string;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Cache visualization data.
|
|
83
|
+
*/
|
|
84
|
+
export interface CacheVisualization {
|
|
85
|
+
/** Cache entries */
|
|
86
|
+
entries: CacheEntry[];
|
|
87
|
+
/** Total cache size */
|
|
88
|
+
totalSize: number;
|
|
89
|
+
/** Hit rate (0-1) */
|
|
90
|
+
hitRate: number;
|
|
91
|
+
/** Cache stats by tag */
|
|
92
|
+
tagStats: Map<string, {
|
|
93
|
+
count: number;
|
|
94
|
+
hits: number;
|
|
95
|
+
misses: number;
|
|
96
|
+
}>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Individual cache entry.
|
|
100
|
+
*/
|
|
101
|
+
export interface CacheEntry {
|
|
102
|
+
/** Cache key */
|
|
103
|
+
key: string;
|
|
104
|
+
/** Associated tags */
|
|
105
|
+
tags: string[];
|
|
106
|
+
/** Entry size in bytes */
|
|
107
|
+
size: number;
|
|
108
|
+
/** Time to live remaining (ms) */
|
|
109
|
+
ttl: number;
|
|
110
|
+
/** Created timestamp */
|
|
111
|
+
created: number;
|
|
112
|
+
/** Last accessed timestamp */
|
|
113
|
+
lastAccessed: number;
|
|
114
|
+
/** Access count */
|
|
115
|
+
accessCount: number;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Route visualization data.
|
|
119
|
+
*/
|
|
120
|
+
export interface RouteVisualization {
|
|
121
|
+
/** Route path */
|
|
122
|
+
path: string;
|
|
123
|
+
/** Route file */
|
|
124
|
+
file: string;
|
|
125
|
+
/** Render mode */
|
|
126
|
+
renderMode: 'ssr' | 'ssg' | 'csr' | 'api' | 'rsc';
|
|
127
|
+
/** Has loader */
|
|
128
|
+
hasLoader: boolean;
|
|
129
|
+
/** Has action */
|
|
130
|
+
hasAction: boolean;
|
|
131
|
+
/** Middleware chain */
|
|
132
|
+
middleware: string[];
|
|
133
|
+
/** Island count */
|
|
134
|
+
islandCount: number;
|
|
135
|
+
/** Cache tags */
|
|
136
|
+
cacheTags: string[];
|
|
137
|
+
/** Auth required */
|
|
138
|
+
authRequired: boolean;
|
|
139
|
+
/** Last request timing */
|
|
140
|
+
lastTiming?: number;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* HMR event for DevTools.
|
|
144
|
+
*/
|
|
145
|
+
export interface HMREvent {
|
|
146
|
+
/** Event type */
|
|
147
|
+
type: 'full-reload' | 'css-update' | 'island-update' | 'loader-update' | 'component-update';
|
|
148
|
+
/** File path */
|
|
149
|
+
path: string;
|
|
150
|
+
/** Reason for update type */
|
|
151
|
+
reason?: string;
|
|
152
|
+
/** Timestamp */
|
|
153
|
+
timestamp: number;
|
|
154
|
+
/** Duration (ms) */
|
|
155
|
+
duration?: number;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/devtools/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,YAAY,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,kCAAkC;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iCAAiC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,cAAc,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC;CACtE;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,sCAAsC;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B;IAC1B,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,sBAAsB;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,QAAQ,EAAE,OAAO,CAAC;IAClB,uBAAuB;IACvB,MAAM,EAAE,IAAI,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACvD,mCAAmC;IACnC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gBAAgB;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IACzD,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,6BAA6B;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,oBAAoB;IACpB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxE;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,gBAAgB;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,sBAAsB;IACtB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB;IAClB,UAAU,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAClD,iBAAiB;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,uBAAuB;IACvB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,mBAAmB;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,oBAAoB;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,0BAA0B;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,iBAAiB;IACjB,IAAI,EAAE,aAAa,GAAG,YAAY,GAAG,eAAe,GAAG,eAAe,GAAG,kBAAkB,CAAC;IAC5F,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @ereo/dev-inspector - Main exports
|
|
3
|
+
*/
|
|
4
|
+
export { createDevInspector, generateInspectorHTML, createRouteInfo, formatRouteTree, } from './inspector';
|
|
5
|
+
export type { InspectorConfig, RouteInfo, } from './inspector';
|
|
6
|
+
export { DataPipelineTab, generateDataPipelineHTML, RoutesTab, generateRoutesTabHTML, IslandsTab, generateIslandsTabHTML, CacheTab, generateCacheTabHTML, DevToolsPanel, generateDevToolsPanelHTML, createDevToolsPlugin, } from './devtools';
|
|
7
|
+
export type { DevToolsConfig, DataPipelineVisualization, IslandVisualization, CacheVisualization, } from './devtools';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,eAAe,GAChB,MAAM,aAAa,CAAC;AAErB,YAAY,EACV,eAAe,EACf,SAAS,GACV,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,SAAS,EACT,qBAAqB,EACrB,UAAU,EACV,sBAAsB,EACtB,QAAQ,EACR,oBAAoB,EACpB,aAAa,EACb,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,YAAY,EACV,cAAc,EACd,yBAAyB,EACzB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
|