@vestig/next 0.3.1

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 (86) hide show
  1. package/README.md +290 -0
  2. package/dist/client/hooks.d.ts +95 -0
  3. package/dist/client/hooks.d.ts.map +1 -0
  4. package/dist/client/hooks.js +128 -0
  5. package/dist/client/hooks.js.map +1 -0
  6. package/dist/client/index.d.ts +4 -0
  7. package/dist/client/index.d.ts.map +1 -0
  8. package/dist/client/index.js +9 -0
  9. package/dist/client/index.js.map +1 -0
  10. package/dist/client/provider.d.ts +66 -0
  11. package/dist/client/provider.d.ts.map +1 -0
  12. package/dist/client/provider.js +126 -0
  13. package/dist/client/provider.js.map +1 -0
  14. package/dist/client/transport.d.ts +59 -0
  15. package/dist/client/transport.d.ts.map +1 -0
  16. package/dist/client/transport.js +148 -0
  17. package/dist/client/transport.js.map +1 -0
  18. package/dist/client.d.ts +43 -0
  19. package/dist/client.d.ts.map +1 -0
  20. package/dist/client.js +47 -0
  21. package/dist/client.js.map +1 -0
  22. package/dist/config/defaults.d.ts +10 -0
  23. package/dist/config/defaults.d.ts.map +1 -0
  24. package/dist/config/defaults.js +72 -0
  25. package/dist/config/defaults.js.map +1 -0
  26. package/dist/config/index.d.ts +116 -0
  27. package/dist/config/index.d.ts.map +1 -0
  28. package/dist/config/index.js +27 -0
  29. package/dist/config/index.js.map +1 -0
  30. package/dist/config/loader.d.ts +21 -0
  31. package/dist/config/loader.d.ts.map +1 -0
  32. package/dist/config/loader.js +31 -0
  33. package/dist/config/loader.js.map +1 -0
  34. package/dist/index.d.ts +42 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +43 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/route/handler.d.ts +56 -0
  39. package/dist/route/handler.d.ts.map +1 -0
  40. package/dist/route/handler.js +250 -0
  41. package/dist/route/handler.js.map +1 -0
  42. package/dist/route/index.d.ts +2 -0
  43. package/dist/route/index.d.ts.map +1 -0
  44. package/dist/route/index.js +3 -0
  45. package/dist/route/index.js.map +1 -0
  46. package/dist/server/index.d.ts +5 -0
  47. package/dist/server/index.d.ts.map +1 -0
  48. package/dist/server/index.js +10 -0
  49. package/dist/server/index.js.map +1 -0
  50. package/dist/server/middleware.d.ts +108 -0
  51. package/dist/server/middleware.d.ts.map +1 -0
  52. package/dist/server/middleware.js +182 -0
  53. package/dist/server/middleware.js.map +1 -0
  54. package/dist/server/route-handler.d.ts +93 -0
  55. package/dist/server/route-handler.d.ts.map +1 -0
  56. package/dist/server/route-handler.js +160 -0
  57. package/dist/server/route-handler.js.map +1 -0
  58. package/dist/server/server-action.d.ts +74 -0
  59. package/dist/server/server-action.d.ts.map +1 -0
  60. package/dist/server/server-action.js +132 -0
  61. package/dist/server/server-action.js.map +1 -0
  62. package/dist/server/server-component.d.ts +87 -0
  63. package/dist/server/server-component.d.ts.map +1 -0
  64. package/dist/server/server-component.js +122 -0
  65. package/dist/server/server-component.js.map +1 -0
  66. package/dist/types.d.ts +80 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +5 -0
  69. package/dist/types.js.map +1 -0
  70. package/dist/utils/headers.d.ts +38 -0
  71. package/dist/utils/headers.d.ts.map +1 -0
  72. package/dist/utils/headers.js +42 -0
  73. package/dist/utils/headers.js.map +1 -0
  74. package/dist/utils/index.d.ts +4 -0
  75. package/dist/utils/index.d.ts.map +1 -0
  76. package/dist/utils/index.js +4 -0
  77. package/dist/utils/index.js.map +1 -0
  78. package/dist/utils/metadata.d.ts +41 -0
  79. package/dist/utils/metadata.d.ts.map +1 -0
  80. package/dist/utils/metadata.js +46 -0
  81. package/dist/utils/metadata.js.map +1 -0
  82. package/dist/utils/timing.d.ts +31 -0
  83. package/dist/utils/timing.d.ts.map +1 -0
  84. package/dist/utils/timing.js +46 -0
  85. package/dist/utils/timing.js.map +1 -0
  86. package/package.json +88 -0
