@reprova/sdk 0.2.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/sdk.js CHANGED
@@ -1,34 +1,371 @@
1
+ import http from 'node:http';
2
+ import https from 'node:https';
1
3
  import { contextStorage } from './context.js';
4
+ import { registerContext, completeContext, snapshotCohort } from './registry.js';
2
5
  import { BatchTransport } from './transport.js';
3
6
  import { parseStack, generateTraceId, stripHeaders, captureHeaders } from './stack.js';
7
+ import { createPrismaExtension } from './prisma.js';
8
+ import { createNestExceptionFilter } from './nest.js';
4
9
  let instance = null;
10
+ // Zero-code-change async error capture: Express 4 discards the promise an
11
+ // async handler returns, so a rejection never reaches error middleware unless
12
+ // the app hand-plumbs next(err). We patch the router's Layer dispatch (the
13
+ // same semantics Express 5's router ships natively) so every handler's
14
+ // returned promise gets a rejection-forwarder attached automatically.
15
+ const kAsyncWrapped = Symbol('reprova.asyncWrapped');
16
+ // Apps we've already probed (added even when probing no-ops, e.g. Express 5).
17
+ const patchedApps = new WeakSet();
18
+ // Layer prototypes already patched — one per physical express copy.
19
+ const patchedLayerProtos = new WeakSet();
20
+ // Best-effort auto-detection, no app code changes required: req.auth is the
21
+ // express-oauth2-jwt-bearer / Auth0 convention; req.user is what Passport
22
+ // and the overwhelming majority of hand-rolled Express JWT middleware
23
+ // assigns instead (`req.user = decoded` right after verifying the token).
24
+ // req.auth wins when both are present since it's the more specific,
25
+ // auth-only convention — req.user sometimes carries a broader profile.
26
+ // Apps using neither (a custom property, a non-Express framework) still
27
+ // need the explicit setAuthClaims() escape hatch from context.ts.
28
+ function detectAuthClaims(req) {
29
+ return req.auth ?? req.user;
30
+ }
31
+ // refreshRequestSnapshot re-reads body and auth claims from the live req at
32
+ // capture time. The request middleware runs at the very front of the stack
33
+ // (before body parsers and auth middleware), so its eager snapshot can miss
34
+ // req.body/req.auth/req.user — by the time anything is captured, all three
35
+ // are final. Mutating ctx.request in place keeps cohort snapshots consistent
36
+ // too.
37
+ function refreshRequestSnapshot(ctx) {
38
+ const req = ctx.rawRequest;
39
+ if (!req)
40
+ return;
41
+ if (req.body !== undefined) {
42
+ ctx.request.body = typeof req.body === 'string' ? req.body : JSON.stringify(req.body ?? '');
43
+ }
44
+ const claims = detectAuthClaims(req);
45
+ if (claims !== undefined && ctx.request.authClaims === undefined) {
46
+ ctx.request.authClaims = claims;
47
+ }
48
+ }
49
+ // Universal HTTP instrumentation: wrap the 'request' event on node's own
50
+ // http/https servers, so EVERY Node app — vanilla http.createServer, Koa,
51
+ // Fastify, Express — runs its request handling inside a Reprova context.
52
+ // Framework middleware becomes an enrichment, not a requirement. Installed
53
+ // once; per-request behavior is gated on the CURRENT init'd instance, so
54
+ // re-inits (and disabled mode) behave correctly without re-patching.
55
+ let httpInstrumented = false;
56
+ function instrumentHttpServers() {
57
+ if (httpInstrumented)
58
+ return;
59
+ httpInstrumented = true;
60
+ // https.Server does NOT inherit from http.Server (it extends tls.Server),
61
+ // and neither defines its own emit — both use EventEmitter's. Patch both
62
+ // prototypes with an own emit that delegates upward.
63
+ for (const proto of [http.Server.prototype, https.Server.prototype]) {
64
+ const originalEmit = proto.emit;
65
+ proto.emit = function (event, ...args) {
66
+ const sdk = instance;
67
+ if (event !== 'request' || !sdk || sdk.disabled) {
68
+ return originalEmit.apply(this, [event, ...args]);
69
+ }
70
+ const req = args[0];
71
+ const res = args[1];
72
+ const ctx = contextFromIncoming(req);
73
+ registerContext(ctx);
74
+ res.on('finish', () => {
75
+ // Silent 5xx: the handler responded 5xx without throwing. Vanilla
76
+ // responses have no res.json to wrap, so the check runs at finish.
77
+ if (res.statusCode >= 500 && !ctx.captured) {
78
+ contextStorage.run(ctx, () => sdk.captureHttp5xx(null, res.statusCode, ''));
79
+ }
80
+ completeContext(ctx);
81
+ });
82
+ res.on('close', () => completeContext(ctx));
83
+ try {
84
+ return contextStorage.run(ctx, () => originalEmit.apply(this, [event, ...args]));
85
+ }
86
+ catch (err) {
87
+ // A synchronous throw unwinds out of the ALS frame before the
88
+ // process-level handler could see the store — capture WITH context
89
+ // here, then rethrow to preserve Node's semantics. The process
90
+ // handler skips already-captured contexts.
91
+ if (err instanceof Error)
92
+ sdk.capture('unhandled_exception', err, ctx);
93
+ throw err;
94
+ }
95
+ };
96
+ }
97
+ }
98
+ function contextFromIncoming(req) {
99
+ let path = req.url ?? '/';
100
+ try {
101
+ path = new URL(path, 'http://placeholder').pathname;
102
+ }
103
+ catch {
104
+ // keep raw url
105
+ }
106
+ const traceId = req.headers['traceparent'] ?? generateTraceId();
107
+ return {
108
+ traceId,
109
+ capturedAt: new Date(),
110
+ request: {
111
+ method: req.method ?? 'GET',
112
+ path,
113
+ headers: captureHeaders(req.headers),
114
+ body: '', // refreshed at capture time from rawRequest if a framework parsed it
115
+ },
116
+ footprint: [],
117
+ outboundCalls: [],
118
+ rawRequest: req,
119
+ };
120
+ }
121
+ // The error-middleware layer setupExpress mounted for each app, so the
122
+ // request middleware can keep it at the end of the stack even when routes
123
+ // are registered after setup (position independence).
124
+ const setupErrorLayers = new WeakMap();
125
+ // keepErrorHandlerLast repositions setupExpress's error layer when ROUTE
126
+ // registrations have landed after it — but never past the app's own error
127
+ // middleware (4-arg layers), which must stay downstream so it still receives
128
+ // the error after we capture and next(err) it. Runs from the request
129
+ // middleware, i.e. early in dispatch: moving a NOT-YET-VISITED layer within
130
+ // the live stack array is safe — express iterates with a forward-only index
131
+ // and re-reads stack.length each step, so unvisited layers shift one slot
132
+ // and are still each visited exactly once.
133
+ function keepErrorHandlerLast(app) {
134
+ const errLayer = setupErrorLayers.get(app);
135
+ if (!errLayer)
136
+ return;
137
+ const stack = app._router?.stack;
138
+ if (!stack || stack.length === 0)
139
+ return;
140
+ const i = stack.indexOf(errLayer);
141
+ if (i === -1)
142
+ return;
143
+ // Find the last NON-error layer (handler arity < 4) after ours — a route
144
+ // or middleware registered after setupExpress. If none, we're already
145
+ // positioned correctly (anything after us is user error middleware).
146
+ let lastNonError = -1;
147
+ for (let j = i + 1; j < stack.length; j++) {
148
+ const handle = stack[j].handle;
149
+ if (typeof handle === 'function' && handle.length < 4)
150
+ lastNonError = j;
151
+ }
152
+ if (lastNonError === -1)
153
+ return;
154
+ stack.splice(i, 1);
155
+ // Indices shifted down by one past i; insert right AFTER the late layer.
156
+ stack.splice(lastNonError, 0, errLayer);
157
+ }
158
+ // forwardAsyncErrors applies the rejection-forwarding patch to an app
159
+ // explicitly. requestHandler() does this automatically on the first request,
160
+ // so most apps never call it — it exists for the cases that middleware can't
161
+ // reach: a sub-app running a different physical copy of express, or an app
162
+ // that mounts routes needing Express-5 rejection semantics WITHOUT running
163
+ // the SDK (e.g. the demo app under `repro run` replay, where no DSN is set).
164
+ // Call it after routes are registered. Idempotent.
165
+ export function forwardAsyncErrors(app) {
166
+ patchLayerPrototype(app);
167
+ }
168
+ // Express error middleware that emits the structured error `repro run` needs to
169
+ // compare a replayed failure against the originally captured one — the type,
170
+ // message, and normalized stack (via the SAME parseStack used at capture, so
171
+ // the two can never drift). Active ONLY under REPROVA_REPLAY=1, which the CLI
172
+ // sets when it launches the app for replay; otherwise it forwards to the app's
173
+ // own error handler (next(err)), so it's a transparent no-op in normal
174
+ // operation. Register it BEFORE the app's own 500 responder.
175
+ export function replayErrorHandler() {
176
+ const replay = process.env.REPROVA_REPLAY === '1';
177
+ return (err, _req, res, next) => {
178
+ if (!replay)
179
+ return next(err);
180
+ res.status(500).json({
181
+ error: {
182
+ type: err.constructor?.name ?? err.name ?? 'Error',
183
+ message: err.message,
184
+ stack: parseStack(err),
185
+ },
186
+ });
187
+ };
188
+ }
189
+ function patchLayerPrototype(app) {
190
+ if (patchedApps.has(app))
191
+ return;
192
+ patchedApps.add(app);
193
+ // Express 4 keeps the router at app._router; Express 5 renamed it (and its
194
+ // router forwards rejected promises natively), so failing any of these
195
+ // guards means there is nothing for us to do.
196
+ const router = app._router;
197
+ const firstLayer = router?.stack?.[0];
198
+ if (!firstLayer)
199
+ return;
200
+ const proto = Object.getPrototypeOf(firstLayer);
201
+ if (!proto || typeof proto.handle_request !== 'function')
202
+ return;
203
+ if (patchedLayerProtos.has(proto))
204
+ return;
205
+ patchedLayerProtos.add(proto);
206
+ const original = proto.handle_request;
207
+ proto.handle_request = function handle_request(req, res, next) {
208
+ const fn = this.handle;
209
+ // Wrap plain request handlers only (arity < 4 — express uses fn.length to
210
+ // recognize error middleware; the wrapper keeps arity 3 for the same
211
+ // reason). Wrapping is once per layer, marked with a symbol.
212
+ if (typeof fn === 'function' && fn.length < 4 && !(kAsyncWrapped in fn)) {
213
+ const inner = fn;
214
+ const wrapped = function (rq, rs, nx) {
215
+ const ret = inner(rq, rs, nx);
216
+ if (ret && typeof ret.then === 'function') {
217
+ // Same coercion as Express 5's router: a falsy rejection reason
218
+ // still has to travel the error chain as *something*.
219
+ ret.then(undefined, (err) => nx(err || new Error('unhandled promise rejection in request handler')));
220
+ }
221
+ return ret;
222
+ };
223
+ Object.defineProperty(wrapped, kAsyncWrapped, { value: true });
224
+ this.handle = wrapped;
225
+ }
226
+ return original.call(this, req, res, next);
227
+ };
228
+ }
5
229
  export class Reprova {
6
230
  opts;
7
231
  transport;
8
232
  release;
9
- sdkVersion = '0.1.0';
233
+ sdkVersion = '0.4.0';
234
+ disabled;
10
235
  migrationId = 'unknown';
11
236
  outboundOpts;
12
237
  constructor(opts) {
13
238
  this.opts = opts;
14
- const url = new URL(opts.dsn);
15
- const apiKey = url.pathname.slice(1); // strip leading slash
16
- const endpoint = `${url.protocol}//${url.host}/v1/ingest`;
17
- this.transport = new BatchTransport({ endpoint, apiKey });
18
- this.transport.start();
239
+ this.disabled = !opts.dsn;
240
+ if (this.disabled) {
241
+ // Inert transport: constructed so internal wiring stays uniform, but
242
+ // never started and capture() never enqueues into it.
243
+ this.transport = new BatchTransport({ endpoint: 'http://disabled.invalid/v1/ingest', apiKey: '' });
244
+ }
245
+ else {
246
+ const url = new URL(opts.dsn);
247
+ const apiKey = url.pathname.slice(1); // strip leading slash
248
+ const endpoint = `${url.protocol}//${url.host}/v1/ingest`;
249
+ this.transport = new BatchTransport({ endpoint, apiKey });
250
+ this.transport.start();
251
+ }
19
252
  this.release = opts.release;
20
253
  this.outboundOpts = opts.recordOutbound;
21
254
  }
22
255
  static init(opts) {
23
256
  instance = new Reprova(opts);
24
- instance.patchOutbound();
257
+ if (!instance.disabled) {
258
+ instance.patchOutbound();
259
+ if (opts.instrumentHttp !== false)
260
+ instrumentHttpServers();
261
+ if (opts.processHandlers !== false)
262
+ instance.attachProcessHandlers();
263
+ }
25
264
  return instance;
26
265
  }
27
266
  static getInstance() { return instance; }
28
267
  setMigrationId(id) { this.migrationId = id; }
29
- // Express middleware: opens per-request context.
268
+ // One-call Prisma integration. Splices the footprint-recording extension
269
+ // onto an existing PrismaClient (in place, preserving its identity) and
270
+ // best-effort reads the latest applied migration into migration_id.
271
+ //
272
+ // Typed structurally so the SDK never has to import '@prisma/client' —
273
+ // Prisma stays an optional peer. No-op when the SDK is disabled (no DSN /
274
+ // replay), like recordFootprint, so callers need no `if (dsn)` guard.
275
+ //
276
+ // Mutates `client` in place via Object.assign($extends(...)) because
277
+ // $extends returns a NEW client and the shared singleton must keep
278
+ // recording. Await it so migration_id is set before the first request.
279
+ async instrumentPrisma(client, opts) {
280
+ if (this.disabled)
281
+ return;
282
+ const c = client;
283
+ // 1. Footprint capture: extend, then copy the extended client's behavior
284
+ // back onto the original so every importer of the singleton records.
285
+ const ext = createPrismaExtension(opts?.dmmf);
286
+ Object.assign(c, c.$extends(ext));
287
+ // 2. migration_id: best-effort. Absent table (migrations not run) or any
288
+ // query error leaves it at the 'unknown' default — never fatal at boot.
289
+ // Two dialects of the same query, tried in order: SQL Server has no
290
+ // LIMIT (TOP goes right after SELECT instead), and the SDK deliberately
291
+ // has no notion of "which dialect" — it never imports @prisma/client, so
292
+ // it can't inspect the datasource provider; trying both is simpler than
293
+ // adding a dialect option just for this one query.
294
+ if (opts?.readMigrationId !== false) {
295
+ let rows = [];
296
+ try {
297
+ rows = await c.$queryRaw `
298
+ SELECT migration_name FROM _prisma_migrations ORDER BY finished_at DESC LIMIT 1
299
+ `;
300
+ }
301
+ catch {
302
+ try {
303
+ rows = await c.$queryRaw `
304
+ SELECT TOP 1 migration_name FROM _prisma_migrations ORDER BY finished_at DESC
305
+ `;
306
+ }
307
+ catch {
308
+ // migration_id stays 'unknown'
309
+ }
310
+ }
311
+ if (rows[0]?.migration_name) {
312
+ this.setMigrationId(rows[0].migration_name);
313
+ }
314
+ }
315
+ }
316
+ // One-call Express integration (Sentry-style): mounts the request context
317
+ // middleware (repositioned to run before everything, wherever setup is
318
+ // called), the error-capture middleware (kept last even if routes are
319
+ // registered later), the http_5xx response hook, and async rejection
320
+ // forwarding. Equivalent to the manual requestHandler/errorHandler/
321
+ // wrapResponse wiring — same capture payloads, one line.
322
+ setupExpress(app) {
323
+ app.use(this.requestHandler());
324
+ const router = app._router;
325
+ const stack = router?.stack;
326
+ if (stack && stack.length > 0) {
327
+ // Move the just-pushed request layer to sit right after express's
328
+ // leading built-ins (query/expressInit), so it runs first even when
329
+ // setupExpress is called after the routes.
330
+ const reqLayer = stack[stack.length - 1];
331
+ let insertAt = 0;
332
+ while (insertAt < stack.length - 1) {
333
+ const name = stack[insertAt].name;
334
+ if (name === 'query' || name === 'expressInit') {
335
+ insertAt++;
336
+ }
337
+ else {
338
+ break;
339
+ }
340
+ }
341
+ stack.splice(stack.length - 1, 1);
342
+ stack.splice(insertAt, 0, reqLayer);
343
+ }
344
+ app.use(this.errorHandler());
345
+ if (stack && stack.length > 0) {
346
+ setupErrorLayers.set(app, stack[stack.length - 1]);
347
+ }
348
+ }
349
+ // Express middleware: opens per-request context. Also installs the async
350
+ // rejection forwarder on first request (see patchLayerPrototype) so plain
351
+ // `async (req, res) => ...` handlers need no wrapper and no next(err).
30
352
  requestHandler() {
31
- return (req, _res, next) => {
353
+ return (req, res, next) => {
354
+ if (req.app) {
355
+ patchLayerPrototype(req.app);
356
+ keepErrorHandlerLast(req.app);
357
+ }
358
+ // http_5xx-without-throw hook rides along automatically.
359
+ if (!this.disabled)
360
+ wrapResponse(res, this);
361
+ // With HTTP-server instrumentation active (init default), a context
362
+ // for this very request already exists — don't shadow it with a
363
+ // second one; every capture path reads the same store either way.
364
+ const existing = contextStorage.getStore();
365
+ if (existing && existing.rawRequest === req) {
366
+ next();
367
+ return;
368
+ }
32
369
  const traceId = req.headers['traceparent'] ?? generateTraceId();
33
370
  const ctx = {
34
371
  traceId,
@@ -38,11 +375,18 @@ export class Reprova {
38
375
  path: req.path,
39
376
  headers: captureHeaders(req.headers),
40
377
  body: typeof req.body === 'string' ? req.body : JSON.stringify(req.body ?? ''),
41
- authClaims: req['auth'],
378
+ authClaims: detectAuthClaims(req),
42
379
  },
43
380
  footprint: [],
44
381
  outboundCalls: [],
382
+ rawRequest: req,
45
383
  };
384
+ // Track this context so a concurrent request's capture can see it
385
+ // (and, briefly after completion, that it recently overlapped).
386
+ registerContext(ctx);
387
+ const done = () => completeContext(ctx);
388
+ res.on('finish', done);
389
+ res.on('close', done);
46
390
  contextStorage.run(ctx, next);
47
391
  };
48
392
  }
@@ -61,6 +405,36 @@ export class Reprova {
61
405
  const ctx = contextStorage.getStore();
62
406
  this.capture(opts?.trigger ?? 'manual_capture', err, ctx);
63
407
  }
408
+ // NestJS global exception filter: hands Nest-caught exceptions to the
409
+ // capture pipeline with the ORIGINAL stack (Nest's exception layer
410
+ // otherwise converts them to 500s before Express error middleware ever
411
+ // sees them, leaving only the silent-5xx capture), honors the
412
+ // REPROVA_REPLAY contract for exact replay verdicts, and responds the way
413
+ // Nest's own default filter would. Usage:
414
+ // app.useGlobalFilters(sdk.nestExceptionFilter());
415
+ nestExceptionFilter() {
416
+ return createNestExceptionFilter({
417
+ capture: (err) => {
418
+ const ctx = contextStorage.getStore();
419
+ if (!ctx?.captured)
420
+ this.capture('unhandled_exception', err, ctx);
421
+ },
422
+ });
423
+ }
424
+ // One-call NestJS setup, the setupExpress of the Nest world: registers the
425
+ // exception filter and (when given a Prisma client) wires automatic data
426
+ // footprints + migration_id in the same breath. The whole integration:
427
+ // const sdk = Reprova.init({ dsn, release });
428
+ // const app = await NestFactory.create(AppModule);
429
+ // await sdk.setupNest(app, { prisma: app.get(PrismaService), dmmf: Prisma.dmmf });
430
+ // Other ORMs stay their usual one line (installTypeOrmSubscriber(dataSource),
431
+ // installKnexHooks(knex), ...) — they aren't Reprova-instance methods.
432
+ async setupNest(app, opts) {
433
+ app.useGlobalFilters(this.nestExceptionFilter());
434
+ if (opts?.prisma) {
435
+ await this.instrumentPrisma(opts.prisma, { dmmf: opts.dmmf });
436
+ }
437
+ }
64
438
  // Called by response hook for http_5xx (no thrown error).
65
439
  captureHttp5xx(err, statusCode, responseBody) {
66
440
  const ctx = contextStorage.getStore();
@@ -77,8 +451,12 @@ export class Reprova {
77
451
  });
78
452
  }
79
453
  capture(trigger, err, ctx, extra) {
80
- if (ctx)
454
+ if (this.disabled)
455
+ return;
456
+ if (ctx) {
81
457
  ctx.captured = true;
458
+ refreshRequestSnapshot(ctx);
459
+ }
82
460
  const payload = {
83
461
  trigger: trigger,
84
462
  trace_id: ctx?.traceId ?? generateTraceId(),
@@ -104,22 +482,81 @@ export class Reprova {
104
482
  data_footprint: { queries: ctx?.footprint ?? [] },
105
483
  outbound_calls: ctx?.outboundCalls ?? [],
106
484
  };
485
+ // Concurrency cohort: what else was in flight (or just finished) when
486
+ // this error happened — the raw material for race-condition replay.
487
+ // The key is omitted entirely when the request was alone.
488
+ const cohort = ctx ? snapshotCohort(ctx) : [];
489
+ if (cohort.length > 0) {
490
+ payload.concurrent_requests = cohort;
491
+ }
107
492
  this.transport.enqueue(payload);
108
493
  }
109
- // Attach process-level handlers.
494
+ // Attach process-level handlers. AsyncLocalStorage context survives into
495
+ // both handlers for errors from async continuations (verified on Node 22),
496
+ // so even these captures carry request context when one exists. Contexts
497
+ // already captured (e.g. by the http emit wrapper's sync-throw catch) are
498
+ // skipped to avoid double-reporting.
110
499
  attachProcessHandlers() {
111
500
  process.on('uncaughtException', (err) => {
112
501
  const ctx = contextStorage.getStore();
113
- this.capture('unhandled_exception', err, ctx);
502
+ if (!ctx?.captured)
503
+ this.capture('unhandled_exception', err, ctx);
114
504
  // Allow flush before exit.
115
505
  void this.transport.flush().finally(() => process.exit(1));
116
506
  });
117
507
  process.on('unhandledRejection', (reason) => {
118
508
  const err = reason instanceof Error ? reason : new Error(String(reason));
119
509
  const ctx = contextStorage.getStore();
120
- this.capture('unhandled_exception', err, ctx);
510
+ if (!ctx?.captured)
511
+ this.capture('unhandled_exception', err, ctx);
121
512
  });
122
513
  }
514
+ // Run any operation — a queue consumer, a script step, anything without
515
+ // an HTTP request — inside a capture context: errors are captured (then
516
+ // rethrown, so the caller's error flow is unchanged), and footprints /
517
+ // outbound calls recorded inside land on the capture.
518
+ async runWithContext(info, fn) {
519
+ return this.runInContext('unhandled_exception', info, fn);
520
+ }
521
+ // Background-job wrapper: like runWithContext, but failures ingest with
522
+ // the job_failure trigger so they're distinguishable on the dashboard.
523
+ async runJob(name, fn) {
524
+ return this.runInContext('job_failure', { name }, fn);
525
+ }
526
+ async runInContext(trigger, info, fn) {
527
+ const ctx = {
528
+ traceId: generateTraceId(),
529
+ capturedAt: new Date(),
530
+ request: {
531
+ method: info.method ?? 'JOB',
532
+ path: info.path ?? info.name ?? 'task',
533
+ headers: info.headers ?? {},
534
+ body: info.body ?? '',
535
+ },
536
+ footprint: [],
537
+ outboundCalls: [],
538
+ };
539
+ registerContext(ctx);
540
+ try {
541
+ return await contextStorage.run(ctx, () => fn());
542
+ }
543
+ catch (err) {
544
+ if (err instanceof Error)
545
+ this.capture(trigger, err, ctx);
546
+ throw err;
547
+ }
548
+ finally {
549
+ completeContext(ctx);
550
+ }
551
+ }
552
+ // Record a data-footprint entry from ANY data layer (knex, raw SQL, an
553
+ // in-house DAO): one call per query site is what makes an error
554
+ // REPRODUCIBLE rather than just visible. `model` maps to a table via the
555
+ // tenant's naming strategy, exactly like a Prisma model name. Silent
556
+ // no-op outside a capture context.
557
+ recordFootprint(query) {
558
+ contextStorage.getStore()?.footprint.push(query);
559
+ }
123
560
  patchOutbound() {
124
561
  const sdk = this;
125
562
  const allowHosts = this.outboundOpts?.allowHosts;
@@ -135,10 +572,35 @@ export class Reprova {
135
572
  const originalFetch = globalThis.fetch;
136
573
  if (typeof originalFetch === 'function') {
137
574
  globalThis.fetch = async function patchedFetch(input, init) {
138
- const res = await originalFetch(input, init);
575
+ // Parse the URL before the fetch so the failure path below can name
576
+ // the destination even when the call never connects.
577
+ const url = typeof input === 'string' ? new URL(input) : input instanceof URL ? input : new URL(input.url);
578
+ const started = performance.now();
579
+ let res;
580
+ try {
581
+ res = await originalFetch(input, init);
582
+ }
583
+ catch (err) {
584
+ // A failed call (timeout, DNS, refused connection) is often THE
585
+ // cause of the error being captured — record it, then re-throw so
586
+ // application behavior is untouched.
587
+ const ctx = contextStorage.getStore();
588
+ if (ctx && shouldRecord(url.host)) {
589
+ const name = err?.name;
590
+ ctx.outboundCalls.push({
591
+ host: url.host,
592
+ method: (init?.method ?? 'GET').toUpperCase(),
593
+ path: url.pathname + url.search,
594
+ status: 0,
595
+ duration_ms: Math.round(performance.now() - started),
596
+ outcome: name === 'TimeoutError' || name === 'AbortError' ? 'timeout' : 'network_error',
597
+ recorded_for_replay: true,
598
+ });
599
+ }
600
+ throw err;
601
+ }
139
602
  const ctx = contextStorage.getStore();
140
603
  if (ctx) {
141
- const url = typeof input === 'string' ? new URL(input) : input instanceof URL ? input : new URL(input.url);
142
604
  const host = url.host;
143
605
  if (shouldRecord(host)) {
144
606
  const ct = res.headers.get('content-type') ?? '';
@@ -157,6 +619,8 @@ export class Reprova {
157
619
  path: url.pathname + url.search,
158
620
  status: res.status,
159
621
  response_body: responseBody,
622
+ duration_ms: Math.round(performance.now() - started),
623
+ outcome: 'success',
160
624
  recorded_for_replay: true,
161
625
  });
162
626
  }
@@ -172,6 +636,8 @@ export class Reprova {
172
636
  }
173
637
  // Auto-setup http_5xx hook for Express responses.
174
638
  export function wrapResponse(res, sdk) {
639
+ if (typeof res.json !== 'function')
640
+ return; // non-standard res (tests, mocks)
175
641
  const originalJson = res.json.bind(res);
176
642
  res.json = function (body) {
177
643
  if (res.statusCode >= 500) {
package/dist/sdk.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../src/sdk.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,OAAO,EAAE,cAAc,EAA4C,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAA4C,MAAM,WAAW,CAAC;AAyBhG,IAAI,QAAQ,GAAmB,IAAI,CAAC;AAEpC,0EAA0E;AAC1E,8EAA8E;AAC9E,2EAA2E;AAC3E,uEAAuE;AACvE,sEAAsE;AACtE,MAAM,aAAa,GAAG,MAAM,CAAC,sBAAsB,CAAC,CAAC;AACrD,8EAA8E;AAC9E,MAAM,WAAW,GAAG,IAAI,OAAO,EAAU,CAAC;AAC1C,oEAAoE;AACpE,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAAU,CAAC;AAMjD,4EAA4E;AAC5E,0EAA0E;AAC1E,sEAAsE;AACtE,0EAA0E;AAC1E,oEAAoE;AACpE,uEAAuE;AACvE,wEAAwE;AACxE,kEAAkE;AAClE,SAAS,gBAAgB,CAAC,GAAuE;IAC/F,OAAO,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC;AAC9B,CAAC;AAED,4EAA4E;AAC5E,2EAA2E;AAC3E,4EAA4E;AAC5E,2EAA2E;AAC3E,6EAA6E;AAC7E,OAAO;AACP,SAAS,sBAAsB,CAAC,GAAmB;IACjD,MAAM,GAAG,GAAG,GAAG,CAAC,UAA4G,CAAC;IAC7H,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC3B,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC;IAClC,CAAC;AACH,CAAC;AAED,yEAAyE;AACzE,0EAA0E;AAC1E,yEAAyE;AACzE,2EAA2E;AAC3E,yEAAyE;AACzE,qEAAqE;AACrE,IAAI,gBAAgB,GAAG,KAAK,CAAC;AAE7B,SAAS,qBAAqB;IAC5B,IAAI,gBAAgB;QAAE,OAAO;IAC7B,gBAAgB,GAAG,IAAI,CAAC;IACxB,0EAA0E;IAC1E,yEAAyE;IACzE,qDAAqD;IACrD,KAAK,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACpE,MAAM,YAAY,GAAG,KAAK,CAAC,IAA0D,CAAC;QACtF,KAAK,CAAC,IAAI,GAAG,UAAyB,KAAsB,EAAE,GAAG,IAAe;YAC9E,MAAM,GAAG,GAAG,QAAQ,CAAC;YACrB,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;gBAChD,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;YACpD,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAyB,CAAC;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAwB,CAAC;YAC3C,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;YACrC,eAAe,CAAC,GAAG,CAAC,CAAC;YACrB,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;gBACpB,kEAAkE;gBAClE,mEAAmE;gBACnE,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;oBAC3C,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC9E,CAAC;gBACD,eAAe,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC;gBACH,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACnF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,8DAA8D;gBAC9D,mEAAmE;gBACnE,+DAA+D;gBAC/D,2CAA2C;gBAC3C,IAAI,GAAG,YAAY,KAAK;oBAAE,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBACvE,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAsB,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAyB;IACpD,IAAI,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;IAC1B,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC,QAAQ,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IACD,MAAM,OAAO,GAAI,GAAG,CAAC,OAAO,CAAC,aAAa,CAAwB,IAAI,eAAe,EAAE,CAAC;IACxF,OAAO;QACL,OAAO;QACP,UAAU,EAAE,IAAI,IAAI,EAAE;QACtB,OAAO,EAAE;YACP,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,KAAK;YAC3B,IAAI;YACJ,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,OAAwD,CAAC;YACrF,IAAI,EAAE,EAAE,EAAE,qEAAqE;SAChF;QACD,SAAS,EAAE,EAAE;QACb,aAAa,EAAE,EAAE;QACjB,UAAU,EAAE,GAAG;KAChB,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,0EAA0E;AAC1E,sDAAsD;AACtD,MAAM,gBAAgB,GAAG,IAAI,OAAO,EAAkB,CAAC;AAEvD,yEAAyE;AACzE,0EAA0E;AAC1E,6EAA6E;AAC7E,qEAAqE;AACrE,4EAA4E;AAC5E,4EAA4E;AAC5E,0EAA0E;AAC1E,2CAA2C;AAC3C,SAAS,oBAAoB,CAAC,GAAW;IACvC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3C,IAAI,CAAC,QAAQ;QAAE,OAAO;IACtB,MAAM,KAAK,GAAI,GAA0C,CAAC,OAAO,EAAE,KAAK,CAAC;IACzE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACzC,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAE,OAAO;IACrB,yEAAyE;IACzE,sEAAsE;IACtE,qEAAqE;IACrE,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAI,KAAK,CAAC,CAAC,CAA0B,CAAC,MAAM,CAAC;QACzD,IAAI,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;YAAE,YAAY,GAAG,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,YAAY,KAAK,CAAC,CAAC;QAAE,OAAO;IAChC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnB,yEAAyE;IACzE,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,sEAAsE;AACtE,6EAA6E;AAC7E,6EAA6E;AAC7E,2EAA2E;AAC3E,2EAA2E;AAC3E,6EAA6E;AAC7E,mDAAmD;AACnD,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,mBAAmB,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,gFAAgF;AAChF,6EAA6E;AAC7E,6EAA6E;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,uEAAuE;AACvE,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB;IAChC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,GAAG,CAAC;IAClD,OAAO,CAAC,GAAU,EAAE,IAAa,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC5E,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE;gBACL,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO;gBAClD,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC;aACvB;SACF,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACtC,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO;IACjC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,2EAA2E;IAC3E,uEAAuE;IACvE,8CAA8C;IAC9C,MAAM,MAAM,GAAI,GAA0C,CAAC,OAAO,CAAC;IACnE,MAAM,UAAU,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU;QAAE,OAAO;IACxB,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,UAAU,CAAwC,CAAC;IACvF,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,cAAc,KAAK,UAAU;QAAE,OAAO;IACjE,IAAI,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO;IAC1C,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAE9B,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAkE,CAAC;IAC1F,KAAK,CAAC,cAAc,GAAG,SAAS,cAAc,CAAkB,GAAY,EAAE,GAAY,EAAE,IAAa;QACvG,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QACvB,0EAA0E;QAC1E,qEAAqE;QACrE,6DAA6D;QAC7D,IAAI,OAAO,EAAE,KAAK,UAAU,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,CAAC;YACxE,MAAM,KAAK,GAAG,EAAqC,CAAC;YACpD,MAAM,OAAO,GAAG,UAAU,EAAW,EAAE,EAAW,EAAE,EAA2B;gBAC7E,MAAM,GAAG,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC9B,IAAI,GAAG,IAAI,OAAQ,GAA0B,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAClE,gEAAgE;oBAChE,sDAAsD;oBACrD,GAA4B,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,EAAE,CAC7D,EAAE,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC,CACvE,CAAC;gBACJ,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC,CAAC;YACF,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;QACxB,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,OAAO;IAQW;IAPZ,SAAS,CAAiB;IAClC,OAAO,CAAS;IAChB,UAAU,GAAG,OAAO,CAAC;IACrB,QAAQ,CAAU;IACnB,WAAW,GAAG,SAAS,CAAC;IACf,YAAY,CAAmC;IAEhE,YAA6B,IAAoB;QAApB,SAAI,GAAJ,IAAI,CAAgB;QAC/C,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,qEAAqE;YACrE,sDAAsD;YACtD,IAAI,CAAC,SAAS,GAAG,IAAI,cAAc,CAAC,EAAE,QAAQ,EAAE,mCAAmC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QACrG,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAI,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;YAC5D,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,YAAY,CAAC;YAC1D,IAAI,CAAC,SAAS,GAAG,IAAI,cAAc,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,IAAoB;QAC9B,QAAQ,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACvB,QAAQ,CAAC,aAAa,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,cAAc,KAAK,KAAK;gBAAE,qBAAqB,EAAE,CAAC;YAC3D,IAAI,IAAI,CAAC,eAAe,KAAK,KAAK;gBAAE,QAAQ,CAAC,qBAAqB,EAAE,CAAC;QACvE,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,WAAW,KAAqB,OAAO,QAAQ,CAAC,CAAC,CAAC;IAEzD,cAAc,CAAC,EAAU,IAAU,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC,CAAC;IAE3D,yEAAyE;IACzE,wEAAwE;IACxE,oEAAoE;IACpE,EAAE;IACF,uEAAuE;IACvE,0EAA0E;IAC1E,sEAAsE;IACtE,EAAE;IACF,qEAAqE;IACrE,mEAAmE;IACnE,uEAAuE;IACvE,KAAK,CAAC,gBAAgB,CACpB,MAAe,EACf,IAAoD;QAEpD,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE1B,MAAM,CAAC,GAAG,MAGT,CAAC;QAEF,yEAAyE;QACzE,wEAAwE;QACxE,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,EAAE,IAAmD,CAAC,CAAC;QAC7F,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAElC,yEAAyE;QACzE,2EAA2E;QAC3E,oEAAoE;QACpE,wEAAwE;QACxE,yEAAyE;QACzE,wEAAwE;QACxE,mDAAmD;QACnD,IAAI,IAAI,EAAE,eAAe,KAAK,KAAK,EAAE,CAAC;YACpC,IAAI,IAAI,GAAiC,EAAE,CAAC;YAC5C,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,CAAC,CAAC,SAAS,CAA8B;;SAErD,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC;oBACH,IAAI,GAAG,MAAM,CAAC,CAAC,SAAS,CAA8B;;WAErD,CAAC;gBACJ,CAAC;gBAAC,MAAM,CAAC;oBACP,+BAA+B;gBACjC,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;gBAC5B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,uEAAuE;IACvE,sEAAsE;IACtE,qEAAqE;IACrE,oEAAoE;IACpE,yDAAyD;IACzD,YAAY,CAAC,GAAY;QACvB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAI,GAAqD,CAAC,OAAO,CAAC;QAC9E,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAC;QAC5B,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,kEAAkE;YAClE,oEAAoE;YACpE,2CAA2C;YAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;YAC1C,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,OAAO,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAI,KAAK,CAAC,QAAQ,CAAuB,CAAC,IAAI,CAAC;gBACzD,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;oBAC/C,QAAQ,EAAE,CAAC;gBACb,CAAC;qBAAM,CAAC;oBACN,MAAM;gBACR,CAAC;YACH,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAClC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC7B,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,gBAAgB,CAAC,GAAG,CAAC,GAAwB,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,0EAA0E;IAC1E,uEAAuE;IACvE,cAAc;QACZ,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;YACzD,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;gBACZ,mBAAmB,CAAC,GAAG,CAAC,GAAwB,CAAC,CAAC;gBAClD,oBAAoB,CAAC,GAAG,CAAC,GAAwB,CAAC,CAAC;YACrD,CAAC;YACD,yDAAyD;YACzD,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAAE,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC5C,oEAAoE;YACpE,gEAAgE;YAChE,kEAAkE;YAClE,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC3C,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,KAAM,GAAe,EAAE,CAAC;gBACzD,IAAI,EAAE,CAAC;gBACP,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAI,GAAG,CAAC,OAAO,CAAC,aAAa,CAAwB,IAAI,eAAe,EAAE,CAAC;YACxF,MAAM,GAAG,GAAmB;gBAC1B,OAAO;gBACP,UAAU,EAAE,IAAI,IAAI,EAAE;gBACtB,OAAO,EAAE;oBACP,MAAM,EAAE,GAAG,CAAC,MAAM;oBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC,OAAwD,CAAC;oBACrF,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;oBAC9E,UAAU,EAAE,gBAAgB,CAAC,GAAoF,CAAC;iBACnH;gBACD,SAAS,EAAE,EAAE;gBACb,aAAa,EAAE,EAAE;gBACjB,UAAU,EAAE,GAAG;aAChB,CAAC;YACF,kEAAkE;YAClE,gEAAgE;YAChE,eAAe,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YACxC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACvB,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACtB,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC;IACJ,CAAC;IAED,0DAA0D;IAC1D,YAAY;QACV,OAAO,CAAC,GAAU,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;YACrE,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,GAAG,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;gBAChC,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,CAAC,CAAC;IACJ,CAAC;IAED,kBAAkB;IAClB,YAAY,CAAC,GAAU,EAAE,IAA2B;QAClD,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,IAAI,gBAAgB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5D,CAAC;IAED,sEAAsE;IACtE,mEAAmE;IACnE,uEAAuE;IACvE,8DAA8D;IAC9D,0EAA0E;IAC1E,0CAA0C;IAC1C,qDAAqD;IACrD,mBAAmB;QACjB,OAAO,yBAAyB,CAAC;YAC/B,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACf,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;gBACtC,IAAI,CAAC,GAAG,EAAE,QAAQ;oBAAE,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YACpE,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,2EAA2E;IAC3E,yEAAyE;IACzE,uEAAuE;IACvE,gDAAgD;IAChD,qDAAqD;IACrD,qFAAqF;IACrF,8EAA8E;IAC9E,uEAAuE;IACvE,KAAK,CAAC,SAAS,CAAC,GAAgB,EAAE,IAA2C;QAC3E,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACjD,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,0DAA0D;IAC1D,cAAc,CAAC,GAAiB,EAAE,UAAkB,EAAE,YAAoB;QACxE,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;QACtC,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,4EAA4E;QAC5E,+EAA+E;QAC/E,kFAAkF;QAClF,IAAI,GAAG,CAAC,QAAQ;YAAE,OAAO;QACzB,MAAM,YAAY,GAAG,GAAG,IAAI,IAAI,KAAK,CAAC,QAAQ,UAAU,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,EAAE,GAAG,EAAE;YAC1C,QAAQ,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE;SACzE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CACL,OAAe,EACf,GAAU,EACV,GAA+B,EAC/B,KAAuD;QAEvD,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;YACpB,sBAAsB,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;QACD,MAAM,OAAO,GAAmB;YAC9B,OAAO,EAAE,OAAoC;YAC7C,QAAQ,EAAE,GAAG,EAAE,OAAO,IAAI,eAAe,EAAE;YAC3C,SAAS,EAAE,CAAC,GAAG,EAAE,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;YACxD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,IAAI,CAAC,WAAW;YAC9B,WAAW,EAAE,IAAI,CAAC,UAAU;YAC5B,KAAK,EAAE;gBACL,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO;gBAClD,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC;aACvB;YACD,OAAO,EAAE,GAAG;gBACV,CAAC,CAAC;oBACE,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM;oBAC1B,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;oBACtB,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC;oBAC1C,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI;oBACtB,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU;iBACpC;gBACH,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;YACnD,QAAQ,EAAE,KAAK,EAAE,QAAQ;YACzB,cAAc,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,IAAI,EAAE,EAAE;YACjD,cAAc,EAAE,GAAG,EAAE,aAAa,IAAI,EAAE;SACzC,CAAC;QAEF,sEAAsE;QACtE,oEAAoE;QACpE,0DAA0D;QAC1D,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,mBAAmB,GAAG,MAAM,CAAC;QACvC,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,yEAAyE;IACzE,2EAA2E;IAC3E,yEAAyE;IACzE,0EAA0E;IAC1E,qCAAqC;IACrC,qBAAqB;QACnB,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAU,EAAE,EAAE;YAC7C,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,GAAG,EAAE,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAClE,2BAA2B;YAC3B,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAe,EAAE,EAAE;YACnD,MAAM,GAAG,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACzE,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,GAAG,EAAE,QAAQ;gBAAE,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,wEAAwE;IACxE,wEAAwE;IACxE,uEAAuE;IACvE,sDAAsD;IACtD,KAAK,CAAC,cAAc,CAClB,IAAwG,EACxG,EAAwB;QAExB,OAAO,IAAI,CAAC,YAAY,CAAC,qBAAqB,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,wEAAwE;IACxE,uEAAuE;IACvE,KAAK,CAAC,MAAM,CAAI,IAAY,EAAE,EAAwB;QACpD,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACxD,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,OAAe,EACf,IAAwG,EACxG,EAAwB;QAExB,MAAM,GAAG,GAAmB;YAC1B,OAAO,EAAE,eAAe,EAAE;YAC1B,UAAU,EAAE,IAAI,IAAI,EAAE;YACtB,OAAO,EAAE;gBACP,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;gBAC5B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,MAAM;gBACtC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,EAAE;gBAC3B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;aACtB;YACD,SAAS,EAAE,EAAE;YACb,aAAa,EAAE,EAAE;SAClB,CAAC;QACF,eAAe,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,MAAM,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,KAAK;gBAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAC1D,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,eAAe,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,gEAAgE;IAChE,yEAAyE;IACzE,qEAAqE;IACrE,mCAAmC;IACnC,eAAe,CAAC,KAAqB;QACnC,cAAc,CAAC,QAAQ,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAEO,aAAa;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC;QACjB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC;QAE/C,SAAS,YAAY,CAAC,IAAY;YAChC,IAAI,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YACzD,IAAI,UAAU,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YACxE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,sBAAsB;QACtB,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;QACvC,IAAI,OAAO,aAAa,KAAK,UAAU,EAAE,CAAC;YACxC,UAAU,CAAC,KAAK,GAAG,KAAK,UAAU,YAAY,CAAC,KAAwB,EAAE,IAAkB;gBACzF,oEAAoE;gBACpE,qDAAqD;gBACrD,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,CAAE,KAAyB,CAAC,GAAG,CAAC,CAAC;gBAChI,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;gBAClC,IAAI,GAAwB,CAAC;gBAC7B,IAAI,CAAC;oBACH,GAAG,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBACzC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,gEAAgE;oBAChE,kEAAkE;oBAClE,qCAAqC;oBACrC,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;oBACtC,IAAI,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;wBAClC,MAAM,IAAI,GAAI,GAAyB,EAAE,IAAI,CAAC;wBAC9C,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;4BACrB,IAAI,EAAE,GAAG,CAAC,IAAI;4BACd,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE;4BAC7C,IAAI,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM;4BAC/B,MAAM,EAAE,CAAC;4BACT,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;4BACpD,OAAO,EAAE,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe;4BACvF,mBAAmB,EAAE,IAAI;yBAC1B,CAAC,CAAC;oBACL,CAAC;oBACD,MAAM,GAAG,CAAC;gBACZ,CAAC;gBACD,MAAM,GAAG,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC;gBACtC,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;oBACtB,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;wBACvB,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;wBACjD,IAAI,YAAgC,CAAC;wBACrC,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;4BAC/C,IAAI,CAAC;gCACH,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;gCAC1B,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;gCAChC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;4BAC1C,CAAC;4BAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;wBAC1B,CAAC;wBACD,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC;4BACrB,IAAI;4BACJ,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,IAAI,KAAK,CAAC,CAAC,WAAW,EAAE;4BAC7C,IAAI,EAAE,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM;4BAC/B,MAAM,EAAE,GAAG,CAAC,MAAM;4BAClB,aAAa,EAAE,YAAY;4BAC3B,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;4BACpD,OAAO,EAAE,SAAS;4BAClB,mBAAmB,EAAE,IAAI;yBAC1B,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAiB,CAAC;QACpB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACtB,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;CACF;AAED,kDAAkD;AAClD,MAAM,UAAU,YAAY,CAAC,GAAa,EAAE,GAAY;IACtD,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,CAAC,kCAAkC;IAC9E,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,GAAG,CAAC,IAAI,GAAG,UAAU,IAAa;QAChC,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACvE,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface SequelizeAdapterOptions {
2
+ captureWhereShape?: boolean;
3
+ }
4
+ export declare function installSequelizeHooks(sequelize: unknown, opts?: SequelizeAdapterOptions): void;
5
+ //# sourceMappingURL=sequelize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequelize.d.ts","sourceRoot":"","sources":["../src/sequelize.ts"],"names":[],"mappings":"AAgCA,MAAM,WAAW,uBAAuB;IAItC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAyFD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,GAAE,uBAA4B,GAAG,IAAI,CASlG"}