@vestig/next 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +1 -1
  2. package/dist/__tests__/mocks/next-server.d.ts.map +1 -1
  3. package/dist/__tests__/mocks/next-server.js.map +1 -1
  4. package/dist/client/error-boundary.d.ts +80 -0
  5. package/dist/client/error-boundary.d.ts.map +1 -0
  6. package/dist/client/error-boundary.js +182 -0
  7. package/dist/client/error-boundary.js.map +1 -0
  8. package/dist/client/index.d.ts +2 -1
  9. package/dist/client/index.d.ts.map +1 -1
  10. package/dist/client/index.js +2 -0
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/client/transport.d.ts +42 -0
  13. package/dist/client/transport.d.ts.map +1 -1
  14. package/dist/client/transport.js +143 -2
  15. package/dist/client/transport.js.map +1 -1
  16. package/dist/client.d.ts +2 -1
  17. package/dist/client.d.ts.map +1 -1
  18. package/dist/client.js +2 -0
  19. package/dist/client.js.map +1 -1
  20. package/dist/db/drizzle.d.ts +115 -0
  21. package/dist/db/drizzle.d.ts.map +1 -0
  22. package/dist/db/drizzle.js +174 -0
  23. package/dist/db/drizzle.js.map +1 -0
  24. package/dist/db/index.d.ts +49 -0
  25. package/dist/db/index.d.ts.map +1 -0
  26. package/dist/db/index.js +51 -0
  27. package/dist/db/index.js.map +1 -0
  28. package/dist/db/prisma.d.ts +114 -0
  29. package/dist/db/prisma.d.ts.map +1 -0
  30. package/dist/db/prisma.js +144 -0
  31. package/dist/db/prisma.js.map +1 -0
  32. package/dist/db/query-logger.d.ts +30 -0
  33. package/dist/db/query-logger.d.ts.map +1 -0
  34. package/dist/db/query-logger.js +169 -0
  35. package/dist/db/query-logger.js.map +1 -0
  36. package/dist/db/types.d.ts +102 -0
  37. package/dist/db/types.d.ts.map +1 -0
  38. package/dist/db/types.js +28 -0
  39. package/dist/db/types.js.map +1 -0
  40. package/dist/dev/api/index.d.ts +13 -0
  41. package/dist/dev/api/index.d.ts.map +1 -0
  42. package/dist/dev/api/index.js +13 -0
  43. package/dist/dev/api/index.js.map +1 -0
  44. package/dist/dev/api/logs-stream.d.ts +119 -0
  45. package/dist/dev/api/logs-stream.d.ts.map +1 -0
  46. package/dist/dev/api/logs-stream.js +156 -0
  47. package/dist/dev/api/logs-stream.js.map +1 -0
  48. package/dist/dev/filters.d.ts +17 -0
  49. package/dist/dev/filters.d.ts.map +1 -0
  50. package/dist/dev/filters.js +96 -0
  51. package/dist/dev/filters.js.map +1 -0
  52. package/dist/dev/hooks/use-logs.d.ts +53 -0
  53. package/dist/dev/hooks/use-logs.d.ts.map +1 -0
  54. package/dist/dev/hooks/use-logs.js +205 -0
  55. package/dist/dev/hooks/use-logs.js.map +1 -0
  56. package/dist/dev/index.d.ts +35 -0
  57. package/dist/dev/index.d.ts.map +1 -0
  58. package/dist/dev/index.js +41 -0
  59. package/dist/dev/index.js.map +1 -0
  60. package/dist/dev/log-entry.d.ts +12 -0
  61. package/dist/dev/log-entry.d.ts.map +1 -0
  62. package/dist/dev/log-entry.js +152 -0
  63. package/dist/dev/log-entry.js.map +1 -0
  64. package/dist/dev/log-viewer.d.ts +11 -0
  65. package/dist/dev/log-viewer.d.ts.map +1 -0
  66. package/dist/dev/log-viewer.js +49 -0
  67. package/dist/dev/log-viewer.js.map +1 -0
  68. package/dist/dev/metrics-card.d.ts +18 -0
  69. package/dist/dev/metrics-card.d.ts.map +1 -0
  70. package/dist/dev/metrics-card.js +75 -0
  71. package/dist/dev/metrics-card.js.map +1 -0
  72. package/dist/dev/metrics-histogram.d.ts +12 -0
  73. package/dist/dev/metrics-histogram.d.ts.map +1 -0
  74. package/dist/dev/metrics-histogram.js +69 -0
  75. package/dist/dev/metrics-histogram.js.map +1 -0
  76. package/dist/dev/metrics-panel.d.ts +10 -0
  77. package/dist/dev/metrics-panel.d.ts.map +1 -0
  78. package/dist/dev/metrics-panel.js +84 -0
  79. package/dist/dev/metrics-panel.js.map +1 -0
  80. package/dist/dev/overlay.d.ts +55 -0
  81. package/dist/dev/overlay.d.ts.map +1 -0
  82. package/dist/dev/overlay.js +204 -0
  83. package/dist/dev/overlay.js.map +1 -0
  84. package/dist/dev/store.d.ts +186 -0
  85. package/dist/dev/store.d.ts.map +1 -0
  86. package/dist/dev/store.js +214 -0
  87. package/dist/dev/store.js.map +1 -0
  88. package/dist/error/boundary.d.ts +36 -0
  89. package/dist/error/boundary.d.ts.map +1 -0
  90. package/dist/error/boundary.js +263 -0
  91. package/dist/error/boundary.js.map +1 -0
  92. package/dist/error/breadcrumbs.d.ts +95 -0
  93. package/dist/error/breadcrumbs.d.ts.map +1 -0
  94. package/dist/error/breadcrumbs.js +273 -0
  95. package/dist/error/breadcrumbs.js.map +1 -0
  96. package/dist/error/fingerprint.d.ts +42 -0
  97. package/dist/error/fingerprint.d.ts.map +1 -0
  98. package/dist/error/fingerprint.js +135 -0
  99. package/dist/error/fingerprint.js.map +1 -0
  100. package/dist/error/index.d.ts +52 -0
  101. package/dist/error/index.d.ts.map +1 -0
  102. package/dist/error/index.js +56 -0
  103. package/dist/error/index.js.map +1 -0
  104. package/dist/error/stack-parser.d.ts +43 -0
  105. package/dist/error/stack-parser.d.ts.map +1 -0
  106. package/dist/error/stack-parser.js +166 -0
  107. package/dist/error/stack-parser.js.map +1 -0
  108. package/dist/error/types.d.ts +152 -0
  109. package/dist/error/types.d.ts.map +1 -0
  110. package/dist/error/types.js +10 -0
  111. package/dist/error/types.js.map +1 -0
  112. package/dist/metrics/hooks/use-route-metrics.d.ts +91 -0
  113. package/dist/metrics/hooks/use-route-metrics.d.ts.map +1 -0
  114. package/dist/metrics/hooks/use-route-metrics.js +216 -0
  115. package/dist/metrics/hooks/use-route-metrics.js.map +1 -0
  116. package/dist/metrics/hooks/use-web-vitals.d.ts +70 -0
  117. package/dist/metrics/hooks/use-web-vitals.d.ts.map +1 -0
  118. package/dist/metrics/hooks/use-web-vitals.js +146 -0
  119. package/dist/metrics/hooks/use-web-vitals.js.map +1 -0
  120. package/dist/metrics/index.d.ts +51 -0
  121. package/dist/metrics/index.d.ts.map +1 -0
  122. package/dist/metrics/index.js +56 -0
  123. package/dist/metrics/index.js.map +1 -0
  124. package/dist/metrics/reporter.d.ts +87 -0
  125. package/dist/metrics/reporter.d.ts.map +1 -0
  126. package/dist/metrics/reporter.js +178 -0
  127. package/dist/metrics/reporter.js.map +1 -0
  128. package/dist/metrics/store.d.ts +34 -0
  129. package/dist/metrics/store.d.ts.map +1 -0
  130. package/dist/metrics/store.js +172 -0
  131. package/dist/metrics/store.js.map +1 -0
  132. package/dist/metrics/thresholds.d.ts +84 -0
  133. package/dist/metrics/thresholds.d.ts.map +1 -0
  134. package/dist/metrics/thresholds.js +148 -0
  135. package/dist/metrics/thresholds.js.map +1 -0
  136. package/dist/metrics/types.d.ts +211 -0
  137. package/dist/metrics/types.d.ts.map +1 -0
  138. package/dist/metrics/types.js +10 -0
  139. package/dist/metrics/types.js.map +1 -0
  140. package/dist/metrics/web-vitals.d.ts +72 -0
  141. package/dist/metrics/web-vitals.d.ts.map +1 -0
  142. package/dist/metrics/web-vitals.js +89 -0
  143. package/dist/metrics/web-vitals.js.map +1 -0
  144. package/package.json +28 -6