@@ -0,0 +1,126 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createContext, useContext, useEffect, useMemo, useRef, useState, } from 'react';
4
+ import { createLogger } from 'vestig';
5
+ import { ClientHTTPTransport } from './transport';
6
+ const VestigContext = createContext(null);
7
+ /**
8
+ * Generate a client-side request ID
9
+ */
10
+ function generateClientRequestId() {
11
+ return `client-${crypto.randomUUID()}`;
12
+ }
13
+ /**
14
+ * Provider component for client-side vestig logging
15
+ *
16
+ * Provides:
17
+ * - Automatic log batching and sending to server
18
+ * - Request correlation with server
19
+ * - React context for accessing logger
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * // app/layout.tsx
24
+ * import { VestigProvider } from '@vestig/next/client'
25
+ * import { getRequestContext } from '@vestig/next'
26
+ *
27
+ * export default async function RootLayout({ children }) {
28
+ * // Get server context for correlation
29
+ * const ctx = await getRequestContext()
30
+ *
31
+ * return (
32
+ * <html>
33
+ * <body>
34
+ * <VestigProvider initialContext={ctx}>
35
+ * {children}
36
+ * </VestigProvider>
37
+ * </body>
38
+ * </html>
39
+ * )
40
+ * }
41
+ * ```
42
+ */
43
+ export function VestigProvider({ children, initialContext, endpoint = '/api/vestig', namespace = 'client', context: staticContext, }) {
44
+ const [isConnected, setIsConnected] = useState(false);
45
+ const transportRef = useRef(null);
46
+ const loggerRef = useRef(null);
47
+ // Create transport once
48
+ const transport = useMemo(() => {
49
+ if (transportRef.current)
50
+ return transportRef.current;
51
+ transportRef.current = new ClientHTTPTransport({
52
+ name: 'vestig-client',
53
+ url: endpoint,
54
+ batchSize: 20,
55
+ flushInterval: 3000,
56
+ onFlushSuccess: () => setIsConnected(true),
57
+ onFlushError: () => setIsConnected(false),
58
+ });
59
+ return transportRef.current;
60
+ }, [endpoint]);
61
+ // Create correlation context
62
+ const context = useMemo(() => ({
63
+ requestId: initialContext?.requestId ?? generateClientRequestId(),
64
+ traceId: initialContext?.traceId,
65
+ spanId: initialContext?.spanId,
66
+ ...initialContext,
67
+ }), [initialContext]);
68
+ // Create logger with transport
69
+ const logger = useMemo(() => {
70
+ if (loggerRef.current)
71
+ return loggerRef.current;
72
+ const log = createLogger({
73
+ level: 'trace', // Allow all levels, filtering happens server-side
74
+ sanitize: 'default',
75
+ structured: false, // Pretty console for browser devtools
76
+ namespace,
77
+ context: {
78
+ ...staticContext,
79
+ ...context,
80
+ },
81
+ });
82
+ log.addTransport(transport);
83
+ loggerRef.current = log;
84
+ return log;
85
+ }, [transport, namespace, staticContext, context]);
86
+ // Initialize transport on mount
87
+ useEffect(() => {
88
+ transport.init().then(() => setIsConnected(true));
89
+ // Flush on page unload
90
+ const handleUnload = () => {
91
+ transport.flush();
92
+ };
93
+ // Flush on visibility change (tab switch)
94
+ const handleVisibilityChange = () => {
95
+ if (document.visibilityState === 'hidden') {
96
+ transport.flush();
97
+ }
98
+ };
99
+ window.addEventListener('beforeunload', handleUnload);
100
+ document.addEventListener('visibilitychange', handleVisibilityChange);
101
+ return () => {
102
+ window.removeEventListener('beforeunload', handleUnload);
103
+ document.removeEventListener('visibilitychange', handleVisibilityChange);
104
+ transport.destroy();
105
+ };
106
+ }, [transport]);
107
+ const value = useMemo(() => ({
108
+ logger,
109
+ context,
110
+ isConnected,
111
+ }), [logger, context, isConnected]);
112
+ return _jsx(VestigContext.Provider, { value: value, children: children });
113
+ }
114
+ /**
115
+ * Get the full vestig context
116
+ *
117
+ * @throws Error if used outside VestigProvider
118
+ */
119
+ export function useVestigContext() {
120
+ const context = useContext(VestigContext);
121
+ if (!context) {
122
+ throw new Error('useVestigContext must be used within VestigProvider');
123
+ }
124
+ return context;
125
+ }
126
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/client/provider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { LogEntry, Transport, TransportConfig } from 'vestig';
2
+ /**
3
+ * Configuration for ClientHTTPTransport
4
+ */
5
+ export interface ClientHTTPTransportConfig extends TransportConfig {
6
+ /** Server endpoint URL (default: '/api/vestig') */
7
+ url: string;
8
+ /** Batch size before auto-flush (default: 20) */
9
+ batchSize?: number;
10
+ /** Flush interval in ms (default: 3000) */
11
+ flushInterval?: number;
12
+ /** Max retry attempts (default: 3) */
13
+ maxRetries?: number;
14
+ /** Retry delay in ms (default: 1000) */
15
+ retryDelay?: number;
16
+ /** Callback on successful flush */
17
+ onFlushSuccess?: () => void;
18
+ /** Callback on flush error */
19
+ onFlushError?: (error: Error) => void;
20
+ /** Callback when logs are dropped */
21
+ onDrop?: (count: number) => void;
22
+ }
23
+ /**
24
+ * HTTP transport for client-side log batching
25
+ *
26
+ * Features:
27
+ * - Automatic batching with configurable size and interval
28
+ * - Retry with exponential backoff
29
+ * - Uses keepalive for beforeunload reliability
30
+ * - Automatic page metadata enrichment
31
+ */
32
+ export declare class ClientHTTPTransport implements Transport {
33
+ readonly name: string;
34
+ readonly config: TransportConfig;
35
+ private url;
36
+ private batchSize;
37
+ private flushInterval;
38
+ private maxRetries;
39
+ private retryDelay;
40
+ private onFlushSuccess?;
41
+ private onFlushError?;
42
+ private onDrop?;
43
+ private buffer;
44
+ private flushTimer;
45
+ private isFlushing;
46
+ private isDestroyed;
47
+ private maxBufferSize;
48
+ constructor(config: ClientHTTPTransportConfig);
49
+ init(): Promise<void>;
50
+ log(entry: LogEntry): void;
51
+ flush(): Promise<void>;
52
+ private sendWithRetry;
53
+ destroy(): Promise<void>;
54
+ }
55
+ /**
56
+ * Create a client HTTP transport with default configuration
57
+ */
58
+ export declare function createClientTransport(options?: Partial<ClientHTTPTransportConfig>): ClientHTTPTransport;
59
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AAElE;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IACjE,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAA;IACX,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mCAAmC;IACnC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,8BAA8B;IAC9B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IACrC,qCAAqC;IACrC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAChC;AAED;;;;;;;;GAQG;AACH,qBAAa,mBAAoB,YAAW,SAAS;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;IAEhC,OAAO,CAAC,GAAG,CAAQ;IACnB,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,cAAc,CAAC,CAAY;IACnC,OAAO,CAAC,YAAY,CAAC,CAAwB;IAC7C,OAAO,CAAC,MAAM,CAAC,CAAyB;IAExC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,aAAa,CAAM;gBAEf,MAAM,EAAE,yBAAyB;IAavC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,GAAG,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAiCpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA6Bd,aAAa;IA+BrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAc9B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACpC,OAAO,GAAE,OAAO,CAAC,yBAAyB,CAAM,GAC9C,mBAAmB,CAMrB"}
@@ -0,0 +1,148 @@
1
+ 'use client';
2
+ /**
3
+ * HTTP transport for client-side log batching
4
+ *
5
+ * Features:
6
+ * - Automatic batching with configurable size and interval
7
+ * - Retry with exponential backoff
8
+ * - Uses keepalive for beforeunload reliability
9
+ * - Automatic page metadata enrichment
10
+ */
11
+ export class ClientHTTPTransport {
12
+ name;
13
+ config;
14
+ url;
15
+ batchSize;
16
+ flushInterval;
17
+ maxRetries;
18
+ retryDelay;
19
+ onFlushSuccess;
20
+ onFlushError;
21
+ onDrop;
22
+ buffer = [];
23
+ flushTimer = null;
24
+ isFlushing = false;
25
+ isDestroyed = false;
26
+ maxBufferSize = 500;
27
+ constructor(config) {
28
+ this.name = config.name;
29
+ this.config = { name: config.name, enabled: config.enabled ?? true };
30
+ this.url = config.url;
31
+ this.batchSize = config.batchSize ?? 20;
32
+ this.flushInterval = config.flushInterval ?? 3000;
33
+ this.maxRetries = config.maxRetries ?? 3;
34
+ this.retryDelay = config.retryDelay ?? 1000;
35
+ this.onFlushSuccess = config.onFlushSuccess;
36
+ this.onFlushError = config.onFlushError;
37
+ this.onDrop = config.onDrop;
38
+ }
39
+ async init() {
40
+ // Start flush timer
41
+ this.flushTimer = setInterval(() => {
42
+ this.flush();
43
+ }, this.flushInterval);
44
+ }
45
+ log(entry) {
46
+ if (this.isDestroyed)
47
+ return;
48
+ // Enrich with client metadata
49
+ const enrichedEntry = {
50
+ ...entry,
51
+ metadata: {
52
+ ...entry.metadata,
53
+ _client: {
54
+ url: typeof window !== 'undefined' ? window.location.href : undefined,
55
+ pathname: typeof window !== 'undefined' ? window.location.pathname : undefined,
56
+ userAgent: typeof navigator !== 'undefined' ? navigator.userAgent.slice(0, 200) : undefined,
57
+ },
58
+ },
59
+ };
60
+ // Check buffer size
61
+ if (this.buffer.length >= this.maxBufferSize) {
62
+ // Drop oldest entries
63
+ const dropCount = Math.floor(this.maxBufferSize / 4);
64
+ this.buffer.splice(0, dropCount);
65
+ this.onDrop?.(dropCount);
66
+ }
67
+ this.buffer.push(enrichedEntry);
68
+ // Auto-flush if batch size reached
69
+ if (this.buffer.length >= this.batchSize) {
70
+ this.flush();
71
+ }
72
+ }
73
+ async flush() {
74
+ if (this.isFlushing || this.buffer.length === 0 || this.isDestroyed) {
75
+ return;
76
+ }
77
+ this.isFlushing = true;
78
+ const entries = [...this.buffer];
79
+ this.buffer = [];
80
+ try {
81
+ await this.sendWithRetry(entries);
82
+ this.onFlushSuccess?.();
83
+ }
84
+ catch (error) {
85
+ // Re-add failed entries to buffer (at the front)
86
+ this.buffer.unshift(...entries);
87
+ // Trim if buffer is too large
88
+ if (this.buffer.length > this.maxBufferSize) {
89
+ const excess = this.buffer.length - this.maxBufferSize;
90
+ this.buffer.splice(this.maxBufferSize);
91
+ this.onDrop?.(excess);
92
+ }
93
+ this.onFlushError?.(error instanceof Error ? error : new Error(String(error)));
94
+ }
95
+ finally {
96
+ this.isFlushing = false;
97
+ }
98
+ }
99
+ async sendWithRetry(entries) {
100
+ let lastError = null;
101
+ for (let attempt = 0; attempt < this.maxRetries; attempt++) {
102
+ try {
103
+ const response = await fetch(this.url, {
104
+ method: 'POST',
105
+ headers: { 'Content-Type': 'application/json' },
106
+ body: JSON.stringify({ entries }),
107
+ keepalive: true, // Important for beforeunload
108
+ });
109
+ if (!response.ok) {
110
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
111
+ }
112
+ return;
113
+ }
114
+ catch (error) {
115
+ lastError = error instanceof Error ? error : new Error(String(error));
116
+ // Don't retry on last attempt
117
+ if (attempt < this.maxRetries - 1) {
118
+ // Exponential backoff
119
+ await new Promise((r) => setTimeout(r, this.retryDelay * 2 ** attempt));
120
+ }
121
+ }
122
+ }
123
+ throw lastError;
124
+ }
125
+ async destroy() {
126
+ this.isDestroyed = true;
127
+ if (this.flushTimer) {
128
+ clearInterval(this.flushTimer);
129
+ this.flushTimer = null;
130
+ }
131
+ // Final flush attempt
132
+ if (this.buffer.length > 0) {
133
+ this.isFlushing = false; // Reset to allow final flush
134
+ await this.flush();
135
+ }
136
+ }
137
+ }
138
+ /**
139
+ * Create a client HTTP transport with default configuration
140
+ */
141
+ export function createClientTransport(options = {}) {
142
+ return new ClientHTTPTransport({
143
+ name: 'vestig-client',
144
+ url: '/api/vestig',
145
+ ...options,
146
+ });
147
+ }
148
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @vestig/next/client - Client-side logging for Next.js
3
+ *
4
+ * @example
5
+ * ```typescript
6
+ * // app/layout.tsx
7
+ * import { VestigProvider } from '@vestig/next/client'
8
+ *
9
+ * export default function RootLayout({ children }) {
10
+ * return (
11
+ * <html>
12
+ * <body>
13
+ * <VestigProvider>{children}</VestigProvider>
14
+ * </body>
15
+ * </html>
16
+ * )
17
+ * }
18
+ * ```
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * // components/MyComponent.tsx
23
+ * 'use client'
24
+ *
25
+ * import { useLogger } from '@vestig/next/client'
26
+ *
27
+ * export function MyComponent() {
28
+ * const log = useLogger('my-component')
29
+ *
30
+ * const handleClick = () => {
31
+ * log.info('Button clicked')
32
+ * }
33
+ *
34
+ * return <button onClick={handleClick}>Click me</button>
35
+ * }
36
+ * ```
37
+ *
38
+ * @packageDocumentation
39
+ */
40
+ export { VestigProvider, useVestigContext, type VestigProviderProps } from './client/provider';
41
+ export { useLogger, useCorrelationContext, useVestigConnection, useComponentLogger, useRenderLogger, } from './client/hooks';
42
+ export { ClientHTTPTransport, createClientTransport, type ClientHTTPTransportConfig, } from './client/transport';
43
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAGH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAG9F,OAAO,EACN,SAAS,EACT,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,GACf,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EACN,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,yBAAyB,GAC9B,MAAM,oBAAoB,CAAA"}
package/dist/client.js ADDED
@@ -0,0 +1,47 @@
1
+ 'use client';
2
+ /**
3
+ * @vestig/next/client - Client-side logging for Next.js
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * // app/layout.tsx
8
+ * import { VestigProvider } from '@vestig/next/client'
9
+ *
10
+ * export default function RootLayout({ children }) {
11
+ * return (
12
+ * <html>
13
+ * <body>
14
+ * <VestigProvider>{children}</VestigProvider>
15
+ * </body>
16
+ * </html>
17
+ * )
18
+ * }
19
+ * ```
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * // components/MyComponent.tsx
24
+ * 'use client'
25
+ *
26
+ * import { useLogger } from '@vestig/next/client'
27
+ *
28
+ * export function MyComponent() {
29
+ * const log = useLogger('my-component')
30
+ *
31
+ * const handleClick = () => {
32
+ * log.info('Button clicked')
33
+ * }
34
+ *
35
+ * return <button onClick={handleClick}>Click me</button>
36
+ * }
37
+ * ```
38
+ *
39
+ * @packageDocumentation
40
+ */
41
+ // Provider
42
+ export { VestigProvider, useVestigContext } from './client/provider';
43
+ // Hooks
44
+ export { useLogger, useCorrelationContext, useVestigConnection, useComponentLogger, useRenderLogger, } from './client/hooks';
45
+ // Transport (for advanced use cases)
46
+ export { ClientHTTPTransport, createClientTransport, } from './client/transport';
47
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,WAAW;AACX,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAA4B,MAAM,mBAAmB,CAAA;AAE9F,QAAQ;AACR,OAAO,EACN,SAAS,EACT,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,GACf,MAAM,gBAAgB,CAAA;AAEvB,qCAAqC;AACrC,OAAO,EACN,mBAAmB,EACnB,qBAAqB,GAErB,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,10 @@
1
+ import type { VestigNextConfig } from './index';
2
+ /**
3
+ * Get default configuration values
4
+ */
5
+ export declare function getDefaultConfig(): VestigNextConfig;
6
+ /**
7
+ * Deep merge two objects
8
+ */
9
+ export declare function deepMerge<T>(target: T, source: Partial<T>): T;
10
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAS/C;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,gBAAgB,CAoCnD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CA2B7D"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Check if running in production environment
3
+ */
4
+ function isProduction() {
5
+ return process.env.NODE_ENV === 'production';
6
+ }
7
+ /**
8
+ * Get default configuration values
9
+ */
10
+ export function getDefaultConfig() {
11
+ const isProd = isProduction();
12
+ return {
13
+ level: isProd ? 'warn' : 'info',
14
+ enabled: true,
15
+ sanitize: 'default',
16
+ next: {
17
+ endpoint: '/api/vestig',
18
+ middleware: {
19
+ skipPaths: ['/_next', '/favicon.ico', '/api/vestig'],
20
+ requestIdHeader: 'x-request-id',
21
+ timing: true,
22
+ requestLogLevel: 'info',
23
+ responseLogLevel: 'info',
24
+ },
25
+ server: {
26
+ namespace: 'server',
27
+ structured: isProd,
28
+ context: {},
29
+ },
30
+ client: {
31
+ namespace: 'client',
32
+ batchSize: 20,
33
+ flushInterval: 3000,
34
+ includePageInfo: true,
35
+ maxRetries: 3,
36
+ retryDelay: 1000,
37
+ },
38
+ devTools: {
39
+ enabled: !isProd,
40
+ maxLogs: 500,
41
+ },
42
+ transports: [],
43
+ },
44
+ };
45
+ }
46
+ /**
47
+ * Deep merge two objects
48
+ */
49
+ export function deepMerge(target, source) {
50
+ const result = { ...target };
51
+ for (const key in source) {
52
+ const sourceValue = source[key];
53
+ const targetValue = target[key];
54
+ if (sourceValue !== undefined &&
55
+ typeof sourceValue === 'object' &&
56
+ sourceValue !== null &&
57
+ !Array.isArray(sourceValue) &&
58
+ typeof targetValue === 'object' &&
59
+ targetValue !== null &&
60
+ !Array.isArray(targetValue)) {
61
+ // Recursively merge objects
62
+ ;
63
+ result[key] = deepMerge(targetValue, sourceValue);
64
+ }
65
+ else if (sourceValue !== undefined) {
66
+ ;
67
+ result[key] = sourceValue;
68
+ }
69
+ }
70
+ return result;
71
+ }
72
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,SAAS,YAAY;IACpB,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAA;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC/B,MAAM,MAAM,GAAG,YAAY,EAAE,CAAA;IAE7B,OAAO;QACN,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QAC/B,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,SAAS;QACnB,IAAI,EAAE;YACL,QAAQ,EAAE,aAAa;YACvB,UAAU,EAAE;gBACX,SAAS,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC;gBACpD,eAAe,EAAE,cAAc;gBAC/B,MAAM,EAAE,IAAI;gBACZ,eAAe,EAAE,MAAM;gBACvB,gBAAgB,EAAE,MAAM;aACxB;YACD,MAAM,EAAE;gBACP,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE,MAAM;gBAClB,OAAO,EAAE,EAAE;aACX;YACD,MAAM,EAAE;gBACP,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,EAAE;gBACb,aAAa,EAAE,IAAI;gBACnB,eAAe,EAAE,IAAI;gBACrB,UAAU,EAAE,CAAC;gBACb,UAAU,EAAE,IAAI;aAChB;YACD,QAAQ,EAAE;gBACT,OAAO,EAAE,CAAC,MAAM;gBAChB,OAAO,EAAE,GAAG;aACZ;YACD,UAAU,EAAE,EAAE;SACd;KACD,CAAA;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAI,MAAS,EAAE,MAAkB;IACzD,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAAO,CAAA;IAEjC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,MAAM,CAAC,GAAc,CAAC,CAAA;QAC1C,MAAM,WAAW,GAAG,MAAM,CAAC,GAAc,CAAC,CAAA;QAE1C,IACC,WAAW,KAAK,SAAS;YACzB,OAAO,WAAW,KAAK,QAAQ;YAC/B,WAAW,KAAK,IAAI;YACpB,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;YAC3B,OAAO,WAAW,KAAK,QAAQ;YAC/B,WAAW,KAAK,IAAI;YACpB,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAC1B,CAAC;YACF,4BAA4B;YAC5B,CAAC;YAAC,MAAkC,CAAC,GAAG,CAAC,GAAG,SAAS,CACpD,WAAsC,EACtC,WAAsC,CACtC,CAAA;QACF,CAAC;aAAM,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YACtC,CAAC;YAAC,MAAkC,CAAC,GAAG,CAAC,GAAG,WAAW,CAAA;QACxD,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAA;AACd,CAAC"}
@@ -0,0 +1,116 @@
1
+ import type { LogLevel, SanitizeConfig, SanitizePreset, Transport } from 'vestig';
2
+ /**
3
+ * Middleware configuration options
4
+ */
5
+ export interface VestigNextMiddlewareConfig {
6
+ /** Paths to skip logging (default: ['/_next', '/favicon.ico']) */
7
+ skipPaths?: string[];
8
+ /** Header to extract request ID from (default: 'x-request-id') */
9
+ requestIdHeader?: string;
10
+ /** Include request timing (default: true) */
11
+ timing?: boolean;
12
+ /** Log level for incoming requests (default: 'info') */
13
+ requestLogLevel?: LogLevel;
14
+ /** Log level for outgoing responses (default: 'info') */
15
+ responseLogLevel?: LogLevel;
16
+ /** Custom metadata extractor */
17
+ extractMetadata?: (request: Request) => Record<string, unknown>;
18
+ }
19
+ /**
20
+ * Server-side configuration
21
+ */
22
+ export interface VestigNextServerConfig {
23
+ /** Logger namespace (default: 'server') */
24
+ namespace?: string;
25
+ /** Use structured JSON output (default: true in production) */
26
+ structured?: boolean;
27
+ /** Static context added to all server logs */
28
+ context?: Record<string, unknown>;
29
+ }
30
+ /**
31
+ * Client-side configuration
32
+ */
33
+ export interface VestigNextClientConfig {
34
+ /** Logger namespace (default: 'client') */
35
+ namespace?: string;
36
+ /** Batch size before auto-flush (default: 20) */
37
+ batchSize?: number;
38
+ /** Flush interval in ms (default: 3000) */
39
+ flushInterval?: number;
40
+ /** Include page/component info (default: true) */
41
+ includePageInfo?: boolean;
42
+ /** Max retry attempts (default: 3) */
43
+ maxRetries?: number;
44
+ /** Retry delay in ms (default: 1000) */
45
+ retryDelay?: number;
46
+ }
47
+ /**
48
+ * Development tools configuration
49
+ */
50
+ export interface VestigNextDevToolsConfig {
51
+ /** Enable dev tools (default: development only) */
52
+ enabled?: boolean;
53
+ /** Max logs to keep in memory (default: 500) */
54
+ maxLogs?: number;
55
+ }
56
+ /**
57
+ * Transport definition for config
58
+ */
59
+ export interface TransportDefinition {
60
+ type: 'http' | 'datadog' | 'file' | 'custom';
61
+ [key: string]: unknown;
62
+ }
63
+ /**
64
+ * Next.js specific configuration
65
+ */
66
+ export interface VestigNextOptions {
67
+ /** API endpoint for client logs (default: '/api/vestig') */
68
+ endpoint?: string;
69
+ /** Middleware configuration */
70
+ middleware?: VestigNextMiddlewareConfig;
71
+ /** Server-side configuration */
72
+ server?: VestigNextServerConfig;
73
+ /** Client-side configuration */
74
+ client?: VestigNextClientConfig;
75
+ /** Development tools */
76
+ devTools?: VestigNextDevToolsConfig;
77
+ /** Additional transports */
78
+ transports?: (TransportDefinition | Transport | false | null | undefined)[];
79
+ }
80
+ /**
81
+ * Complete Vestig configuration for Next.js
82
+ */
83
+ export interface VestigNextConfig {
84
+ /** Minimum log level to output */
85
+ level?: LogLevel;
86
+ /** Enable/disable logging */
87
+ enabled?: boolean;
88
+ /** Sanitization configuration: boolean, preset name, or full config */
89
+ sanitize?: boolean | SanitizePreset | SanitizeConfig;
90
+ /** Next.js specific options */
91
+ next?: VestigNextOptions;
92
+ }
93
+ /**
94
+ * Define vestig configuration with type safety
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * // vestig.config.ts
99
+ * import { defineConfig } from '@vestig/next/config'
100
+ *
101
+ * export default defineConfig({
102
+ * level: 'debug',
103
+ * sanitize: 'gdpr',
104
+ * next: {
105
+ * endpoint: '/api/vestig',
106
+ * middleware: {
107
+ * timing: true,
108
+ * },
109
+ * },
110
+ * })
111
+ * ```
112
+ */
113
+ export declare function defineConfig(config: VestigNextConfig): VestigNextConfig;
114
+ export { loadConfig, getConfig } from './loader';
115
+ export { getDefaultConfig } from './defaults';
116
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAEjF;;GAEG;AACH,MAAM,WAAW,0BAA0B;IAC1C,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,kEAAkE;IAClE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,wDAAwD;IACxD,eAAe,CAAC,EAAE,QAAQ,CAAA;IAC1B,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,QAAQ,CAAA;IAC3B,gCAAgC;IAChC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/D;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,kDAAkD;IAClD,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACxC,mDAAmD;IACnD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAA;IAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,+BAA+B;IAC/B,UAAU,CAAC,EAAE,0BAA0B,CAAA;IACvC,gCAAgC;IAChC,MAAM,CAAC,EAAE,sBAAsB,CAAA;IAC/B,gCAAgC;IAChC,MAAM,CAAC,EAAE,sBAAsB,CAAA;IAC/B,wBAAwB;IACxB,QAAQ,CAAC,EAAE,wBAAwB,CAAA;IACnC,4BAA4B;IAC5B,UAAU,CAAC,EAAE,CAAC,mBAAmB,GAAG,SAAS,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,CAAA;CAC3E;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,kCAAkC;IAClC,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,OAAO,GAAG,cAAc,GAAG,cAAc,CAAA;IACpD,+BAA+B;IAC/B,IAAI,CAAC,EAAE,iBAAiB,CAAA;CACxB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAEvE;AAGD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA"}