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 +3 -0
- package/package.json +1 -1
- package/src/index.ts +4 -0
- package/tracer/runtime.js +35 -7
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
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
|
|
601
|
-
|
|
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) {
|