repro-nest 0.0.205 → 0.0.207

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/index.js CHANGED
@@ -1327,6 +1327,9 @@ function reproMiddleware(cfg) {
1327
1327
  if (ev.args !== undefined) {
1328
1328
  evt.args = sanitizeTraceArgs(ev.args);
1329
1329
  }
1330
+ if (ev.receiver !== undefined) {
1331
+ evt.receiver = sanitizeTraceValue(ev.receiver);
1332
+ }
1330
1333
  if (ev.returnValue !== undefined) {
1331
1334
  evt.returnValue = sanitizeTraceValue(ev.returnValue);
1332
1335
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "repro-nest",
3
- "version": "0.0.205",
3
+ "version": "0.0.207",
4
4
  "description": "Repro Nest SDK",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/index.ts CHANGED
@@ -210,6 +210,7 @@ type TraceEventRecord = {
210
210
  spanId?: string | number | null;
211
211
  parentSpanId?: string | number | null;
212
212
  args?: any;
213
+ receiver?: any;
213
214
  returnValue?: any;
214
215
  threw?: boolean;
215
216
  error?: any;
@@ -1532,6 +1533,9 @@ export function reproMiddleware(cfg: ReproMiddlewareConfig) {
1532
1533
  if (ev.args !== undefined) {
1533
1534
  evt.args = sanitizeTraceArgs(ev.args);
1534
1535
  }
1536
+ if (ev.receiver !== undefined) {
1537
+ evt.receiver = sanitizeTraceValue(ev.receiver);
1538
+ }
1535
1539
  if (ev.returnValue !== undefined) {
1536
1540
  evt.returnValue = sanitizeTraceValue(ev.returnValue);
1537
1541
  }
package/tracer/runtime.js CHANGED
@@ -132,6 +132,7 @@ const trace = {
132
132
  traceId: ctx.traceId,
133
133
  depth: ctx.depth,
134
134
  args: detail?.args,
135
+ receiver: detail?.receiver,
135
136
  spanId: span.id,
136
137
  parentSpanId: span.parentId
137
138
  });
@@ -159,7 +160,8 @@ const trace = {
159
160
  returnValue: detail?.returnValue,
160
161
  error: detail?.error,
161
162
  threw: detail?.threw === true,
162
- unawaited: detail?.unawaited === true || frameUnawaited
163
+ unawaited: detail?.unawaited === true || frameUnawaited,
164
+ receiver: detail?.receiver
163
165
  };
164
166
 
165
167
  const promiseTaggedUnawaited = !!(baseDetail.returnValue && baseDetail.returnValue[SYM_UNAWAITED]);
@@ -179,6 +181,9 @@ const trace = {
179
181
  unawaited: overrides.hasOwnProperty('unawaited')
180
182
  ? overrides.unawaited
181
183
  : forceUnawaited,
184
+ receiver: overrides.hasOwnProperty('receiver')
185
+ ? overrides.receiver
186
+ : baseDetail.receiver,
182
187
  args: overrides.hasOwnProperty('args')
183
188
  ? overrides.args
184
189
  : baseDetail.args
@@ -199,6 +204,7 @@ const trace = {
199
204
  threw: finalDetail.threw === true,
200
205
  error: finalDetail.error,
201
206
  args: finalDetail.args,
207
+ receiver: finalDetail.receiver,
202
208
  unawaited: finalDetail.unawaited === true
203
209
  });
204
210
  };
@@ -475,6 +481,24 @@ function forkAlsStoreForUnawaited(baseStore) {
475
481
  return cloned;
476
482
  }
477
483
 
484
+ // Only capture receiver/collection snapshots for common array iteration helpers to keep noise low.
485
+ const RECEIVER_METHOD_NAMES = new Set([
486
+ // Array iterators
487
+ 'map', 'forEach', 'filter', 'find', 'findIndex', 'findLast', 'findLastIndex',
488
+ 'some', 'every', 'reduce', 'reduceRight', 'flatMap', 'flat',
489
+ // Set / Map mutators
490
+ 'add', 'delete', 'clear', 'set'
491
+ ]);
492
+
493
+ function shouldCaptureReceiver(label, receiver) {
494
+ if (!label || receiver === null || receiver === undefined) return false;
495
+ const method = String(label).split('.').pop() || '';
496
+ if (!RECEIVER_METHOD_NAMES.has(method)) return false;
497
+ if (Array.isArray(receiver)) return true;
498
+ if (typeof receiver === 'object' && typeof receiver[Symbol.iterator] === 'function') return true;
499
+ return false;
500
+ }
501
+
478
502
  // ========= Generic call-site shim (used by Babel transform) =========
479
503
  // Decides whether to emit a top-level event based on callee origin tags.
480
504
  // No hardcoded library names or file paths.
@@ -596,13 +620,15 @@ if (!global.__repro_call) {
596
620
  ? (label && label.length ? label : fn.name)
597
621
  : '(anonymous)';
598
622
  const sourceFile = fn[SYM_SRC_FILE];
623
+ const receiverForTrace = shouldCaptureReceiver(label, thisArg) ? thisArg : undefined;
599
624
  const meta = {
600
- file: sourceFile || callFile || null,
601
- line: sourceFile ? null : (callLine || null),
625
+ // Prefer callsite file/line so traces point to where the function was invoked.
626
+ file: callFile || sourceFile || null,
627
+ line: callLine ?? null,
602
628
  parentSpanId: forcedParentSpanId
603
629
  };
604
630
 
605
- trace.enter(name, meta, { args });
631
+ trace.enter(name, meta, { args, receiver: receiverForTrace });
606
632
  // After entering, snapshot a clean store that captures the parent + this call’s span,
607
633
  // so callbacks invoked during the callee run are isolated per invocation.
608
634
  const snapshotForArgs = cloneStore(als.getStore());
@@ -617,7 +643,8 @@ if (!global.__repro_call) {
617
643
  const exitDetailBase = {
618
644
  returnValue: out,
619
645
  args,
620
- unawaited: shouldForceExit
646
+ unawaited: shouldForceExit,
647
+ receiver: receiverForTrace
621
648
  };
622
649
 
623
650
  if (shouldForceExit) markPromiseUnawaited(out);
@@ -659,7 +686,8 @@ if (!global.__repro_call) {
659
686
  args,
660
687
  threw,
661
688
  error,
662
- unawaited: shouldForceExit
689
+ unawaited: shouldForceExit,
690
+ receiver: receiverForTrace
663
691
  };
664
692
  runExit(detail);
665
693
  return value;
@@ -679,7 +707,7 @@ if (!global.__repro_call) {
679
707
  runExit(exitDetailBase);
680
708
  return out;
681
709
  } catch (e) {
682
- trace.exit({ fn: name, file: meta.file, line: meta.line }, { threw: true, error: e, args });
710
+ trace.exit({ fn: name, file: meta.file, line: meta.line }, { threw: true, error: e, args, receiver: receiverForTrace });
683
711
  throw e;
684
712
  } finally {
685
713
  if (pendingMarker) {