@vestig/next 0.5.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 (157) 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/index.d.ts +1 -1
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/metrics/hooks/use-route-metrics.d.ts +91 -0
  115. package/dist/metrics/hooks/use-route-metrics.d.ts.map +1 -0
  116. package/dist/metrics/hooks/use-route-metrics.js +216 -0
  117. package/dist/metrics/hooks/use-route-metrics.js.map +1 -0
  118. package/dist/metrics/hooks/use-web-vitals.d.ts +70 -0
  119. package/dist/metrics/hooks/use-web-vitals.d.ts.map +1 -0
  120. package/dist/metrics/hooks/use-web-vitals.js +146 -0
  121. package/dist/metrics/hooks/use-web-vitals.js.map +1 -0
  122. package/dist/metrics/index.d.ts +51 -0
  123. package/dist/metrics/index.d.ts.map +1 -0
  124. package/dist/metrics/index.js +56 -0
  125. package/dist/metrics/index.js.map +1 -0
  126. package/dist/metrics/reporter.d.ts +87 -0
  127. package/dist/metrics/reporter.d.ts.map +1 -0
  128. package/dist/metrics/reporter.js +178 -0
  129. package/dist/metrics/reporter.js.map +1 -0
  130. package/dist/metrics/store.d.ts +34 -0
  131. package/dist/metrics/store.d.ts.map +1 -0
  132. package/dist/metrics/store.js +172 -0
  133. package/dist/metrics/store.js.map +1 -0
  134. package/dist/metrics/thresholds.d.ts +84 -0
  135. package/dist/metrics/thresholds.d.ts.map +1 -0
  136. package/dist/metrics/thresholds.js +148 -0
  137. package/dist/metrics/thresholds.js.map +1 -0
  138. package/dist/metrics/types.d.ts +211 -0
  139. package/dist/metrics/types.d.ts.map +1 -0
  140. package/dist/metrics/types.js +10 -0
  141. package/dist/metrics/types.js.map +1 -0
  142. package/dist/metrics/web-vitals.d.ts +72 -0
  143. package/dist/metrics/web-vitals.d.ts.map +1 -0
  144. package/dist/metrics/web-vitals.js +89 -0
  145. package/dist/metrics/web-vitals.js.map +1 -0
  146. package/dist/server/middleware.d.ts.map +1 -1
  147. package/dist/server/middleware.js +51 -37
  148. package/dist/server/middleware.js.map +1 -1
  149. package/dist/server/route-handler.d.ts.map +1 -1
  150. package/dist/server/route-handler.js +61 -40
  151. package/dist/server/route-handler.js.map +1 -1
  152. package/dist/server/server-action.d.ts.map +1 -1
  153. package/dist/server/server-action.js +54 -33
  154. package/dist/server/server-action.js.map +1 -1
  155. package/dist/types.d.ts +6 -2
  156. package/dist/types.d.ts.map +1 -1
  157. package/package.json +28 -6
