@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,87 @@
1
+ import { type LogContext, type LogLevel, type Logger, type SanitizePreset } from 'vestig';
2
+ export interface ServerLoggerOptions {
3
+ /** Log level */
4
+ level?: LogLevel;
5
+ /** Enable/disable logging */
6
+ enabled?: boolean;
7
+ /** PII sanitization preset */
8
+ sanitize?: SanitizePreset;
9
+ /** Use structured JSON output */
10
+ structured?: boolean;
11
+ /** Base namespace for server-side logs */
12
+ namespace?: string;
13
+ /** Additional context to include in all logs */
14
+ context?: Record<string, unknown>;
15
+ }
16
+ /**
17
+ * Configure server-side logging options
18
+ * Call this once in your app initialization
19
+ */
20
+ export declare function configureServerLogger(options: ServerLoggerOptions): void;
21
+ /**
22
+ * Get a logger instance in Server Components
23
+ *
24
+ * Automatically includes request correlation context from the middleware.
25
+ * Uses React's cache() to ensure the same logger is used for the entire request.
26
+ *
27
+ * @param namespace - Optional namespace for the logger (e.g., 'users', 'auth')
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * // app/users/page.tsx
32
+ * import { getLogger } from '@vestig/next'
33
+ *
34
+ * export default async function UsersPage() {
35
+ * const log = await getLogger('users-page')
36
+ *
37
+ * log.info('Rendering users page')
38
+ *
39
+ * const users = await fetchUsers()
40
+ * log.debug('Users fetched', { count: users.length })
41
+ *
42
+ * return <UserList users={users} />
43
+ * }
44
+ * ```
45
+ */
46
+ export declare function getLogger(namespace?: string): Promise<Logger>;
47
+ /**
48
+ * Get the current request's correlation context in Server Components
49
+ *
50
+ * Useful for passing correlation IDs to client components or external services.
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * // app/layout.tsx
55
+ * import { getRequestContext } from '@vestig/next'
56
+ * import { VestigProvider } from '@vestig/next/client'
57
+ *
58
+ * export default async function RootLayout({ children }) {
59
+ * const ctx = await getRequestContext()
60
+ *
61
+ * return (
62
+ * <html>
63
+ * <body>
64
+ * <VestigProvider initialContext={ctx}>
65
+ * {children}
66
+ * </VestigProvider>
67
+ * </body>
68
+ * </html>
69
+ * )
70
+ * }
71
+ * ```
72
+ */
73
+ export declare function getRequestContext(): Promise<LogContext>;
74
+ /**
75
+ * Create a child logger with additional context
76
+ *
77
+ * @param namespace - Logger namespace
78
+ * @param additionalContext - Additional context to merge
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * const log = await createChildLogger('users', { userId: user.id })
83
+ * log.info('Processing user') // Includes userId in all logs
84
+ * ```
85
+ */
86
+ export declare function createChildLogger(namespace: string, additionalContext?: Record<string, unknown>): Promise<Logger>;
87
+ //# sourceMappingURL=server-component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-component.d.ts","sourceRoot":"","sources":["../../src/server/server-component.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,cAAc,EAGnB,MAAM,QAAQ,CAAA;AAGf,MAAM,WAAW,mBAAmB;IACnC,gBAAgB;IAChB,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,iCAAiC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAaD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAExE;AAsCD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,UAAU,CAAC,CAG7D;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACtC,SAAS,EAAE,MAAM,EACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACzC,OAAO,CAAC,MAAM,CAAC,CAGjB"}
@@ -0,0 +1,122 @@
1
+ import { headers } from 'next/headers';
2
+ import { cache } from 'react';
3
+ import { createCorrelationContext, createLogger, } from 'vestig';
4
+ import { CORRELATION_HEADERS } from '../utils/headers';
5
+ const DEFAULT_OPTIONS = {
6
+ level: 'info',
7
+ enabled: true,
8
+ sanitize: 'default',
9
+ structured: true,
10
+ namespace: 'server',
11
+ };
12
+ // Store options at module level
13
+ let serverOptions = DEFAULT_OPTIONS;
14
+ /**
15
+ * Configure server-side logging options
16
+ * Call this once in your app initialization
17
+ */
18
+ export function configureServerLogger(options) {
19
+ serverOptions = { ...DEFAULT_OPTIONS, ...options };
20
+ }
21
+ /**
22
+ * Get a request-scoped logger using React's cache
23
+ * This ensures the same logger instance is used for the entire request
24
+ */
25
+ const getRequestLogger = cache(async () => {
26
+ const headersList = await headers();
27
+ // Extract correlation context from headers (set by proxy/middleware)
28
+ const requestId = headersList.get(CORRELATION_HEADERS.REQUEST_ID) ?? undefined;
29
+ const traceId = headersList.get(CORRELATION_HEADERS.TRACE_ID) ?? undefined;
30
+ const spanId = headersList.get(CORRELATION_HEADERS.SPAN_ID) ?? undefined;
31
+ // Create or use existing correlation context
32
+ const context = createCorrelationContext({ requestId, traceId, spanId });
33
+ // Create logger with full context
34
+ const logger = createLogger({
35
+ level: serverOptions.level,
36
+ enabled: serverOptions.enabled,
37
+ sanitize: serverOptions.sanitize,
38
+ structured: serverOptions.structured,
39
+ namespace: serverOptions.namespace,
40
+ context: {
41
+ ...serverOptions.context,
42
+ ...context,
43
+ },
44
+ });
45
+ return { logger, context };
46
+ });
47
+ /**
48
+ * Get a logger instance in Server Components
49
+ *
50
+ * Automatically includes request correlation context from the middleware.
51
+ * Uses React's cache() to ensure the same logger is used for the entire request.
52
+ *
53
+ * @param namespace - Optional namespace for the logger (e.g., 'users', 'auth')
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * // app/users/page.tsx
58
+ * import { getLogger } from '@vestig/next'
59
+ *
60
+ * export default async function UsersPage() {
61
+ * const log = await getLogger('users-page')
62
+ *
63
+ * log.info('Rendering users page')
64
+ *
65
+ * const users = await fetchUsers()
66
+ * log.debug('Users fetched', { count: users.length })
67
+ *
68
+ * return <UserList users={users} />
69
+ * }
70
+ * ```
71
+ */
72
+ export async function getLogger(namespace) {
73
+ const { logger } = await getRequestLogger();
74
+ return namespace ? logger.child(namespace) : logger;
75
+ }
76
+ /**
77
+ * Get the current request's correlation context in Server Components
78
+ *
79
+ * Useful for passing correlation IDs to client components or external services.
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * // app/layout.tsx
84
+ * import { getRequestContext } from '@vestig/next'
85
+ * import { VestigProvider } from '@vestig/next/client'
86
+ *
87
+ * export default async function RootLayout({ children }) {
88
+ * const ctx = await getRequestContext()
89
+ *
90
+ * return (
91
+ * <html>
92
+ * <body>
93
+ * <VestigProvider initialContext={ctx}>
94
+ * {children}
95
+ * </VestigProvider>
96
+ * </body>
97
+ * </html>
98
+ * )
99
+ * }
100
+ * ```
101
+ */
102
+ export async function getRequestContext() {
103
+ const { context } = await getRequestLogger();
104
+ return context;
105
+ }
106
+ /**
107
+ * Create a child logger with additional context
108
+ *
109
+ * @param namespace - Logger namespace
110
+ * @param additionalContext - Additional context to merge
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * const log = await createChildLogger('users', { userId: user.id })
115
+ * log.info('Processing user') // Includes userId in all logs
116
+ * ```
117
+ */
118
+ export async function createChildLogger(namespace, additionalContext) {
119
+ const { logger } = await getRequestLogger();
120
+ return logger.child(namespace, { context: additionalContext });
121
+ }
122
+ //# sourceMappingURL=server-component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-component.js","sourceRoot":"","sources":["../../src/server/server-component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAKN,wBAAwB,EACxB,YAAY,GACZ,MAAM,QAAQ,CAAA;AACf,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAiBtD,MAAM,eAAe,GAAwB;IAC5C,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,SAAS;IACnB,UAAU,EAAE,IAAI;IAChB,SAAS,EAAE,QAAQ;CACnB,CAAA;AAED,gCAAgC;AAChC,IAAI,aAAa,GAAwB,eAAe,CAAA;AAExD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA4B;IACjE,aAAa,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE,CAAA;AACnD,CAAC;AAOD;;;GAGG;AACH,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,IAAkC,EAAE;IACvE,MAAM,WAAW,GAAG,MAAM,OAAO,EAAE,CAAA;IAEnC,qEAAqE;IACrE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,SAAS,CAAA;IAC9E,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAA;IAC1E,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,SAAS,CAAA;IAExE,6CAA6C;IAC7C,MAAM,OAAO,GAAG,wBAAwB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;IAExE,kCAAkC;IAClC,MAAM,MAAM,GAAG,YAAY,CAAC;QAC3B,KAAK,EAAE,aAAa,CAAC,KAAK;QAC1B,OAAO,EAAE,aAAa,CAAC,OAAO;QAC9B,QAAQ,EAAE,aAAa,CAAC,QAAQ;QAChC,UAAU,EAAE,aAAa,CAAC,UAAU;QACpC,SAAS,EAAE,aAAa,CAAC,SAAS;QAClC,OAAO,EAAE;YACR,GAAG,aAAa,CAAC,OAAO;YACxB,GAAG,OAAO;SACV;KACD,CAAC,CAAA;IAEF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AAC3B,CAAC,CAAC,CAAA;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAkB;IACjD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAA;IAC3C,OAAO,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;AACpD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACtC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAA;IAC5C,OAAO,OAAO,CAAA;AACf,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,SAAiB,EACjB,iBAA2C;IAE3C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAA;IAC3C,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAA;AAC/D,CAAC"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Shared types for @vestig/next
3
+ */
4
+ import type { LogContext, LogEntry, LogLevel, LogMetadata, Logger, LoggerConfig, SanitizeConfig, SanitizePreset, Transport } from 'vestig';
5
+ export type { Logger, LoggerConfig, LogLevel, LogEntry, LogMetadata, LogContext, Transport, SanitizePreset, SanitizeConfig, };
6
+ export type { VestigNextConfig, VestigNextOptions, VestigNextMiddlewareConfig, VestigNextServerConfig, VestigNextClientConfig, VestigNextDevToolsConfig, } from './config';
7
+ /**
8
+ * Context provided to route handlers wrapped with withVestig
9
+ */
10
+ export interface RouteHandlerContext {
11
+ /** Logger instance with request correlation */
12
+ log: Logger;
13
+ /** Correlation context (requestId, traceId, spanId) */
14
+ ctx: LogContext;
15
+ /** Route params from Next.js */
16
+ params: Record<string, string>;
17
+ /** Request timing utilities */
18
+ timing: {
19
+ /** Start time in ms */
20
+ start: number;
21
+ /** Get elapsed time in ms */
22
+ elapsed: () => number;
23
+ /** Mark a checkpoint */
24
+ mark: (name: string) => void;
25
+ };
26
+ }
27
+ /**
28
+ * Route handler function type
29
+ */
30
+ export type RouteHandler<T = Response> = (request: Request, context: RouteHandlerContext) => Promise<T> | T;
31
+ /**
32
+ * Options for withVestig wrapper
33
+ */
34
+ export interface WithVestigOptions {
35
+ /** Logger namespace (e.g., 'api:users') */
36
+ namespace?: string;
37
+ /** Log incoming request (default: true) */
38
+ logRequest?: boolean;
39
+ /** Log outgoing response (default: true) */
40
+ logResponse?: boolean;
41
+ }
42
+ /**
43
+ * Context provided to server actions wrapped with vestigAction
44
+ */
45
+ export interface ActionContext {
46
+ /** Logger instance with request correlation */
47
+ log: Logger;
48
+ /** Correlation context */
49
+ ctx: LogContext;
50
+ }
51
+ /**
52
+ * Server action function type
53
+ */
54
+ export type ServerAction<TInput, TOutput> = (input: TInput, context: ActionContext) => Promise<TOutput>;
55
+ /**
56
+ * Options for vestigAction wrapper
57
+ */
58
+ export interface VestigActionOptions {
59
+ /** Logger namespace */
60
+ namespace?: string;
61
+ /** Log input data (default: false for security) */
62
+ logInput?: boolean;
63
+ /** Log output data (default: false) */
64
+ logOutput?: boolean;
65
+ }
66
+ /**
67
+ * Props for VestigProvider component
68
+ */
69
+ export interface VestigProviderProps {
70
+ children: React.ReactNode;
71
+ /** Initial correlation context (e.g., from server) */
72
+ initialContext?: LogContext;
73
+ /** Override endpoint URL */
74
+ endpoint?: string;
75
+ /** Logger namespace */
76
+ namespace?: string;
77
+ /** Additional static context */
78
+ context?: Record<string, unknown>;
79
+ }
80
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACX,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,MAAM,EACN,YAAY,EACZ,cAAc,EACd,cAAc,EACd,SAAS,EACT,MAAM,QAAQ,CAAA;AAGf,YAAY,EACX,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,UAAU,EACV,SAAS,EACT,cAAc,EACd,cAAc,GACd,CAAA;AAGD,YAAY,EACX,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,GACxB,MAAM,UAAU,CAAA;AAEjB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAA;IACX,uDAAuD;IACvD,GAAG,EAAE,UAAU,CAAA;IACf,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,+BAA+B;IAC/B,MAAM,EAAE;QACP,uBAAuB;QACvB,KAAK,EAAE,MAAM,CAAA;QACb,6BAA6B;QAC7B,OAAO,EAAE,MAAM,MAAM,CAAA;QACrB,wBAAwB;QACxB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;KAC5B,CAAA;CACD;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,QAAQ,IAAI,CACxC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,mBAAmB,KACxB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAEnB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAA;IACX,0BAA0B;IAC1B,GAAG,EAAE,UAAU,CAAA;CACf;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,IAAI,CAC3C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,KAClB,OAAO,CAAC,OAAO,CAAC,CAAA;AAErB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,sDAAsD;IACtD,cAAc,CAAC,EAAE,UAAU,CAAA;IAC3B,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Shared types for @vestig/next
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Standard correlation headers used by vestig
3
+ */
4
+ export declare const CORRELATION_HEADERS: {
5
+ readonly REQUEST_ID: "x-request-id";
6
+ readonly TRACE_ID: "x-trace-id";
7
+ readonly SPAN_ID: "x-span-id";
8
+ readonly TRACEPARENT: "traceparent";
9
+ };
10
+ /**
11
+ * Correlation context extracted from headers
12
+ */
13
+ export interface CorrelationHeaders {
14
+ requestId?: string;
15
+ traceId?: string;
16
+ spanId?: string;
17
+ }
18
+ /**
19
+ * Extract correlation headers from a Headers object
20
+ */
21
+ export declare function extractCorrelationHeaders(headers: Headers): CorrelationHeaders;
22
+ /**
23
+ * Set correlation headers on a Headers object
24
+ */
25
+ export declare function setCorrelationHeaders(headers: Headers, context: {
26
+ requestId?: string;
27
+ traceId?: string;
28
+ spanId?: string;
29
+ }): void;
30
+ /**
31
+ * Create a new Headers object with correlation headers added
32
+ */
33
+ export declare function withCorrelationHeaders(existingHeaders: Headers | Record<string, string>, context: {
34
+ requestId?: string;
35
+ traceId?: string;
36
+ spanId?: string;
37
+ }): Headers;
38
+ //# sourceMappingURL=headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/utils/headers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;CAKtB,CAAA;AAEV;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,kBAAkB,CAM9E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACrC,eAAe,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjD,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,OAAO,CAIT"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Standard correlation headers used by vestig
3
+ */
4
+ export const CORRELATION_HEADERS = {
5
+ REQUEST_ID: 'x-request-id',
6
+ TRACE_ID: 'x-trace-id',
7
+ SPAN_ID: 'x-span-id',
8
+ TRACEPARENT: 'traceparent',
9
+ };
10
+ /**
11
+ * Extract correlation headers from a Headers object
12
+ */
13
+ export function extractCorrelationHeaders(headers) {
14
+ return {
15
+ requestId: headers.get(CORRELATION_HEADERS.REQUEST_ID) ?? undefined,
16
+ traceId: headers.get(CORRELATION_HEADERS.TRACE_ID) ?? undefined,
17
+ spanId: headers.get(CORRELATION_HEADERS.SPAN_ID) ?? undefined,
18
+ };
19
+ }
20
+ /**
21
+ * Set correlation headers on a Headers object
22
+ */
23
+ export function setCorrelationHeaders(headers, context) {
24
+ if (context.requestId) {
25
+ headers.set(CORRELATION_HEADERS.REQUEST_ID, context.requestId);
26
+ }
27
+ if (context.traceId) {
28
+ headers.set(CORRELATION_HEADERS.TRACE_ID, context.traceId);
29
+ }
30
+ if (context.spanId) {
31
+ headers.set(CORRELATION_HEADERS.SPAN_ID, context.spanId);
32
+ }
33
+ }
34
+ /**
35
+ * Create a new Headers object with correlation headers added
36
+ */
37
+ export function withCorrelationHeaders(existingHeaders, context) {
38
+ const headers = new Headers(existingHeaders);
39
+ setCorrelationHeaders(headers, context);
40
+ return headers;
41
+ }
42
+ //# sourceMappingURL=headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/utils/headers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAClC,UAAU,EAAE,cAAc;IAC1B,QAAQ,EAAE,YAAY;IACtB,OAAO,EAAE,WAAW;IACpB,WAAW,EAAE,aAAa;CACjB,CAAA;AAWV;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACzD,OAAO;QACN,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,SAAS;QACnE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,SAAS;QAC/D,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,SAAS;KAC7D,CAAA;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACpC,OAAgB,EAChB,OAAkE;IAElE,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/D,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3D,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACzD,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACrC,eAAiD,EACjD,OAAkE;IAElE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,eAA8B,CAAC,CAAA;IAC3D,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACvC,OAAO,OAAO,CAAA;AACf,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './headers';
2
+ export * from './timing';
3
+ export * from './metadata';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './headers';
2
+ export * from './timing';
3
+ export * from './metadata';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Request metadata extraction utilities
3
+ */
4
+ type NextRequest = Request & {
5
+ nextUrl?: URL;
6
+ ip?: string;
7
+ };
8
+ /**
9
+ * Metadata extracted from a request
10
+ */
11
+ export interface RequestMetadata {
12
+ method: string;
13
+ path: string;
14
+ search?: string;
15
+ ip?: string;
16
+ userAgent?: string;
17
+ referer?: string;
18
+ contentType?: string;
19
+ contentLength?: number;
20
+ origin?: string;
21
+ host?: string;
22
+ }
23
+ /**
24
+ * Extract common metadata from a request
25
+ */
26
+ export declare function extractRequestMetadata(request: NextRequest): RequestMetadata;
27
+ /**
28
+ * Metadata extracted from a response
29
+ */
30
+ export interface ResponseMetadata {
31
+ status: number;
32
+ statusText: string;
33
+ contentType?: string;
34
+ contentLength?: number;
35
+ }
36
+ /**
37
+ * Extract common metadata from a response
38
+ */
39
+ export declare function extractResponseMetadata(response: Response): ResponseMetadata;
40
+ export {};
41
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/utils/metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,KAAK,WAAW,GAAG,OAAO,GAAG;IAAE,OAAO,CAAC,EAAE,GAAG,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAE3D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,eAAe,CAe5E;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,CAO5E"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Request metadata extraction utilities
3
+ */
4
+ /**
5
+ * Extract common metadata from a request
6
+ */
7
+ export function extractRequestMetadata(request) {
8
+ const url = request.nextUrl ?? new URL(request.url);
9
+ return {
10
+ method: request.method,
11
+ path: url.pathname,
12
+ search: url.search || undefined,
13
+ ip: request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ?? request.ip,
14
+ userAgent: truncate(request.headers.get('user-agent'), 200),
15
+ referer: request.headers.get('referer') ?? undefined,
16
+ contentType: request.headers.get('content-type') ?? undefined,
17
+ contentLength: parseContentLength(request.headers.get('content-length')),
18
+ origin: request.headers.get('origin') ?? undefined,
19
+ host: request.headers.get('host') ?? undefined,
20
+ };
21
+ }
22
+ /**
23
+ * Extract common metadata from a response
24
+ */
25
+ export function extractResponseMetadata(response) {
26
+ return {
27
+ status: response.status,
28
+ statusText: response.statusText,
29
+ contentType: response.headers.get('content-type') ?? undefined,
30
+ contentLength: parseContentLength(response.headers.get('content-length')),
31
+ };
32
+ }
33
+ function truncate(value, maxLength) {
34
+ if (!value)
35
+ return undefined;
36
+ if (value.length <= maxLength)
37
+ return value;
38
+ return `${value.slice(0, maxLength)}...`;
39
+ }
40
+ function parseContentLength(value) {
41
+ if (!value)
42
+ return undefined;
43
+ const parsed = Number.parseInt(value, 10);
44
+ return Number.isNaN(parsed) ? undefined : parsed;
45
+ }
46
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/utils/metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoBH;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAoB;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAEnD,OAAO;QACN,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,GAAG,CAAC,QAAQ;QAClB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,SAAS;QAC/B,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,EAAE;QAC/E,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC;QAC3D,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS;QACpD,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,SAAS;QAC7D,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACxE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS;QAClD,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS;KAC9C,CAAA;AACF,CAAC;AAYD;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAkB;IACzD,OAAO;QACN,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,SAAS;QAC9D,aAAa,EAAE,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;KACzE,CAAA;AACF,CAAC;AAED,SAAS,QAAQ,CAAC,KAAoB,EAAE,SAAiB;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,KAAK,CAAA;IAC3C,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAA;AACzC,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAoB;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACzC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAA;AACjD,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Request timing utilities for measuring performance
3
+ */
4
+ /**
5
+ * Timing context for request duration tracking
6
+ */
7
+ export interface RequestTiming {
8
+ /** Start time in milliseconds */
9
+ start: number;
10
+ /** End time in milliseconds (set when completed) */
11
+ end?: number;
12
+ /** Get elapsed time in milliseconds */
13
+ elapsed: () => number;
14
+ /** Mark a named checkpoint */
15
+ mark: (name: string) => void;
16
+ /** Get a specific mark's elapsed time from start */
17
+ getMark: (name: string) => number | undefined;
18
+ /** Get all marks */
19
+ getMarks: () => Record<string, number>;
20
+ /** Complete timing (sets end time) */
21
+ complete: () => number;
22
+ }
23
+ /**
24
+ * Create a new request timing context
25
+ */
26
+ export declare function createRequestTiming(): RequestTiming;
27
+ /**
28
+ * Format duration in human-readable format
29
+ */
30
+ export declare function formatDuration(ms: number): string;
31
+ //# sourceMappingURL=timing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/utils/timing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,oDAAoD;IACpD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,OAAO,EAAE,MAAM,MAAM,CAAA;IACrB,8BAA8B;IAC9B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,oDAAoD;IACpD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;IAC7C,oBAAoB;IACpB,QAAQ,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,sCAAsC;IACtC,QAAQ,EAAE,MAAM,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CA2BnD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQjD"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Request timing utilities for measuring performance
3
+ */
4
+ /**
5
+ * Create a new request timing context
6
+ */
7
+ export function createRequestTiming() {
8
+ const start = performance.now();
9
+ const marks = {};
10
+ let end;
11
+ return {
12
+ start,
13
+ get end() {
14
+ return end;
15
+ },
16
+ elapsed() {
17
+ return (end ?? performance.now()) - start;
18
+ },
19
+ mark(name) {
20
+ marks[name] = performance.now() - start;
21
+ },
22
+ getMark(name) {
23
+ return marks[name];
24
+ },
25
+ getMarks() {
26
+ return { ...marks };
27
+ },
28
+ complete() {
29
+ end = performance.now();
30
+ return end - start;
31
+ },
32
+ };
33
+ }
34
+ /**
35
+ * Format duration in human-readable format
36
+ */
37
+ export function formatDuration(ms) {
38
+ if (ms < 1) {
39
+ return `${(ms * 1000).toFixed(0)}μs`;
40
+ }
41
+ if (ms < 1000) {
42
+ return `${ms.toFixed(2)}ms`;
43
+ }
44
+ return `${(ms / 1000).toFixed(2)}s`;
45
+ }
46
+ //# sourceMappingURL=timing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timing.js","sourceRoot":"","sources":["../../src/utils/timing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsBH;;GAEG;AACH,MAAM,UAAU,mBAAmB;IAClC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;IAC/B,MAAM,KAAK,GAA2B,EAAE,CAAA;IACxC,IAAI,GAAuB,CAAA;IAE3B,OAAO;QACN,KAAK;QACL,IAAI,GAAG;YACN,OAAO,GAAG,CAAA;QACX,CAAC;QACD,OAAO;YACN,OAAO,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAA;QAC1C,CAAC;QACD,IAAI,CAAC,IAAY;YAChB,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;QACxC,CAAC;QACD,OAAO,CAAC,IAAY;YACnB,OAAO,KAAK,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC;QACD,QAAQ;YACP,OAAO,EAAE,GAAG,KAAK,EAAE,CAAA;QACpB,CAAC;QACD,QAAQ;YACP,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;YACvB,OAAO,GAAG,GAAG,KAAK,CAAA;QACnB,CAAC;KACD,CAAA;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU;IACxC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACZ,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;IACrC,CAAC;IACD,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QACf,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;IAC5B,CAAC;IACD,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAA;AACpC,CAAC"}