@@ -0,0 +1,204 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useEffect, useState } from 'react';
4
+ import { createPortal } from 'react-dom';
5
+ import { useLogStore, useServerLogs, useClientLogCapture, useDevOverlayShortcuts, } from './hooks/use-logs';
6
+ import { Filters } from './filters';
7
+ import { LogViewer } from './log-viewer';
8
+ import { MetricsPanel } from './metrics-panel';
9
+ /**
10
+ * Development overlay for real-time log viewing
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * // app/layout.tsx
15
+ * import { VestigDevOverlay } from '@vestig/next/dev'
16
+ *
17
+ * export default function RootLayout({ children }) {
18
+ * return (
19
+ * <html>
20
+ * <body>
21
+ * {children}
22
+ * {process.env.NODE_ENV === 'development' && <VestigDevOverlay />}
23
+ * </body>
24
+ * </html>
25
+ * )
26
+ * }
27
+ * ```
28
+ */
29
+ export function VestigDevOverlay({ position = 'bottom-right', endpoint = '/api/vestig/logs', toggleKey = 'l', defaultSize = { width: 500, height: 400 }, defaultOpen = false, }) {
30
+ const [mounted, setMounted] = useState(false);
31
+ const [size, setSize] = useState(defaultSize);
32
+ const [activeTab, setActiveTab] = useState('logs');
33
+ const { logs, isOpen, filters, namespaces, levelCounts, toggleOpen, setOpen, clearLogs, setLevelFilter, setSearch, setSourceFilter, } = useLogStore();
34
+ // Connect to server logs via SSE
35
+ useServerLogs({ endpoint, enabled: true });
36
+ // Capture client-side logs
37
+ useClientLogCapture({ enabled: true });
38
+ // Setup keyboard shortcuts
39
+ useDevOverlayShortcuts({ toggleKey, enabled: true });
40
+ // Set default open state
41
+ useEffect(() => {
42
+ if (defaultOpen) {
43
+ setOpen(true);
44
+ }
45
+ }, [defaultOpen, setOpen]);
46
+ // Portal mounting
47
+ useEffect(() => {
48
+ setMounted(true);
49
+ }, []);
50
+ if (!mounted) {
51
+ return null;
52
+ }
53
+ const positionStyles = {
54
+ 'bottom-right': { bottom: '16px', right: '16px' },
55
+ 'bottom-left': { bottom: '16px', left: '16px' },
56
+ 'top-right': { top: '16px', right: '16px' },
57
+ 'top-left': { top: '16px', left: '16px' },
58
+ };
59
+ const panelPositionStyles = {
60
+ 'bottom-right': { bottom: '60px', right: '16px' },
61
+ 'bottom-left': { bottom: '60px', left: '16px' },
62
+ 'top-right': { top: '60px', right: '16px' },
63
+ 'top-left': { top: '60px', left: '16px' },
64
+ };
65
+ const buttonStyle = {
66
+ position: 'fixed',
67
+ ...positionStyles[position],
68
+ width: '44px',
69
+ height: '44px',
70
+ borderRadius: '50%',
71
+ border: 'none',
72
+ backgroundColor: isOpen ? '#4f46e5' : '#1f2937',
73
+ color: 'white',
74
+ cursor: 'pointer',
75
+ display: 'flex',
76
+ alignItems: 'center',
77
+ justifyContent: 'center',
78
+ boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',
79
+ zIndex: 99999,
80
+ transition: 'all 0.2s ease',
81
+ fontSize: '18px',
82
+ };
83
+ const errorCount = levelCounts.error;
84
+ const badgeStyle = {
85
+ position: 'absolute',
86
+ top: '-4px',
87
+ right: '-4px',
88
+ width: '20px',
89
+ height: '20px',
90
+ borderRadius: '50%',
91
+ backgroundColor: '#dc2626',
92
+ color: 'white',
93
+ fontSize: '11px',
94
+ fontWeight: 700,
95
+ display: 'flex',
96
+ alignItems: 'center',
97
+ justifyContent: 'center',
98
+ };
99
+ const panelStyle = {
100
+ position: 'fixed',
101
+ ...panelPositionStyles[position],
102
+ width: `${size.width}px`,
103
+ height: `${size.height}px`,
104
+ backgroundColor: 'white',
105
+ borderRadius: '12px',
106
+ boxShadow: '0 8px 30px rgba(0, 0, 0, 0.12), 0 4px 10px rgba(0, 0, 0, 0.08)',
107
+ zIndex: 99998,
108
+ display: 'flex',
109
+ flexDirection: 'column',
110
+ overflow: 'hidden',
111
+ fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
112
+ border: '1px solid rgba(0, 0, 0, 0.08)',
113
+ };
114
+ const headerStyle = {
115
+ display: 'flex',
116
+ alignItems: 'center',
117
+ justifyContent: 'space-between',
118
+ padding: '10px 12px',
119
+ borderBottom: '1px solid rgba(0, 0, 0, 0.08)',
120
+ backgroundColor: '#1f2937',
121
+ color: 'white',
122
+ borderRadius: '12px 12px 0 0',
123
+ };
124
+ const titleStyle = {
125
+ display: 'flex',
126
+ alignItems: 'center',
127
+ gap: '8px',
128
+ fontSize: '13px',
129
+ fontWeight: 600,
130
+ };
131
+ const logoStyle = {
132
+ width: '20px',
133
+ height: '20px',
134
+ borderRadius: '4px',
135
+ backgroundColor: '#4f46e5',
136
+ display: 'flex',
137
+ alignItems: 'center',
138
+ justifyContent: 'center',
139
+ fontSize: '12px',
140
+ };
141
+ const headerActionsStyle = {
142
+ display: 'flex',
143
+ alignItems: 'center',
144
+ gap: '8px',
145
+ };
146
+ const closeButtonStyle = {
147
+ background: 'none',
148
+ border: 'none',
149
+ color: 'rgba(255, 255, 255, 0.7)',
150
+ cursor: 'pointer',
151
+ padding: '4px',
152
+ display: 'flex',
153
+ alignItems: 'center',
154
+ justifyContent: 'center',
155
+ borderRadius: '4px',
156
+ transition: 'color 0.15s ease',
157
+ };
158
+ const shortcutBadgeStyle = {
159
+ fontSize: '10px',
160
+ color: 'rgba(255, 255, 255, 0.5)',
161
+ backgroundColor: 'rgba(255, 255, 255, 0.1)',
162
+ padding: '2px 6px',
163
+ borderRadius: '4px',
164
+ };
165
+ const statusStyle = {
166
+ padding: '6px 12px',
167
+ borderTop: '1px solid rgba(0, 0, 0, 0.08)',
168
+ backgroundColor: '#f9fafb',
169
+ fontSize: '11px',
170
+ color: '#6b7280',
171
+ display: 'flex',
172
+ alignItems: 'center',
173
+ justifyContent: 'space-between',
174
+ };
175
+ const tabsContainerStyle = {
176
+ display: 'flex',
177
+ borderBottom: '1px solid rgba(0, 0, 0, 0.08)',
178
+ backgroundColor: '#f9fafb',
179
+ };
180
+ const tabStyle = (isActive) => ({
181
+ flex: 1,
182
+ padding: '8px 12px',
183
+ fontSize: '12px',
184
+ fontWeight: 500,
185
+ color: isActive ? '#4f46e5' : '#6b7280',
186
+ backgroundColor: isActive ? 'white' : 'transparent',
187
+ border: 'none',
188
+ borderBottom: isActive ? '2px solid #4f46e5' : '2px solid transparent',
189
+ cursor: 'pointer',
190
+ display: 'flex',
191
+ alignItems: 'center',
192
+ justifyContent: 'center',
193
+ gap: '6px',
194
+ transition: 'all 0.15s ease',
195
+ });
196
+ return createPortal(_jsxs(_Fragment, { children: [_jsxs("button", { style: buttonStyle, onClick: toggleOpen, title: `Toggle Vestig DevTools (${navigator.platform.includes('Mac') ? '⌘' : 'Ctrl'}+${toggleKey.toUpperCase()})`, children: [_jsx("span", { children: "\uD83D\uDCCB" }), errorCount > 0 && _jsx("span", { style: badgeStyle, children: errorCount > 99 ? '99+' : errorCount })] }), isOpen && (_jsxs("div", { style: panelStyle, children: [_jsxs("div", { style: headerStyle, children: [_jsxs("div", { style: titleStyle, children: [_jsx("div", { style: logoStyle, children: "V" }), _jsx("span", { children: "Vestig DevTools" })] }), _jsxs("div", { style: headerActionsStyle, children: [_jsxs("span", { style: shortcutBadgeStyle, children: [navigator.platform.includes('Mac') ? '⌘' : 'Ctrl', "+", toggleKey.toUpperCase()] }), _jsx("button", { style: closeButtonStyle, onClick: () => setOpen(false), title: "Close (Esc)", onMouseEnter: (e) => (e.currentTarget.style.color = 'white'), onMouseLeave: (e) => (e.currentTarget.style.color = 'rgba(255, 255, 255, 0.7)'), children: _jsx("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "currentColor", children: _jsx("path", { d: "M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z" }) }) })] })] }), _jsxs("div", { style: tabsContainerStyle, children: [_jsxs("button", { style: tabStyle(activeTab === 'logs'), onClick: () => setActiveTab('logs'), children: [_jsx("span", { children: "\uD83D\uDCCB" }), _jsx("span", { children: "Logs" }), logs.length > 0 && (_jsx("span", { style: {
197
+ backgroundColor: activeTab === 'logs' ? '#e0e7ff' : '#e5e7eb',
198
+ color: activeTab === 'logs' ? '#4338ca' : '#6b7280',
199
+ padding: '1px 6px',
200
+ borderRadius: '10px',
201
+ fontSize: '10px',
202
+ }, children: logs.length }))] }), _jsxs("button", { style: tabStyle(activeTab === 'metrics'), onClick: () => setActiveTab('metrics'), children: [_jsx("span", { children: "\uD83D\uDCCA" }), _jsx("span", { children: "Metrics" })] })] }), activeTab === 'logs' && (_jsxs(_Fragment, { children: [_jsx(Filters, { filters: filters, levelCounts: levelCounts, namespaces: namespaces, onSetLevelFilter: setLevelFilter, onSetSearch: setSearch, onSetSourceFilter: setSourceFilter, onClearLogs: clearLogs }), _jsx(LogViewer, { logs: logs })] })), activeTab === 'metrics' && _jsx(MetricsPanel, {}), _jsxs("div", { style: statusStyle, children: [_jsxs("span", { children: [logs.length, " log", logs.length !== 1 ? 's' : '', filters.search && ` matching "${filters.search}"`] }), _jsxs("span", { children: [_jsx("span", { style: { color: '#16a34a' }, children: "\u25CF" }), " Connected"] })] })] }))] }), document.body);
203
+ }
204
+ //# sourceMappingURL=overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../src/dev/overlay.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * Dev Overlay Log Store
3
+ *
4
+ * Global store for logs that persists across component re-renders.
5
+ * Uses a pub/sub pattern for efficient updates without React state.
6
+ */
7
+ import type { LogLevel } from 'vestig';
8
+ /**
9
+ * Stored log entry with additional dev metadata
10
+ */
11
+ export interface DevLogEntry {
12
+ id: string;
13
+ timestamp: string;
14
+ level: LogLevel;
15
+ message: string;
16
+ namespace?: string;
17
+ metadata?: Record<string, unknown>;
18
+ context?: Record<string, unknown>;
19
+ error?: {
20
+ name: string;
21
+ message: string;
22
+ stack?: string;
23
+ };
24
+ source: 'client' | 'server';
25
+ traceId?: string;
26
+ spanId?: string;
27
+ duration?: number;
28
+ }
29
+ /**
30
+ * Filter state for log viewer
31
+ */
32
+ export interface LogFilters {
33
+ levels: Set<LogLevel>;
34
+ namespaces: Set<string>;
35
+ search: string;
36
+ source: 'all' | 'client' | 'server';
37
+ }
38
+ /**
39
+ * Store state
40
+ */
41
+ interface StoreState {
42
+ logs: DevLogEntry[];
43
+ filters: LogFilters;
44
+ isOpen: boolean;
45
+ maxLogs: number;
46
+ }
47
+ /**
48
+ * Store listener callback
49
+ */
50
+ type Listener = () => void;
51
+ /**
52
+ * Create the log store
53
+ */
54
+ declare function createLogStore(): {
55
+ /**
56
+ * Subscribe to store changes
57
+ */
58
+ subscribe(listener: Listener): () => void;
59
+ /**
60
+ * Get current state snapshot
61
+ */
62
+ getSnapshot(): StoreState;
63
+ /**
64
+ * Get filtered logs
65
+ */
66
+ getFilteredLogs(): DevLogEntry[];
67
+ /**
68
+ * Add a log entry
69
+ */
70
+ addLog(entry: Omit<DevLogEntry, "id">): void;
71
+ /**
72
+ * Add multiple log entries (batch)
73
+ */
74
+ addLogs(entries: Array<Omit<DevLogEntry, "id">>): void;
75
+ /**
76
+ * Clear all logs
77
+ */
78
+ clearLogs(): void;
79
+ /**
80
+ * Toggle overlay visibility
81
+ */
82
+ toggleOpen(): void;
83
+ /**
84
+ * Set overlay visibility
85
+ */
86
+ setOpen(isOpen: boolean): void;
87
+ /**
88
+ * Update filter levels
89
+ */
90
+ setLevelFilter(level: LogLevel, enabled: boolean): void;
91
+ /**
92
+ * Toggle all levels
93
+ */
94
+ toggleAllLevels(enabled: boolean): void;
95
+ /**
96
+ * Set namespace filter
97
+ */
98
+ setNamespaceFilter(namespace: string, enabled: boolean): void;
99
+ /**
100
+ * Set search query
101
+ */
102
+ setSearch(search: string): void;
103
+ /**
104
+ * Set source filter
105
+ */
106
+ setSourceFilter(source: "all" | "client" | "server"): void;
107
+ /**
108
+ * Get all unique namespaces from logs
109
+ */
110
+ getNamespaces(): string[];
111
+ /**
112
+ * Get log counts by level
113
+ */
114
+ getLevelCounts(): Record<LogLevel, number>;
115
+ };
116
+ /**
117
+ * Singleton store instance
118
+ */
119
+ export declare const logStore: {
120
+ /**
121
+ * Subscribe to store changes
122
+ */
123
+ subscribe(listener: Listener): () => void;
124
+ /**
125
+ * Get current state snapshot
126
+ */
127
+ getSnapshot(): StoreState;
128
+ /**
129
+ * Get filtered logs
130
+ */
131
+ getFilteredLogs(): DevLogEntry[];
132
+ /**
133
+ * Add a log entry
134
+ */
135
+ addLog(entry: Omit<DevLogEntry, "id">): void;
136
+ /**
137
+ * Add multiple log entries (batch)
138
+ */
139
+ addLogs(entries: Array<Omit<DevLogEntry, "id">>): void;
140
+ /**
141
+ * Clear all logs
142
+ */
143
+ clearLogs(): void;
144
+ /**
145
+ * Toggle overlay visibility
146
+ */
147
+ toggleOpen(): void;
148
+ /**
149
+ * Set overlay visibility
150
+ */
151
+ setOpen(isOpen: boolean): void;
152
+ /**
153
+ * Update filter levels
154
+ */
155
+ setLevelFilter(level: LogLevel, enabled: boolean): void;
156
+ /**
157
+ * Toggle all levels
158
+ */
159
+ toggleAllLevels(enabled: boolean): void;
160
+ /**
161
+ * Set namespace filter
162
+ */
163
+ setNamespaceFilter(namespace: string, enabled: boolean): void;
164
+ /**
165
+ * Set search query
166
+ */
167
+ setSearch(search: string): void;
168
+ /**
169
+ * Set source filter
170
+ */
171
+ setSourceFilter(source: "all" | "client" | "server"): void;
172
+ /**
173
+ * Get all unique namespaces from logs
174
+ */
175
+ getNamespaces(): string[];
176
+ /**
177
+ * Get log counts by level
178
+ */
179
+ getLevelCounts(): Record<LogLevel, number>;
180
+ };
181
+ /**
182
+ * Type for the store
183
+ */
184
+ export type LogStore = ReturnType<typeof createLogStore>;
185
+ export {};
186
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/dev/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Dev Overlay Log Store
3
+ *
4
+ * Global store for logs that persists across component re-renders.
5
+ * Uses a pub/sub pattern for efficient updates without React state.
6
+ */
7
+ /**
8
+ * Create the log store
9
+ */
10
+ function createLogStore() {
11
+ const state = {
12
+ logs: [],
13
+ filters: {
14
+ levels: new Set(['trace', 'debug', 'info', 'warn', 'error']),
15
+ namespaces: new Set(),
16
+ search: '',
17
+ source: 'all',
18
+ },
19
+ isOpen: false,
20
+ maxLogs: 500,
21
+ };
22
+ const listeners = new Set();
23
+ function notify() {
24
+ listeners.forEach((listener) => listener());
25
+ }
26
+ /**
27
+ * Generate unique log ID
28
+ */
29
+ function generateId() {
30
+ return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
31
+ }
32
+ return {
33
+ /**
34
+ * Subscribe to store changes
35
+ */
36
+ subscribe(listener) {
37
+ listeners.add(listener);
38
+ return () => listeners.delete(listener);
39
+ },
40
+ /**
41
+ * Get current state snapshot
42
+ */
43
+ getSnapshot() {
44
+ return state;
45
+ },
46
+ /**
47
+ * Get filtered logs
48
+ */
49
+ getFilteredLogs() {
50
+ return state.logs.filter((log) => {
51
+ // Level filter
52
+ if (!state.filters.levels.has(log.level))
53
+ return false;
54
+ // Source filter
55
+ if (state.filters.source !== 'all' && log.source !== state.filters.source) {
56
+ return false;
57
+ }
58
+ // Namespace filter (if any selected)
59
+ if (state.filters.namespaces.size > 0 && log.namespace) {
60
+ if (!state.filters.namespaces.has(log.namespace))
61
+ return false;
62
+ }
63
+ // Search filter
64
+ if (state.filters.search) {
65
+ const searchLower = state.filters.search.toLowerCase();
66
+ const matchesMessage = log.message.toLowerCase().includes(searchLower);
67
+ const matchesNamespace = log.namespace?.toLowerCase().includes(searchLower);
68
+ const matchesMetadata = JSON.stringify(log.metadata ?? {})
69
+ .toLowerCase()
70
+ .includes(searchLower);
71
+ if (!matchesMessage && !matchesNamespace && !matchesMetadata) {
72
+ return false;
73
+ }
74
+ }
75
+ return true;
76
+ });
77
+ },
78
+ /**
79
+ * Add a log entry
80
+ */
81
+ addLog(entry) {
82
+ const log = {
83
+ ...entry,
84
+ id: generateId(),
85
+ };
86
+ state.logs.push(log);
87
+ // Trim to max size (remove oldest)
88
+ while (state.logs.length > state.maxLogs) {
89
+ state.logs.shift();
90
+ }
91
+ notify();
92
+ },
93
+ /**
94
+ * Add multiple log entries (batch)
95
+ */
96
+ addLogs(entries) {
97
+ for (const entry of entries) {
98
+ state.logs.push({
99
+ ...entry,
100
+ id: generateId(),
101
+ });
102
+ }
103
+ // Trim to max size
104
+ while (state.logs.length > state.maxLogs) {
105
+ state.logs.shift();
106
+ }
107
+ notify();
108
+ },
109
+ /**
110
+ * Clear all logs
111
+ */
112
+ clearLogs() {
113
+ state.logs = [];
114
+ notify();
115
+ },
116
+ /**
117
+ * Toggle overlay visibility
118
+ */
119
+ toggleOpen() {
120
+ state.isOpen = !state.isOpen;
121
+ notify();
122
+ },
123
+ /**
124
+ * Set overlay visibility
125
+ */
126
+ setOpen(isOpen) {
127
+ state.isOpen = isOpen;
128
+ notify();
129
+ },
130
+ /**
131
+ * Update filter levels
132
+ */
133
+ setLevelFilter(level, enabled) {
134
+ if (enabled) {
135
+ state.filters.levels.add(level);
136
+ }
137
+ else {
138
+ state.filters.levels.delete(level);
139
+ }
140
+ notify();
141
+ },
142
+ /**
143
+ * Toggle all levels
144
+ */
145
+ toggleAllLevels(enabled) {
146
+ if (enabled) {
147
+ state.filters.levels = new Set(['trace', 'debug', 'info', 'warn', 'error']);
148
+ }
149
+ else {
150
+ state.filters.levels.clear();
151
+ }
152
+ notify();
153
+ },
154
+ /**
155
+ * Set namespace filter
156
+ */
157
+ setNamespaceFilter(namespace, enabled) {
158
+ if (enabled) {
159
+ state.filters.namespaces.add(namespace);
160
+ }
161
+ else {
162
+ state.filters.namespaces.delete(namespace);
163
+ }
164
+ notify();
165
+ },
166
+ /**
167
+ * Set search query
168
+ */
169
+ setSearch(search) {
170
+ state.filters.search = search;
171
+ notify();
172
+ },
173
+ /**
174
+ * Set source filter
175
+ */
176
+ setSourceFilter(source) {
177
+ state.filters.source = source;
178
+ notify();
179
+ },
180
+ /**
181
+ * Get all unique namespaces from logs
182
+ */
183
+ getNamespaces() {
184
+ const namespaces = new Set();
185
+ for (const log of state.logs) {
186
+ if (log.namespace) {
187
+ namespaces.add(log.namespace);
188
+ }
189
+ }
190
+ return Array.from(namespaces).sort();
191
+ },
192
+ /**
193
+ * Get log counts by level
194
+ */
195
+ getLevelCounts() {
196
+ const counts = {
197
+ trace: 0,
198
+ debug: 0,
199
+ info: 0,
200
+ warn: 0,
201
+ error: 0,
202
+ };
203
+ for (const log of state.logs) {
204
+ counts[log.level]++;
205
+ }
206
+ return counts;
207
+ },
208
+ };
209
+ }
210
+ /**
211
+ * Singleton store instance
212
+ */
213
+ export const logStore = createLogStore();
214
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/dev/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { Component, type ErrorInfo, type ReactNode } from 'react';
2
+ import type { EnhancedErrorBoundaryProps, EnhancedErrorBoundaryState } from './types';
3
+ /**
4
+ * Enhanced Error Boundary Component
5
+ *
6
+ * Provides rich error context including:
7
+ * - Parsed stack traces with app code highlighted
8
+ * - Breadcrumb trail of events before the error
9
+ * - React component tree
10
+ * - Error fingerprinting for grouping
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * import { EnhancedErrorBoundary } from '@vestig/next/error'
15
+ *
16
+ * export default function Layout({ children }) {
17
+ * return (
18
+ * <EnhancedErrorBoundary
19
+ * showBreadcrumbs
20
+ * onError={(err) => sendToErrorService(err)}
21
+ * >
22
+ * {children}
23
+ * </EnhancedErrorBoundary>
24
+ * )
25
+ * }
26
+ * ```
27
+ */
28
+ export declare class EnhancedErrorBoundary extends Component<EnhancedErrorBoundaryProps, EnhancedErrorBoundaryState> {
29
+ constructor(props: EnhancedErrorBoundaryProps);
30
+ static getDerivedStateFromError(error: Error): Partial<EnhancedErrorBoundaryState>;
31
+ componentDidCatch(error: Error, errorInfo: ErrorInfo): void;
32
+ private reportError;
33
+ private handleReset;
34
+ render(): ReactNode;
35
+ }
36
+ //# sourceMappingURL=boundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundary.d.ts","sourceRoot":"","sources":["../../src/error/boundary.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAsB,MAAM,OAAO,CAAA;AACrF,OAAO,KAAK,EAEX,0BAA0B,EAC1B,0BAA0B,EAE1B,MAAM,SAAS,CAAA;AA6RhB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,qBAAsB,SAAQ,SAAS,CACnD,0BAA0B,EAC1B,0BAA0B,CAC1B;gBACY,KAAK,EAAE,0BAA0B;IAa7C,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAIzE,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;YActD,WAAW;IAyBzB,OAAO,CAAC,WAAW,CAMlB;IAEQ,MAAM,IAAI,SAAS;CA8B5B"}