@@ -0,0 +1,156 @@
1
+ /**
2
+ * SSE Endpoint Helper for Vestig Dev Overlay
3
+ *
4
+ * This module provides utilities for creating a Server-Sent Events
5
+ * endpoint that streams logs to the Dev Overlay in real-time.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * // app/api/vestig/logs/route.ts
10
+ * import { createLogStreamHandler, devLogEmitter } from '@vestig/next/dev/api'
11
+ *
12
+ * export const GET = createLogStreamHandler()
13
+ *
14
+ * // In your middleware or logger setup
15
+ * devLogEmitter.emit({
16
+ * timestamp: new Date().toISOString(),
17
+ * level: 'info',
18
+ * message: 'Hello from server',
19
+ * namespace: 'api',
20
+ * })
21
+ * ```
22
+ */
23
+ class DevLogEmitter {
24
+ listeners = new Set();
25
+ /**
26
+ * Subscribe to log events
27
+ */
28
+ subscribe(listener) {
29
+ this.listeners.add(listener);
30
+ return () => this.listeners.delete(listener);
31
+ }
32
+ /**
33
+ * Emit a log entry to all subscribers
34
+ */
35
+ emit(entry) {
36
+ for (const listener of this.listeners) {
37
+ try {
38
+ listener(entry);
39
+ }
40
+ catch (error) {
41
+ console.error('[vestig-dev] Log listener error:', error);
42
+ }
43
+ }
44
+ }
45
+ /**
46
+ * Get count of active listeners
47
+ */
48
+ get listenerCount() {
49
+ return this.listeners.size;
50
+ }
51
+ }
52
+ /**
53
+ * Singleton log emitter instance
54
+ */
55
+ export const devLogEmitter = new DevLogEmitter();
56
+ /**
57
+ * Create an SSE response for streaming logs
58
+ *
59
+ * @example
60
+ * ```typescript
61
+ * // app/api/vestig/logs/route.ts
62
+ * import { createLogStreamHandler } from '@vestig/next/dev/api'
63
+ *
64
+ * export const GET = createLogStreamHandler()
65
+ * ```
66
+ */
67
+ export function createLogStreamHandler(options) {
68
+ const { pingInterval = 30000 } = options ?? {};
69
+ return async function handler() {
70
+ const encoder = new TextEncoder();
71
+ let pingTimer = null;
72
+ let unsubscribe = null;
73
+ const stream = new ReadableStream({
74
+ start(controller) {
75
+ // Send initial connection message
76
+ controller.enqueue(encoder.encode(`data: ${JSON.stringify({ type: 'connected' })}\n\n`));
77
+ // Subscribe to log events
78
+ unsubscribe = devLogEmitter.subscribe((entry) => {
79
+ try {
80
+ const data = JSON.stringify({ type: 'log', ...entry });
81
+ controller.enqueue(encoder.encode(`data: ${data}\n\n`));
82
+ }
83
+ catch (error) {
84
+ console.error('[vestig-dev] SSE write error:', error);
85
+ }
86
+ });
87
+ // Send periodic pings to keep connection alive
88
+ pingTimer = setInterval(() => {
89
+ try {
90
+ controller.enqueue(encoder.encode(`data: ${JSON.stringify({ type: 'ping' })}\n\n`));
91
+ }
92
+ catch {
93
+ // Connection closed
94
+ if (pingTimer)
95
+ clearInterval(pingTimer);
96
+ }
97
+ }, pingInterval);
98
+ },
99
+ cancel() {
100
+ if (pingTimer) {
101
+ clearInterval(pingTimer);
102
+ pingTimer = null;
103
+ }
104
+ if (unsubscribe) {
105
+ unsubscribe();
106
+ unsubscribe = null;
107
+ }
108
+ },
109
+ });
110
+ return new Response(stream, {
111
+ headers: {
112
+ 'Content-Type': 'text/event-stream',
113
+ 'Cache-Control': 'no-cache, no-transform',
114
+ Connection: 'keep-alive',
115
+ 'X-Accel-Buffering': 'no', // Disable nginx buffering
116
+ },
117
+ });
118
+ };
119
+ }
120
+ /**
121
+ * Create a vestig transport that streams logs to Dev Overlay
122
+ *
123
+ * @example
124
+ * ```typescript
125
+ * import { createLogger } from 'vestig'
126
+ * import { createDevTransport } from '@vestig/next/dev/api'
127
+ *
128
+ * const logger = createLogger({
129
+ * // Only add dev transport in development
130
+ * transports: process.env.NODE_ENV === 'development'
131
+ * ? [createDevTransport()]
132
+ * : [],
133
+ * })
134
+ * ```
135
+ */
136
+ export function createDevTransport() {
137
+ return {
138
+ name: 'vestig-dev-overlay',
139
+ config: {
140
+ name: 'vestig-dev-overlay',
141
+ enabled: true,
142
+ },
143
+ log(entry) {
144
+ devLogEmitter.emit({
145
+ timestamp: entry.timestamp,
146
+ level: entry.level,
147
+ message: entry.message,
148
+ namespace: entry.namespace,
149
+ metadata: entry.metadata,
150
+ context: entry.context,
151
+ error: entry.error,
152
+ });
153
+ },
154
+ };
155
+ }
156
+ //# sourceMappingURL=logs-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs-stream.js","sourceRoot":"","sources":["../../../src/dev/api/logs-stream.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { LogLevel } from 'vestig';
2
+ import type { LogFilters } from './store';
3
+ interface FiltersProps {
4
+ filters: LogFilters;
5
+ levelCounts: Record<LogLevel, number>;
6
+ namespaces: string[];
7
+ onSetLevelFilter: (level: LogLevel, enabled: boolean) => void;
8
+ onSetSearch: (search: string) => void;
9
+ onSetSourceFilter: (source: 'all' | 'client' | 'server') => void;
10
+ onClearLogs: () => void;
11
+ }
12
+ /**
13
+ * Filter controls component
14
+ */
15
+ export declare const Filters: import("react").NamedExoticComponent<FiltersProps>;
16
+ export {};
17
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/dev/filters.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAazC,UAAU,YAAY;IACrB,OAAO,EAAE,UAAU,CAAA;IACnB,WAAW,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACrC,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,gBAAgB,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IAC7D,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,iBAAiB,EAAE,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,KAAK,IAAI,CAAA;IAChE,WAAW,EAAE,MAAM,IAAI,CAAA;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,oDAoJlB,CAAA"}
@@ -0,0 +1,96 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { memo } from 'react';
4
+ /**
5
+ * Level config for display
6
+ */
7
+ const LEVELS = [
8
+ { level: 'trace', label: 'TRC', color: '#6b7280', bgColor: '#f3f4f6' },
9
+ { level: 'debug', label: 'DBG', color: '#1e40af', bgColor: '#dbeafe' },
10
+ { level: 'info', label: 'INF', color: '#166534', bgColor: '#dcfce7' },
11
+ { level: 'warn', label: 'WRN', color: '#92400e', bgColor: '#fef3c7' },
12
+ { level: 'error', label: 'ERR', color: '#991b1b', bgColor: '#fee2e2' },
13
+ ];
14
+ /**
15
+ * Filter controls component
16
+ */
17
+ export const Filters = memo(function Filters({ filters, levelCounts, onSetLevelFilter, onSetSearch, onSetSourceFilter, onClearLogs, }) {
18
+ const containerStyle = {
19
+ display: 'flex',
20
+ flexDirection: 'column',
21
+ gap: '8px',
22
+ padding: '12px',
23
+ borderBottom: '1px solid rgba(0, 0, 0, 0.1)',
24
+ backgroundColor: '#fafafa',
25
+ };
26
+ const rowStyle = {
27
+ display: 'flex',
28
+ alignItems: 'center',
29
+ gap: '8px',
30
+ flexWrap: 'wrap',
31
+ };
32
+ const searchInputStyle = {
33
+ flex: 1,
34
+ minWidth: '200px',
35
+ padding: '6px 10px',
36
+ border: '1px solid #e5e7eb',
37
+ borderRadius: '6px',
38
+ fontSize: '13px',
39
+ fontFamily: 'inherit',
40
+ backgroundColor: 'white',
41
+ outline: 'none',
42
+ transition: 'border-color 0.15s ease',
43
+ };
44
+ const buttonGroupStyle = {
45
+ display: 'flex',
46
+ gap: '4px',
47
+ };
48
+ const sourceButtonStyle = (active) => ({
49
+ padding: '4px 10px',
50
+ border: '1px solid #e5e7eb',
51
+ borderRadius: '4px',
52
+ fontSize: '12px',
53
+ fontWeight: 500,
54
+ cursor: 'pointer',
55
+ backgroundColor: active ? '#4f46e5' : 'white',
56
+ color: active ? 'white' : '#374151',
57
+ transition: 'all 0.15s ease',
58
+ });
59
+ const levelButtonStyle = (level, active) => {
60
+ const config = LEVELS.find((l) => l.level === level);
61
+ return {
62
+ display: 'flex',
63
+ alignItems: 'center',
64
+ gap: '4px',
65
+ padding: '4px 8px',
66
+ border: `1px solid ${active ? config.color : '#e5e7eb'}`,
67
+ borderRadius: '4px',
68
+ fontSize: '11px',
69
+ fontWeight: 600,
70
+ cursor: 'pointer',
71
+ backgroundColor: active ? config.bgColor : 'white',
72
+ color: active ? config.color : '#9ca3af',
73
+ opacity: active ? 1 : 0.6,
74
+ transition: 'all 0.15s ease',
75
+ };
76
+ };
77
+ const countBadgeStyle = {
78
+ fontSize: '10px',
79
+ fontWeight: 500,
80
+ opacity: 0.8,
81
+ };
82
+ const clearButtonStyle = {
83
+ marginLeft: 'auto',
84
+ padding: '4px 10px',
85
+ border: '1px solid #fca5a5',
86
+ borderRadius: '4px',
87
+ fontSize: '12px',
88
+ fontWeight: 500,
89
+ cursor: 'pointer',
90
+ backgroundColor: 'white',
91
+ color: '#dc2626',
92
+ transition: 'all 0.15s ease',
93
+ };
94
+ return (_jsxs("div", { style: containerStyle, children: [_jsxs("div", { style: rowStyle, children: [_jsx("input", { type: "text", placeholder: "Search logs...", value: filters.search, onChange: (e) => onSetSearch(e.target.value), style: searchInputStyle, onFocus: (e) => (e.target.style.borderColor = '#4f46e5'), onBlur: (e) => (e.target.style.borderColor = '#e5e7eb') }), _jsxs("div", { style: buttonGroupStyle, children: [_jsx("button", { style: sourceButtonStyle(filters.source === 'all'), onClick: () => onSetSourceFilter('all'), children: "All" }), _jsx("button", { style: sourceButtonStyle(filters.source === 'client'), onClick: () => onSetSourceFilter('client'), children: "Client" }), _jsx("button", { style: sourceButtonStyle(filters.source === 'server'), onClick: () => onSetSourceFilter('server'), children: "Server" })] }), _jsx("button", { style: clearButtonStyle, onClick: onClearLogs, title: "Clear all logs", children: "Clear" })] }), _jsx("div", { style: rowStyle, children: LEVELS.map(({ level, label }) => (_jsxs("button", { style: levelButtonStyle(level, filters.levels.has(level)), onClick: () => onSetLevelFilter(level, !filters.levels.has(level)), title: `Toggle ${level} logs`, children: [_jsx("span", { children: label }), _jsxs("span", { style: countBadgeStyle, children: ["(", levelCounts[level], ")"] })] }, level))) })] }));
95
+ });
96
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../src/dev/filters.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { type DevLogEntry, type LogFilters } from '../store';
2
+ import type { LogLevel } from 'vestig';
3
+ /**
4
+ * Hook to subscribe to log store
5
+ */
6
+ export declare function useLogStore(): {
7
+ logs: DevLogEntry[];
8
+ isOpen: boolean;
9
+ filters: LogFilters;
10
+ namespaces: string[];
11
+ levelCounts: Record<LogLevel, number>;
12
+ toggleOpen: () => void;
13
+ setOpen: (isOpen: boolean) => void;
14
+ clearLogs: () => void;
15
+ setLevelFilter: (level: LogLevel, enabled: boolean) => void;
16
+ toggleAllLevels: (enabled: boolean) => void;
17
+ setNamespaceFilter: (namespace: string, enabled: boolean) => void;
18
+ setSearch: (search: string) => void;
19
+ setSourceFilter: (source: "all" | "client" | "server") => void;
20
+ };
21
+ /**
22
+ * SSE connection state
23
+ */
24
+ type ConnectionState = 'connecting' | 'connected' | 'disconnected' | 'error';
25
+ /**
26
+ * Hook to connect to SSE log stream
27
+ */
28
+ export declare function useServerLogs(options: {
29
+ endpoint?: string;
30
+ enabled?: boolean;
31
+ reconnectDelay?: number;
32
+ maxReconnectAttempts?: number;
33
+ }): {
34
+ connect: () => void;
35
+ disconnect: () => void;
36
+ isConnected: boolean;
37
+ connectionState: ConnectionState;
38
+ };
39
+ /**
40
+ * Hook to capture client-side logs
41
+ */
42
+ export declare function useClientLogCapture(options?: {
43
+ enabled?: boolean;
44
+ }): void;
45
+ /**
46
+ * Hook for keyboard shortcuts
47
+ */
48
+ export declare function useDevOverlayShortcuts(options?: {
49
+ toggleKey?: string;
50
+ enabled?: boolean;
51
+ }): void;
52
+ export {};
53
+ //# sourceMappingURL=use-logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-logs.d.ts","sourceRoot":"","sources":["../../../src/dev/hooks/use-logs.ts"],"names":[],"mappings":"AAGA,OAAO,EAAY,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAA;AACtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEtC;;GAEG;AACH,wBAAgB,WAAW;;;;;;;;;;;;;;EA6B1B;AAWD;;GAEG;AACH,KAAK,eAAe,GAAG,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,OAAO,CAAA;AAE5E;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC7B;;;;;EAuIA;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,QAwBtE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,QA0B7F"}
@@ -0,0 +1,205 @@
1
+ 'use client';
2
+ import { useCallback, useEffect, useRef, useSyncExternalStore } from 'react';
3
+ import { logStore } from '../store';
4
+ /**
5
+ * Hook to subscribe to log store
6
+ */
7
+ export function useLogStore() {
8
+ const logs = useSyncExternalStore(logStore.subscribe, () => logStore.getFilteredLogs(), () => []);
9
+ const state = useSyncExternalStore(logStore.subscribe, () => logStore.getSnapshot(), () => ({ logs: [], filters: getDefaultFilters(), isOpen: false, maxLogs: 500 }));
10
+ return {
11
+ logs,
12
+ isOpen: state.isOpen,
13
+ filters: state.filters,
14
+ namespaces: logStore.getNamespaces(),
15
+ levelCounts: logStore.getLevelCounts(),
16
+ // Actions
17
+ toggleOpen: logStore.toggleOpen,
18
+ setOpen: logStore.setOpen,
19
+ clearLogs: logStore.clearLogs,
20
+ setLevelFilter: logStore.setLevelFilter,
21
+ toggleAllLevels: logStore.toggleAllLevels,
22
+ setNamespaceFilter: logStore.setNamespaceFilter,
23
+ setSearch: logStore.setSearch,
24
+ setSourceFilter: logStore.setSourceFilter,
25
+ };
26
+ }
27
+ function getDefaultFilters() {
28
+ return {
29
+ levels: new Set(['trace', 'debug', 'info', 'warn', 'error']),
30
+ namespaces: new Set(),
31
+ search: '',
32
+ source: 'all',
33
+ };
34
+ }
35
+ /**
36
+ * Hook to connect to SSE log stream
37
+ */
38
+ export function useServerLogs(options) {
39
+ const { endpoint = '/api/vestig/logs', enabled = true, reconnectDelay = 2000, maxReconnectAttempts = 5, } = options;
40
+ const eventSourceRef = useRef(null);
41
+ const reconnectAttempts = useRef(0);
42
+ const reconnectTimeoutRef = useRef(null);
43
+ const connectionStateRef = useRef('disconnected');
44
+ const connect = useCallback(() => {
45
+ // Only connect in browser
46
+ if (typeof window === 'undefined')
47
+ return;
48
+ if (!enabled)
49
+ return;
50
+ // Clean up existing connection
51
+ if (eventSourceRef.current) {
52
+ eventSourceRef.current.close();
53
+ }
54
+ connectionStateRef.current = 'connecting';
55
+ try {
56
+ const eventSource = new EventSource(endpoint);
57
+ eventSourceRef.current = eventSource;
58
+ eventSource.onopen = () => {
59
+ connectionStateRef.current = 'connected';
60
+ reconnectAttempts.current = 0;
61
+ };
62
+ eventSource.onmessage = (event) => {
63
+ try {
64
+ const data = JSON.parse(event.data);
65
+ if (data.type === 'log') {
66
+ logStore.addLog({
67
+ timestamp: data.timestamp,
68
+ level: data.level,
69
+ message: data.message,
70
+ namespace: data.namespace,
71
+ metadata: data.metadata,
72
+ context: data.context,
73
+ error: data.error,
74
+ source: 'server',
75
+ traceId: data.context?.traceId,
76
+ spanId: data.context?.spanId,
77
+ duration: data.duration,
78
+ });
79
+ }
80
+ else if (data.type === 'batch') {
81
+ const entries = data.logs.map((log) => ({
82
+ timestamp: log.timestamp,
83
+ level: log.level,
84
+ message: log.message,
85
+ namespace: log.namespace,
86
+ metadata: log.metadata,
87
+ context: log.context,
88
+ error: log.error,
89
+ source: 'server',
90
+ traceId: log.context?.traceId,
91
+ spanId: log.context?.spanId,
92
+ duration: log.duration,
93
+ }));
94
+ logStore.addLogs(entries);
95
+ }
96
+ }
97
+ catch (error) {
98
+ console.error('[vestig-dev] Failed to parse SSE message:', error);
99
+ }
100
+ };
101
+ eventSource.onerror = () => {
102
+ connectionStateRef.current = 'error';
103
+ eventSource.close();
104
+ eventSourceRef.current = null;
105
+ // Attempt reconnection
106
+ if (reconnectAttempts.current < maxReconnectAttempts) {
107
+ reconnectAttempts.current++;
108
+ const delay = reconnectDelay * Math.pow(2, reconnectAttempts.current - 1);
109
+ reconnectTimeoutRef.current = setTimeout(() => {
110
+ connect();
111
+ }, delay);
112
+ }
113
+ else {
114
+ connectionStateRef.current = 'disconnected';
115
+ }
116
+ };
117
+ }
118
+ catch (error) {
119
+ console.error('[vestig-dev] Failed to create EventSource:', error);
120
+ connectionStateRef.current = 'error';
121
+ }
122
+ }, [endpoint, enabled, reconnectDelay, maxReconnectAttempts]);
123
+ const disconnect = useCallback(() => {
124
+ if (reconnectTimeoutRef.current) {
125
+ clearTimeout(reconnectTimeoutRef.current);
126
+ reconnectTimeoutRef.current = null;
127
+ }
128
+ if (eventSourceRef.current) {
129
+ eventSourceRef.current.close();
130
+ eventSourceRef.current = null;
131
+ }
132
+ connectionStateRef.current = 'disconnected';
133
+ reconnectAttempts.current = 0;
134
+ }, []);
135
+ useEffect(() => {
136
+ if (enabled) {
137
+ connect();
138
+ }
139
+ else {
140
+ disconnect();
141
+ }
142
+ return () => {
143
+ disconnect();
144
+ };
145
+ }, [enabled, connect, disconnect]);
146
+ return {
147
+ connect,
148
+ disconnect,
149
+ isConnected: connectionStateRef.current === 'connected',
150
+ connectionState: connectionStateRef.current,
151
+ };
152
+ }
153
+ /**
154
+ * Hook to capture client-side logs
155
+ */
156
+ export function useClientLogCapture(options = {}) {
157
+ const { enabled = true } = options;
158
+ useEffect(() => {
159
+ if (!enabled)
160
+ return;
161
+ if (typeof window === 'undefined')
162
+ return;
163
+ // Intercept client logs from VestigProvider
164
+ // This works by patching the transport's internal send
165
+ // We listen to a custom event dispatched by the transport
166
+ const handleClientLog = (event) => {
167
+ logStore.addLog({
168
+ ...event.detail,
169
+ source: 'client',
170
+ });
171
+ };
172
+ window.addEventListener('vestig:client-log', handleClientLog);
173
+ return () => {
174
+ window.removeEventListener('vestig:client-log', handleClientLog);
175
+ };
176
+ }, [enabled]);
177
+ }
178
+ /**
179
+ * Hook for keyboard shortcuts
180
+ */
181
+ export function useDevOverlayShortcuts(options = {}) {
182
+ const { toggleKey = 'l', enabled = true } = options;
183
+ useEffect(() => {
184
+ if (!enabled)
185
+ return;
186
+ if (typeof window === 'undefined')
187
+ return;
188
+ const handleKeyDown = (event) => {
189
+ // Cmd/Ctrl + L to toggle
190
+ if ((event.metaKey || event.ctrlKey) && event.key.toLowerCase() === toggleKey) {
191
+ event.preventDefault();
192
+ logStore.toggleOpen();
193
+ }
194
+ // Escape to close
195
+ if (event.key === 'Escape' && logStore.getSnapshot().isOpen) {
196
+ logStore.setOpen(false);
197
+ }
198
+ };
199
+ window.addEventListener('keydown', handleKeyDown);
200
+ return () => {
201
+ window.removeEventListener('keydown', handleKeyDown);
202
+ };
203
+ }, [toggleKey, enabled]);
204
+ }
205
+ //# sourceMappingURL=use-logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-logs.js","sourceRoot":"","sources":["../../../src/dev/hooks/use-logs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @vestig/next/dev - Development tools for vestig logging
3
+ *
4
+ * This module provides real-time log viewing and debugging tools
5
+ * for development environments.
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * // app/layout.tsx
10
+ * import { VestigDevOverlay } from '@vestig/next/dev'
11
+ *
12
+ * export default function RootLayout({ children }) {
13
+ * return (
14
+ * <html>
15
+ * <body>
16
+ * {children}
17
+ * {process.env.NODE_ENV === 'development' && <VestigDevOverlay />}
18
+ * </body>
19
+ * </html>
20
+ * )
21
+ * }
22
+ * ```
23
+ *
24
+ * @packageDocumentation
25
+ */
26
+ export { VestigDevOverlay, type VestigDevOverlayProps } from './overlay';
27
+ export { logStore, type DevLogEntry, type LogFilters, type LogStore } from './store';
28
+ export { useLogStore, useServerLogs, useClientLogCapture, useDevOverlayShortcuts, } from './hooks/use-logs';
29
+ export { LogEntry } from './log-entry';
30
+ export { LogViewer } from './log-viewer';
31
+ export { Filters } from './filters';
32
+ export { MetricsPanel } from './metrics-panel';
33
+ export { MetricsCard } from './metrics-card';
34
+ export { MetricsHistogram } from './metrics-histogram';
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dev/index.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAGxE,OAAO,EAAE,QAAQ,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGpF,OAAO,EACN,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,sBAAsB,GACtB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGnC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,41 @@
1
+ 'use client';
2
+ /**
3
+ * @vestig/next/dev - Development tools for vestig logging
4
+ *
5
+ * This module provides real-time log viewing and debugging tools
6
+ * for development environments.
7
+ *
8
+ * @example
9
+ * ```tsx
10
+ * // app/layout.tsx
11
+ * import { VestigDevOverlay } from '@vestig/next/dev'
12
+ *
13
+ * export default function RootLayout({ children }) {
14
+ * return (
15
+ * <html>
16
+ * <body>
17
+ * {children}
18
+ * {process.env.NODE_ENV === 'development' && <VestigDevOverlay />}
19
+ * </body>
20
+ * </html>
21
+ * )
22
+ * }
23
+ * ```
24
+ *
25
+ * @packageDocumentation
26
+ */
27
+ // Main overlay component
28
+ export { VestigDevOverlay } from './overlay';
29
+ // Store for programmatic access
30
+ export { logStore } from './store';
31
+ // Hooks for custom integrations
32
+ export { useLogStore, useServerLogs, useClientLogCapture, useDevOverlayShortcuts, } from './hooks/use-logs';
33
+ // Individual components for custom layouts
34
+ export { LogEntry } from './log-entry';
35
+ export { LogViewer } from './log-viewer';
36
+ export { Filters } from './filters';
37
+ // Metrics components for Dev Overlay
38
+ export { MetricsPanel } from './metrics-panel';
39
+ export { MetricsCard } from './metrics-card';
40
+ export { MetricsHistogram } from './metrics-histogram';
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dev/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,yBAAyB;AACzB,OAAO,EAAE,gBAAgB,EAA8B,MAAM,WAAW,CAAA;AAExE,gCAAgC;AAChC,OAAO,EAAE,QAAQ,EAAoD,MAAM,SAAS,CAAA;AAEpF,gCAAgC;AAChC,OAAO,EACN,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,sBAAsB,GACtB,MAAM,kBAAkB,CAAA;AAEzB,2CAA2C;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,qCAAqC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA"}
@@ -0,0 +1,12 @@
1
+ import type { DevLogEntry } from './store';
2
+ interface LogEntryProps {
3
+ log: DevLogEntry;
4
+ isExpanded?: boolean;
5
+ onToggleExpand?: () => void;
6
+ }
7
+ /**
8
+ * Single log entry component
9
+ */
10
+ export declare const LogEntry: import("react").NamedExoticComponent<LogEntryProps>;
11
+ export {};
12
+ //# sourceMappingURL=log-entry.d.ts.map