@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 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":"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"}
@@ -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"}