@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.
- package/README.md +290 -0
- package/dist/client/hooks.d.ts +95 -0
- package/dist/client/hooks.d.ts.map +1 -0
- package/dist/client/hooks.js +128 -0
- package/dist/client/hooks.js.map +1 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +9 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/provider.d.ts +66 -0
- package/dist/client/provider.d.ts.map +1 -0
- package/dist/client/provider.js +126 -0
- package/dist/client/provider.js.map +1 -0
- package/dist/client/transport.d.ts +59 -0
- package/dist/client/transport.d.ts.map +1 -0
- package/dist/client/transport.js +148 -0
- package/dist/client/transport.js.map +1 -0
- package/dist/client.d.ts +43 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +47 -0
- package/dist/client.js.map +1 -0
- package/dist/config/defaults.d.ts +10 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +72 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +116 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +27 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +21 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +31 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/route/handler.d.ts +56 -0
- package/dist/route/handler.d.ts.map +1 -0
- package/dist/route/handler.js +250 -0
- package/dist/route/handler.js.map +1 -0
- package/dist/route/index.d.ts +2 -0
- package/dist/route/index.d.ts.map +1 -0
- package/dist/route/index.js +3 -0
- package/dist/route/index.js.map +1 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +10 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware.d.ts +108 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/middleware.js +182 -0
- package/dist/server/middleware.js.map +1 -0
- package/dist/server/route-handler.d.ts +93 -0
- package/dist/server/route-handler.d.ts.map +1 -0
- package/dist/server/route-handler.js +160 -0
- package/dist/server/route-handler.js.map +1 -0
- package/dist/server/server-action.d.ts +74 -0
- package/dist/server/server-action.d.ts.map +1 -0
- package/dist/server/server-action.js +132 -0
- package/dist/server/server-action.js.map +1 -0
- package/dist/server/server-component.d.ts +87 -0
- package/dist/server/server-component.d.ts.map +1 -0
- package/dist/server/server-component.js +122 -0
- package/dist/server/server-component.js.map +1 -0
- package/dist/types.d.ts +80 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/headers.d.ts +38 -0
- package/dist/utils/headers.d.ts.map +1 -0
- package/dist/utils/headers.js +42 -0
- package/dist/utils/headers.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/metadata.d.ts +41 -0
- package/dist/utils/metadata.d.ts.map +1 -0
- package/dist/utils/metadata.js +46 -0
- package/dist/utils/metadata.js.map +1 -0
- package/dist/utils/timing.d.ts +31 -0
- package/dist/utils/timing.d.ts.map +1 -0
- package/dist/utils/timing.js +46 -0
- package/dist/utils/timing.js.map +1 -0
- 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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"}
|
package/dist/client.d.ts
ADDED
|
@@ -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"}
|