@sentry/effect 10.53.1 → 10.55.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/build/cjs/client/index.js +0 -29
- package/build/cjs/client/index.js.map +1 -1
- package/build/cjs/client/sdk.js +2 -10
- package/build/cjs/client/sdk.js.map +1 -1
- package/build/cjs/logger.js +14 -23
- package/build/cjs/logger.js.map +1 -1
- package/build/cjs/metrics.js +29 -69
- package/build/cjs/metrics.js.map +1 -1
- package/build/cjs/server/index.js +0 -29
- package/build/cjs/server/index.js.map +1 -1
- package/build/cjs/server/sdk.js +2 -10
- package/build/cjs/server/sdk.js.map +1 -1
- package/build/cjs/tracer.js +51 -115
- package/build/cjs/tracer.js.map +1 -1
- package/build/esm/client/index.js +0 -29
- package/build/esm/client/index.js.map +1 -1
- package/build/esm/client/sdk.js +2 -10
- package/build/esm/client/sdk.js.map +1 -1
- package/build/esm/logger.js +14 -23
- package/build/esm/logger.js.map +1 -1
- package/build/esm/metrics.js +29 -69
- package/build/esm/metrics.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/server/index.js +0 -29
- package/build/esm/server/index.js.map +1 -1
- package/build/esm/server/sdk.js +2 -10
- package/build/esm/server/sdk.js.map +1 -1
- package/build/esm/tracer.js +51 -115
- package/build/esm/tracer.js.map +1 -1
- package/package.json +4 -4
package/build/cjs/tracer.js
CHANGED
|
@@ -6,170 +6,121 @@ const Option = require('effect/Option');
|
|
|
6
6
|
const EffectTracer = require('effect/Tracer');
|
|
7
7
|
|
|
8
8
|
function deriveOrigin(name) {
|
|
9
|
-
if (name.startsWith(
|
|
10
|
-
return
|
|
9
|
+
if (name.startsWith("http.server") || name.startsWith("http.client")) {
|
|
10
|
+
return "auto.http.effect";
|
|
11
11
|
}
|
|
12
|
-
|
|
13
|
-
return 'auto.function.effect';
|
|
12
|
+
return "auto.function.effect";
|
|
14
13
|
}
|
|
15
|
-
|
|
16
|
-
const SENTRY_SPAN_SYMBOL = Symbol.for('@sentry/effect.SentrySpan');
|
|
17
|
-
|
|
14
|
+
const SENTRY_SPAN_SYMBOL = /* @__PURE__ */ Symbol.for("@sentry/effect.SentrySpan");
|
|
18
15
|
function nanosToHrTime(nanos) {
|
|
19
|
-
const seconds = Number(nanos / BigInt(
|
|
20
|
-
const remainingNanos = Number(nanos % BigInt(
|
|
16
|
+
const seconds = Number(nanos / BigInt(1e9));
|
|
17
|
+
const remainingNanos = Number(nanos % BigInt(1e9));
|
|
21
18
|
return [seconds, remainingNanos];
|
|
22
19
|
}
|
|
23
|
-
|
|
24
20
|
function isSentrySpan(span) {
|
|
25
21
|
return SENTRY_SPAN_SYMBOL in span;
|
|
26
22
|
}
|
|
27
|
-
|
|
28
23
|
function getErrorMessage(exit) {
|
|
29
24
|
if (!Exit.isFailure(exit)) {
|
|
30
|
-
return
|
|
25
|
+
return void 0;
|
|
31
26
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
// Effect v4: cause.reasons is an array of Reason objects
|
|
36
|
-
if (
|
|
37
|
-
cause &&
|
|
38
|
-
typeof cause === 'object' &&
|
|
39
|
-
'reasons' in cause &&
|
|
40
|
-
Array.isArray((cause ).reasons)
|
|
41
|
-
) {
|
|
42
|
-
const reasons = (cause ).reasons;
|
|
27
|
+
const cause = exit.cause;
|
|
28
|
+
if (cause && typeof cause === "object" && "reasons" in cause && Array.isArray(cause.reasons)) {
|
|
29
|
+
const reasons = cause.reasons;
|
|
43
30
|
for (const reason of reasons) {
|
|
44
|
-
if (reason._tag ===
|
|
31
|
+
if (reason._tag === "Fail" && reason.error !== void 0) {
|
|
45
32
|
return String(reason.error);
|
|
46
33
|
}
|
|
47
|
-
if (reason._tag ===
|
|
34
|
+
if (reason._tag === "Die" && reason.defect !== void 0) {
|
|
48
35
|
return String(reason.defect);
|
|
49
36
|
}
|
|
50
37
|
}
|
|
51
|
-
return
|
|
38
|
+
return "internal_error";
|
|
52
39
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const v3Cause = cause ;
|
|
57
|
-
if (v3Cause._tag === 'Fail') {
|
|
40
|
+
if (cause && typeof cause === "object" && "_tag" in cause) {
|
|
41
|
+
const v3Cause = cause;
|
|
42
|
+
if (v3Cause._tag === "Fail") {
|
|
58
43
|
return String(v3Cause.error);
|
|
59
44
|
}
|
|
60
|
-
if (v3Cause._tag ===
|
|
45
|
+
if (v3Cause._tag === "Die") {
|
|
61
46
|
return String(v3Cause.defect);
|
|
62
47
|
}
|
|
63
48
|
}
|
|
64
|
-
|
|
65
|
-
return 'internal_error';
|
|
49
|
+
return "internal_error";
|
|
66
50
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
startTime,
|
|
76
|
-
kind,
|
|
77
|
-
existingSpan,
|
|
78
|
-
) {this.name = name;this.context = context;this.kind = kind;
|
|
79
|
-
this[SENTRY_SPAN_SYMBOL] = true ;
|
|
80
|
-
this._tag = 'Span' ;
|
|
81
|
-
this.attributes = new Map();
|
|
51
|
+
class SentrySpanWrapper {
|
|
52
|
+
constructor(name, parent, context, links, startTime, kind, existingSpan) {
|
|
53
|
+
this.name = name;
|
|
54
|
+
this.context = context;
|
|
55
|
+
this.kind = kind;
|
|
56
|
+
this[SENTRY_SPAN_SYMBOL] = true;
|
|
57
|
+
this._tag = "Span";
|
|
58
|
+
this.attributes = /* @__PURE__ */ new Map();
|
|
82
59
|
this.parent = parent;
|
|
83
60
|
this.links = [...links];
|
|
84
61
|
this.sentrySpan = existingSpan;
|
|
85
62
|
this.annotations = context;
|
|
86
|
-
|
|
87
63
|
const spanContext = this.sentrySpan.spanContext();
|
|
88
64
|
this.spanId = spanContext.spanId;
|
|
89
65
|
this.traceId = spanContext.traceId;
|
|
90
66
|
this.sampled = this.sentrySpan.isRecording();
|
|
91
67
|
this.status = {
|
|
92
|
-
_tag:
|
|
93
|
-
startTime
|
|
68
|
+
_tag: "Started",
|
|
69
|
+
startTime
|
|
94
70
|
};
|
|
95
71
|
}
|
|
96
|
-
|
|
97
|
-
attribute(key, value) {
|
|
72
|
+
attribute(key, value) {
|
|
98
73
|
if (!this.sentrySpan.isRecording()) {
|
|
99
74
|
return;
|
|
100
75
|
}
|
|
101
|
-
|
|
102
|
-
this.sentrySpan.setAttribute(key, value );
|
|
76
|
+
this.sentrySpan.setAttribute(key, value);
|
|
103
77
|
this.attributes.set(key, value);
|
|
104
78
|
}
|
|
105
|
-
|
|
106
|
-
addLinks(links) {
|
|
79
|
+
addLinks(links) {
|
|
107
80
|
this.links.push(...links);
|
|
108
81
|
}
|
|
109
|
-
|
|
110
|
-
end(endTime, exit) {
|
|
82
|
+
end(endTime, exit) {
|
|
111
83
|
this.status = {
|
|
112
|
-
_tag:
|
|
84
|
+
_tag: "Ended",
|
|
113
85
|
endTime,
|
|
114
86
|
exit,
|
|
115
|
-
startTime: this.status.startTime
|
|
87
|
+
startTime: this.status.startTime
|
|
116
88
|
};
|
|
117
|
-
|
|
118
89
|
if (!this.sentrySpan.isRecording()) {
|
|
119
90
|
return;
|
|
120
91
|
}
|
|
121
|
-
|
|
122
92
|
if (Exit.isFailure(exit)) {
|
|
123
|
-
const message = getErrorMessage(exit) ??
|
|
93
|
+
const message = getErrorMessage(exit) ?? "internal_error";
|
|
124
94
|
this.sentrySpan.setStatus({ code: 2, message });
|
|
125
95
|
} else {
|
|
126
96
|
this.sentrySpan.setStatus({ code: 1 });
|
|
127
97
|
}
|
|
128
|
-
|
|
129
98
|
this.sentrySpan.end(nanosToHrTime(endTime));
|
|
130
99
|
}
|
|
131
|
-
|
|
132
|
-
event(name, startTime, attributes) {
|
|
100
|
+
event(name, startTime, attributes) {
|
|
133
101
|
if (!this.sentrySpan.isRecording()) {
|
|
134
102
|
return;
|
|
135
103
|
}
|
|
136
|
-
|
|
137
|
-
this.sentrySpan.addEvent(name, attributes , nanosToHrTime(startTime));
|
|
104
|
+
this.sentrySpan.addEvent(name, attributes, nanosToHrTime(startTime));
|
|
138
105
|
}
|
|
139
106
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
name,
|
|
143
|
-
parent,
|
|
144
|
-
context,
|
|
145
|
-
links,
|
|
146
|
-
startTime,
|
|
147
|
-
kind,
|
|
148
|
-
) {
|
|
149
|
-
const parentSentrySpan =
|
|
150
|
-
Option.isSome(parent) && isSentrySpan(parent.value) ? parent.value.sentrySpan : (core.getActiveSpan() ?? null);
|
|
151
|
-
|
|
107
|
+
function createSentrySpan(name, parent, context, links, startTime, kind) {
|
|
108
|
+
const parentSentrySpan = Option.isSome(parent) && isSentrySpan(parent.value) ? parent.value.sentrySpan : core.getActiveSpan() ?? null;
|
|
152
109
|
const newSpan = core.startInactiveSpan({
|
|
153
110
|
name,
|
|
154
111
|
startTime: nanosToHrTime(startTime),
|
|
155
112
|
attributes: {
|
|
156
|
-
[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: deriveOrigin(name)
|
|
113
|
+
[core.SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: deriveOrigin(name)
|
|
157
114
|
},
|
|
158
|
-
...
|
|
115
|
+
...parentSentrySpan ? { parentSpan: parentSentrySpan } : {}
|
|
159
116
|
});
|
|
160
|
-
|
|
161
117
|
return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan);
|
|
162
118
|
}
|
|
163
|
-
|
|
164
|
-
// Check if we're running Effect v4 by checking the Exit/Cause structure
|
|
165
|
-
// In v4, causes have a 'reasons' array
|
|
166
|
-
// In v3, causes have '_tag' directly on the cause object
|
|
167
119
|
const isEffectV4 = (() => {
|
|
168
120
|
try {
|
|
169
|
-
const testExit = Exit.fail(
|
|
121
|
+
const testExit = Exit.fail("test");
|
|
170
122
|
const cause = testExit.cause;
|
|
171
|
-
|
|
172
|
-
if (cause && typeof cause === 'object' && 'reasons' in cause) {
|
|
123
|
+
if (cause && typeof cause === "object" && "reasons" in cause) {
|
|
173
124
|
return true;
|
|
174
125
|
}
|
|
175
126
|
return false;
|
|
@@ -177,33 +128,22 @@ const isEffectV4 = (() => {
|
|
|
177
128
|
return false;
|
|
178
129
|
}
|
|
179
130
|
})();
|
|
180
|
-
|
|
181
131
|
const makeSentryTracerV3 = () => {
|
|
182
|
-
// Effect v3 API: span(name, parent, context, links, startTime, kind)
|
|
183
132
|
return EffectTracer.make({
|
|
184
|
-
span(
|
|
185
|
-
name,
|
|
186
|
-
parent,
|
|
187
|
-
context,
|
|
188
|
-
links,
|
|
189
|
-
startTime,
|
|
190
|
-
kind,
|
|
191
|
-
) {
|
|
133
|
+
span(name, parent, context, links, startTime, kind) {
|
|
192
134
|
return createSentrySpan(name, parent, context, links, startTime, kind);
|
|
193
135
|
},
|
|
194
136
|
context(execution, fiber) {
|
|
195
137
|
const currentSpan = fiber.currentSpan;
|
|
196
|
-
if (currentSpan ===
|
|
138
|
+
if (currentSpan === void 0 || !isSentrySpan(currentSpan)) {
|
|
197
139
|
return execution();
|
|
198
140
|
}
|
|
199
141
|
return core.withActiveSpan(currentSpan.sentrySpan, execution);
|
|
200
|
-
}
|
|
201
|
-
}
|
|
142
|
+
}
|
|
143
|
+
});
|
|
202
144
|
};
|
|
203
|
-
|
|
204
145
|
const makeSentryTracerV4 = () => {
|
|
205
|
-
const EFFECT_EVALUATE =
|
|
206
|
-
|
|
146
|
+
const EFFECT_EVALUATE = "~effect/Effect/evaluate";
|
|
207
147
|
return EffectTracer.make({
|
|
208
148
|
span(options) {
|
|
209
149
|
return createSentrySpan(
|
|
@@ -212,22 +152,18 @@ const makeSentryTracerV4 = () => {
|
|
|
212
152
|
options.annotations,
|
|
213
153
|
options.links,
|
|
214
154
|
options.startTime,
|
|
215
|
-
options.kind
|
|
155
|
+
options.kind
|
|
216
156
|
);
|
|
217
157
|
},
|
|
218
158
|
context(primitive, fiber) {
|
|
219
159
|
const currentSpan = fiber.currentSpan;
|
|
220
|
-
if (currentSpan ===
|
|
160
|
+
if (currentSpan === void 0 || !isSentrySpan(currentSpan)) {
|
|
221
161
|
return primitive[EFFECT_EVALUATE](fiber);
|
|
222
162
|
}
|
|
223
163
|
return core.withActiveSpan(currentSpan.sentrySpan, () => primitive[EFFECT_EVALUATE](fiber));
|
|
224
|
-
}
|
|
164
|
+
}
|
|
225
165
|
});
|
|
226
166
|
};
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Effect Layer that sets up the Sentry tracer for Effect spans.
|
|
230
|
-
*/
|
|
231
167
|
const SentryEffectTracer = isEffectV4 ? makeSentryTracerV4() : makeSentryTracerV3();
|
|
232
168
|
|
|
233
169
|
exports.SentryEffectTracer = SentryEffectTracer;
|
package/build/cjs/tracer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer.js","sources":["../../src/tracer.ts"],"sourcesContent":["import type { Span } from '@sentry/core';\nimport { getActiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startInactiveSpan, withActiveSpan } from '@sentry/core';\nimport type * as Context from 'effect/Context';\nimport * as Exit from 'effect/Exit';\nimport * as Option from 'effect/Option';\nimport * as EffectTracer from 'effect/Tracer';\n\nfunction deriveOrigin(name: string): string {\n if (name.startsWith('http.server') || name.startsWith('http.client')) {\n return 'auto.http.effect';\n }\n\n return 'auto.function.effect';\n}\n\ntype HrTime = [number, number];\n\nconst SENTRY_SPAN_SYMBOL = Symbol.for('@sentry/effect.SentrySpan');\n\nfunction nanosToHrTime(nanos: bigint): HrTime {\n const seconds = Number(nanos / BigInt(1_000_000_000));\n const remainingNanos = Number(nanos % BigInt(1_000_000_000));\n return [seconds, remainingNanos];\n}\n\ninterface SentrySpanLike extends EffectTracer.Span {\n readonly [SENTRY_SPAN_SYMBOL]: true;\n readonly sentrySpan: Span;\n}\n\nfunction isSentrySpan(span: EffectTracer.AnySpan): span is SentrySpanLike {\n return SENTRY_SPAN_SYMBOL in span;\n}\n\nfunction getErrorMessage(exit: Exit.Exit<unknown, unknown>): string | undefined {\n if (!Exit.isFailure(exit)) {\n return undefined;\n }\n\n const cause = exit.cause as unknown;\n\n // Effect v4: cause.reasons is an array of Reason objects\n if (\n cause &&\n typeof cause === 'object' &&\n 'reasons' in cause &&\n Array.isArray((cause as { reasons: unknown }).reasons)\n ) {\n const reasons = (cause as { reasons: Array<{ _tag?: string; error?: unknown; defect?: unknown }> }).reasons;\n for (const reason of reasons) {\n if (reason._tag === 'Fail' && reason.error !== undefined) {\n return String(reason.error);\n }\n if (reason._tag === 'Die' && reason.defect !== undefined) {\n return String(reason.defect);\n }\n }\n return 'internal_error';\n }\n\n // Effect v3: cause has _tag directly\n if (cause && typeof cause === 'object' && '_tag' in cause) {\n const v3Cause = cause as { _tag: string; error?: unknown; defect?: unknown };\n if (v3Cause._tag === 'Fail') {\n return String(v3Cause.error);\n }\n if (v3Cause._tag === 'Die') {\n return String(v3Cause.defect);\n }\n }\n\n return 'internal_error';\n}\n\nclass SentrySpanWrapper implements SentrySpanLike {\n public readonly [SENTRY_SPAN_SYMBOL]: true;\n public readonly _tag: 'Span';\n public readonly spanId: string;\n public readonly traceId: string;\n public readonly attributes: Map<string, unknown>;\n public readonly sampled: boolean;\n public readonly parent: Option.Option<EffectTracer.AnySpan>;\n public readonly links: Array<EffectTracer.SpanLink>;\n public status: EffectTracer.SpanStatus;\n public readonly sentrySpan: Span;\n public readonly annotations: Context.Context<never>;\n\n public constructor(\n public readonly name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n public readonly context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n public readonly kind: EffectTracer.SpanKind,\n existingSpan: Span,\n ) {\n this[SENTRY_SPAN_SYMBOL] = true as const;\n this._tag = 'Span' as const;\n this.attributes = new Map<string, unknown>();\n this.parent = parent;\n this.links = [...links];\n this.sentrySpan = existingSpan;\n this.annotations = context;\n\n const spanContext = this.sentrySpan.spanContext();\n this.spanId = spanContext.spanId;\n this.traceId = spanContext.traceId;\n this.sampled = this.sentrySpan.isRecording();\n this.status = {\n _tag: 'Started',\n startTime,\n };\n }\n\n public attribute(key: string, value: unknown): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.setAttribute(key, value as Parameters<Span['setAttribute']>[1]);\n this.attributes.set(key, value);\n }\n\n public addLinks(links: ReadonlyArray<EffectTracer.SpanLink>): void {\n this.links.push(...links);\n }\n\n public end(endTime: bigint, exit: Exit.Exit<unknown, unknown>): void {\n this.status = {\n _tag: 'Ended',\n endTime,\n exit,\n startTime: this.status.startTime,\n };\n\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n if (Exit.isFailure(exit)) {\n const message = getErrorMessage(exit) ?? 'internal_error';\n this.sentrySpan.setStatus({ code: 2, message });\n } else {\n this.sentrySpan.setStatus({ code: 1 });\n }\n\n this.sentrySpan.end(nanosToHrTime(endTime));\n }\n\n public event(name: string, startTime: bigint, attributes?: Record<string, unknown>): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.addEvent(name, attributes as Parameters<Span['addEvent']>[1], nanosToHrTime(startTime));\n }\n}\n\nfunction createSentrySpan(\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n): SentrySpanLike {\n const parentSentrySpan =\n Option.isSome(parent) && isSentrySpan(parent.value) ? parent.value.sentrySpan : (getActiveSpan() ?? null);\n\n const newSpan = startInactiveSpan({\n name,\n startTime: nanosToHrTime(startTime),\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: deriveOrigin(name),\n },\n ...(parentSentrySpan ? { parentSpan: parentSentrySpan } : {}),\n });\n\n return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan);\n}\n\n// Check if we're running Effect v4 by checking the Exit/Cause structure\n// In v4, causes have a 'reasons' array\n// In v3, causes have '_tag' directly on the cause object\nconst isEffectV4 = (() => {\n try {\n const testExit = Exit.fail('test') as unknown as { cause?: unknown };\n const cause = testExit.cause;\n // v4 causes have 'reasons' array, v3 causes have '_tag' directly\n if (cause && typeof cause === 'object' && 'reasons' in cause) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n})();\n\nconst makeSentryTracerV3 = (): EffectTracer.Tracer => {\n // Effect v3 API: span(name, parent, context, links, startTime, kind)\n return EffectTracer.make({\n span(\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n ) {\n return createSentrySpan(name, parent, context, links, startTime, kind);\n },\n context(execution: () => unknown, fiber: { currentSpan?: EffectTracer.AnySpan }) {\n const currentSpan = fiber.currentSpan;\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return execution();\n }\n return withActiveSpan(currentSpan.sentrySpan, execution);\n },\n } as unknown as EffectTracer.Tracer);\n};\n\nconst makeSentryTracerV4 = (): EffectTracer.Tracer => {\n const EFFECT_EVALUATE = '~effect/Effect/evaluate' as const;\n\n return EffectTracer.make({\n span(options) {\n return createSentrySpan(\n options.name,\n options.parent,\n options.annotations,\n options.links,\n options.startTime,\n options.kind,\n );\n },\n context(primitive, fiber) {\n const currentSpan = fiber.currentSpan;\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return primitive[EFFECT_EVALUATE](fiber);\n }\n return withActiveSpan(currentSpan.sentrySpan, () => primitive[EFFECT_EVALUATE](fiber));\n },\n });\n};\n\n/**\n * Effect Layer that sets up the Sentry tracer for Effect spans.\n */\nexport const SentryEffectTracer = isEffectV4 ? makeSentryTracerV4() : makeSentryTracerV3();\n"],"names":["getActiveSpan","startInactiveSpan","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","withActiveSpan"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tracer.js","sources":["../../src/tracer.ts"],"sourcesContent":["import type { Span } from '@sentry/core';\nimport { getActiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, startInactiveSpan, withActiveSpan } from '@sentry/core';\nimport type * as Context from 'effect/Context';\nimport * as Exit from 'effect/Exit';\nimport * as Option from 'effect/Option';\nimport * as EffectTracer from 'effect/Tracer';\n\nfunction deriveOrigin(name: string): string {\n if (name.startsWith('http.server') || name.startsWith('http.client')) {\n return 'auto.http.effect';\n }\n\n return 'auto.function.effect';\n}\n\ntype HrTime = [number, number];\n\nconst SENTRY_SPAN_SYMBOL = Symbol.for('@sentry/effect.SentrySpan');\n\nfunction nanosToHrTime(nanos: bigint): HrTime {\n const seconds = Number(nanos / BigInt(1_000_000_000));\n const remainingNanos = Number(nanos % BigInt(1_000_000_000));\n return [seconds, remainingNanos];\n}\n\ninterface SentrySpanLike extends EffectTracer.Span {\n readonly [SENTRY_SPAN_SYMBOL]: true;\n readonly sentrySpan: Span;\n}\n\nfunction isSentrySpan(span: EffectTracer.AnySpan): span is SentrySpanLike {\n return SENTRY_SPAN_SYMBOL in span;\n}\n\nfunction getErrorMessage(exit: Exit.Exit<unknown, unknown>): string | undefined {\n if (!Exit.isFailure(exit)) {\n return undefined;\n }\n\n const cause = exit.cause as unknown;\n\n // Effect v4: cause.reasons is an array of Reason objects\n if (\n cause &&\n typeof cause === 'object' &&\n 'reasons' in cause &&\n Array.isArray((cause as { reasons: unknown }).reasons)\n ) {\n const reasons = (cause as { reasons: Array<{ _tag?: string; error?: unknown; defect?: unknown }> }).reasons;\n for (const reason of reasons) {\n if (reason._tag === 'Fail' && reason.error !== undefined) {\n return String(reason.error);\n }\n if (reason._tag === 'Die' && reason.defect !== undefined) {\n return String(reason.defect);\n }\n }\n return 'internal_error';\n }\n\n // Effect v3: cause has _tag directly\n if (cause && typeof cause === 'object' && '_tag' in cause) {\n const v3Cause = cause as { _tag: string; error?: unknown; defect?: unknown };\n if (v3Cause._tag === 'Fail') {\n return String(v3Cause.error);\n }\n if (v3Cause._tag === 'Die') {\n return String(v3Cause.defect);\n }\n }\n\n return 'internal_error';\n}\n\nclass SentrySpanWrapper implements SentrySpanLike {\n public readonly [SENTRY_SPAN_SYMBOL]: true;\n public readonly _tag: 'Span';\n public readonly spanId: string;\n public readonly traceId: string;\n public readonly attributes: Map<string, unknown>;\n public readonly sampled: boolean;\n public readonly parent: Option.Option<EffectTracer.AnySpan>;\n public readonly links: Array<EffectTracer.SpanLink>;\n public status: EffectTracer.SpanStatus;\n public readonly sentrySpan: Span;\n public readonly annotations: Context.Context<never>;\n\n public constructor(\n public readonly name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n public readonly context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n public readonly kind: EffectTracer.SpanKind,\n existingSpan: Span,\n ) {\n this[SENTRY_SPAN_SYMBOL] = true as const;\n this._tag = 'Span' as const;\n this.attributes = new Map<string, unknown>();\n this.parent = parent;\n this.links = [...links];\n this.sentrySpan = existingSpan;\n this.annotations = context;\n\n const spanContext = this.sentrySpan.spanContext();\n this.spanId = spanContext.spanId;\n this.traceId = spanContext.traceId;\n this.sampled = this.sentrySpan.isRecording();\n this.status = {\n _tag: 'Started',\n startTime,\n };\n }\n\n public attribute(key: string, value: unknown): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.setAttribute(key, value as Parameters<Span['setAttribute']>[1]);\n this.attributes.set(key, value);\n }\n\n public addLinks(links: ReadonlyArray<EffectTracer.SpanLink>): void {\n this.links.push(...links);\n }\n\n public end(endTime: bigint, exit: Exit.Exit<unknown, unknown>): void {\n this.status = {\n _tag: 'Ended',\n endTime,\n exit,\n startTime: this.status.startTime,\n };\n\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n if (Exit.isFailure(exit)) {\n const message = getErrorMessage(exit) ?? 'internal_error';\n this.sentrySpan.setStatus({ code: 2, message });\n } else {\n this.sentrySpan.setStatus({ code: 1 });\n }\n\n this.sentrySpan.end(nanosToHrTime(endTime));\n }\n\n public event(name: string, startTime: bigint, attributes?: Record<string, unknown>): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.addEvent(name, attributes as Parameters<Span['addEvent']>[1], nanosToHrTime(startTime));\n }\n}\n\nfunction createSentrySpan(\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n): SentrySpanLike {\n const parentSentrySpan =\n Option.isSome(parent) && isSentrySpan(parent.value) ? parent.value.sentrySpan : (getActiveSpan() ?? null);\n\n const newSpan = startInactiveSpan({\n name,\n startTime: nanosToHrTime(startTime),\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: deriveOrigin(name),\n },\n ...(parentSentrySpan ? { parentSpan: parentSentrySpan } : {}),\n });\n\n return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan);\n}\n\n// Check if we're running Effect v4 by checking the Exit/Cause structure\n// In v4, causes have a 'reasons' array\n// In v3, causes have '_tag' directly on the cause object\nconst isEffectV4 = (() => {\n try {\n const testExit = Exit.fail('test') as unknown as { cause?: unknown };\n const cause = testExit.cause;\n // v4 causes have 'reasons' array, v3 causes have '_tag' directly\n if (cause && typeof cause === 'object' && 'reasons' in cause) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n})();\n\nconst makeSentryTracerV3 = (): EffectTracer.Tracer => {\n // Effect v3 API: span(name, parent, context, links, startTime, kind)\n return EffectTracer.make({\n span(\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n ) {\n return createSentrySpan(name, parent, context, links, startTime, kind);\n },\n context(execution: () => unknown, fiber: { currentSpan?: EffectTracer.AnySpan }) {\n const currentSpan = fiber.currentSpan;\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return execution();\n }\n return withActiveSpan(currentSpan.sentrySpan, execution);\n },\n } as unknown as EffectTracer.Tracer);\n};\n\nconst makeSentryTracerV4 = (): EffectTracer.Tracer => {\n const EFFECT_EVALUATE = '~effect/Effect/evaluate' as const;\n\n return EffectTracer.make({\n span(options) {\n return createSentrySpan(\n options.name,\n options.parent,\n options.annotations,\n options.links,\n options.startTime,\n options.kind,\n );\n },\n context(primitive, fiber) {\n const currentSpan = fiber.currentSpan;\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return primitive[EFFECT_EVALUATE](fiber);\n }\n return withActiveSpan(currentSpan.sentrySpan, () => primitive[EFFECT_EVALUATE](fiber));\n },\n });\n};\n\n/**\n * Effect Layer that sets up the Sentry tracer for Effect spans.\n */\nexport const SentryEffectTracer = isEffectV4 ? makeSentryTracerV4() : makeSentryTracerV3();\n"],"names":["getActiveSpan","startInactiveSpan","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","withActiveSpan"],"mappings":"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"}
|
|
@@ -1,38 +1,9 @@
|
|
|
1
1
|
import { suspend, empty } from 'effect/Layer';
|
|
2
2
|
import { init } from './sdk.js';
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* Options for the Sentry Effect client layer.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Creates an Effect Layer that initializes Sentry for browser clients.
|
|
10
|
-
*
|
|
11
|
-
* To enable Effect tracing, logs, or metrics, compose with the respective layers:
|
|
12
|
-
* - `Layer.setTracer(Sentry.SentryEffectTracer)` for tracing
|
|
13
|
-
* - `Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger)` for logs
|
|
14
|
-
* - `Sentry.SentryEffectMetricsLayer` for metrics
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* import * as Sentry from '@sentry/effect/client';
|
|
19
|
-
* import { Layer, Logger, LogLevel } from 'effect';
|
|
20
|
-
*
|
|
21
|
-
* const SentryLive = Layer.mergeAll(
|
|
22
|
-
* Sentry.effectLayer({
|
|
23
|
-
* dsn: '__DSN__',
|
|
24
|
-
* integrations: [Sentry.browserTracingIntegration()],
|
|
25
|
-
* tracesSampleRate: 1.0,
|
|
26
|
-
* }),
|
|
27
|
-
* Layer.setTracer(Sentry.SentryEffectTracer),
|
|
28
|
-
* Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger),
|
|
29
|
-
* );
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
4
|
function effectLayer(options) {
|
|
33
5
|
return suspend(() => {
|
|
34
6
|
init(options);
|
|
35
|
-
|
|
36
7
|
return empty;
|
|
37
8
|
});
|
|
38
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/client/index.ts"],"sourcesContent":["import type { BrowserOptions } from '@sentry/browser';\nimport type * as EffectLayer from 'effect/Layer';\nimport { empty as emptyLayer, suspend as suspendLayer } from 'effect/Layer';\nimport { init } from './sdk';\n\nexport { init } from './sdk';\n\n/**\n * Options for the Sentry Effect client layer.\n */\nexport type EffectClientLayerOptions = BrowserOptions;\n\n/**\n * Creates an Effect Layer that initializes Sentry for browser clients.\n *\n * To enable Effect tracing, logs, or metrics, compose with the respective layers:\n * - `Layer.setTracer(Sentry.SentryEffectTracer)` for tracing\n * - `Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger)` for logs\n * - `Sentry.SentryEffectMetricsLayer` for metrics\n *\n * @example\n * ```typescript\n * import * as Sentry from '@sentry/effect/client';\n * import { Layer, Logger, LogLevel } from 'effect';\n *\n * const SentryLive = Layer.mergeAll(\n * Sentry.effectLayer({\n * dsn: '__DSN__',\n * integrations: [Sentry.browserTracingIntegration()],\n * tracesSampleRate: 1.0,\n * }),\n * Layer.setTracer(Sentry.SentryEffectTracer),\n * Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger),\n * );\n * ```\n */\nexport function effectLayer(options: EffectClientLayerOptions): EffectLayer.Layer<never, never, never> {\n return suspendLayer(() => {\n init(options);\n\n return emptyLayer;\n });\n}\n"],"names":["suspendLayer","emptyLayer"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/client/index.ts"],"sourcesContent":["import type { BrowserOptions } from '@sentry/browser';\nimport type * as EffectLayer from 'effect/Layer';\nimport { empty as emptyLayer, suspend as suspendLayer } from 'effect/Layer';\nimport { init } from './sdk';\n\nexport { init } from './sdk';\n\n/**\n * Options for the Sentry Effect client layer.\n */\nexport type EffectClientLayerOptions = BrowserOptions;\n\n/**\n * Creates an Effect Layer that initializes Sentry for browser clients.\n *\n * To enable Effect tracing, logs, or metrics, compose with the respective layers:\n * - `Layer.setTracer(Sentry.SentryEffectTracer)` for tracing\n * - `Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger)` for logs\n * - `Sentry.SentryEffectMetricsLayer` for metrics\n *\n * @example\n * ```typescript\n * import * as Sentry from '@sentry/effect/client';\n * import { Layer, Logger, LogLevel } from 'effect';\n *\n * const SentryLive = Layer.mergeAll(\n * Sentry.effectLayer({\n * dsn: '__DSN__',\n * integrations: [Sentry.browserTracingIntegration()],\n * tracesSampleRate: 1.0,\n * }),\n * Layer.setTracer(Sentry.SentryEffectTracer),\n * Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger),\n * );\n * ```\n */\nexport function effectLayer(options: EffectClientLayerOptions): EffectLayer.Layer<never, never, never> {\n return suspendLayer(() => {\n init(options);\n\n return emptyLayer;\n });\n}\n"],"names":["suspendLayer","emptyLayer"],"mappings":";;;AAoCO,SAAS,YAAY,OAAA,EAA2E;AACrG,EAAA,OAAOA,QAAa,MAAM;AACxB,IAAA,IAAA,CAAK,OAAO,CAAA;AAEZ,IAAA,OAAOC,KAAA;AAAA,EACT,CAAC,CAAA;AACH;;;;"}
|
package/build/esm/client/sdk.js
CHANGED
|
@@ -1,19 +1,11 @@
|
|
|
1
1
|
import { init as init$1 } from '@sentry/browser';
|
|
2
2
|
import { applySdkMetadata } from '@sentry/core';
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* Initializes the Sentry Effect SDK for browser clients.
|
|
6
|
-
*
|
|
7
|
-
* @param options - Configuration options for the SDK
|
|
8
|
-
* @returns The initialized Sentry client, or undefined if initialization failed
|
|
9
|
-
*/
|
|
10
4
|
function init(options) {
|
|
11
5
|
const opts = {
|
|
12
|
-
...options
|
|
6
|
+
...options
|
|
13
7
|
};
|
|
14
|
-
|
|
15
|
-
applySdkMetadata(opts, 'effect', ['effect', 'browser']);
|
|
16
|
-
|
|
8
|
+
applySdkMetadata(opts, "effect", ["effect", "browser"]);
|
|
17
9
|
return init$1(opts);
|
|
18
10
|
}
|
|
19
11
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sources":["../../../src/client/sdk.ts"],"sourcesContent":["import type { BrowserOptions } from '@sentry/browser';\nimport { init as initBrowser } from '@sentry/browser';\nimport type { Client } from '@sentry/core';\nimport { applySdkMetadata } from '@sentry/core';\n\n/**\n * Initializes the Sentry Effect SDK for browser clients.\n *\n * @param options - Configuration options for the SDK\n * @returns The initialized Sentry client, or undefined if initialization failed\n */\nexport function init(options: BrowserOptions): Client | undefined {\n const opts = {\n ...options,\n };\n\n applySdkMetadata(opts, 'effect', ['effect', 'browser']);\n\n return initBrowser(opts);\n}\n"],"names":["initBrowser"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"sdk.js","sources":["../../../src/client/sdk.ts"],"sourcesContent":["import type { BrowserOptions } from '@sentry/browser';\nimport { init as initBrowser } from '@sentry/browser';\nimport type { Client } from '@sentry/core';\nimport { applySdkMetadata } from '@sentry/core';\n\n/**\n * Initializes the Sentry Effect SDK for browser clients.\n *\n * @param options - Configuration options for the SDK\n * @returns The initialized Sentry client, or undefined if initialization failed\n */\nexport function init(options: BrowserOptions): Client | undefined {\n const opts = {\n ...options,\n };\n\n applySdkMetadata(opts, 'effect', ['effect', 'browser']);\n\n return initBrowser(opts);\n}\n"],"names":["initBrowser"],"mappings":";;;AAWO,SAAS,KAAK,OAAA,EAA6C;AAChE,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,GAAG;AAAA,GACL;AAEA,EAAA,gBAAA,CAAiB,IAAA,EAAM,QAAA,EAAU,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAEtD,EAAA,OAAOA,OAAY,IAAI,CAAA;AACzB;;;;"}
|
package/build/esm/logger.js
CHANGED
|
@@ -2,53 +2,44 @@ import { logger } from '@sentry/core';
|
|
|
2
2
|
import * as Logger from 'effect/Logger';
|
|
3
3
|
|
|
4
4
|
function getLogLevelTag(logLevel) {
|
|
5
|
-
|
|
6
|
-
if (typeof logLevel === 'string') {
|
|
5
|
+
if (typeof logLevel === "string") {
|
|
7
6
|
return logLevel;
|
|
8
7
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
if (logLevel && typeof logLevel === 'object' && '_tag' in logLevel) {
|
|
12
|
-
return (logLevel )._tag;
|
|
8
|
+
if (logLevel && typeof logLevel === "object" && "_tag" in logLevel) {
|
|
9
|
+
return logLevel._tag;
|
|
13
10
|
}
|
|
14
|
-
|
|
15
|
-
return 'Info';
|
|
11
|
+
return "Info";
|
|
16
12
|
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Effect Logger that sends logs to Sentry.
|
|
20
|
-
*/
|
|
21
13
|
const SentryEffectLogger = Logger.make(({ logLevel, message }) => {
|
|
22
14
|
let msg;
|
|
23
|
-
if (typeof message ===
|
|
15
|
+
if (typeof message === "string") {
|
|
24
16
|
msg = message;
|
|
25
17
|
} else if (Array.isArray(message) && message.length === 1) {
|
|
26
18
|
const firstElement = message[0];
|
|
27
|
-
msg = typeof firstElement ===
|
|
19
|
+
msg = typeof firstElement === "string" ? firstElement : JSON.stringify(firstElement);
|
|
28
20
|
} else {
|
|
29
21
|
msg = JSON.stringify(message);
|
|
30
22
|
}
|
|
31
|
-
|
|
32
23
|
const tag = getLogLevelTag(logLevel);
|
|
33
|
-
|
|
34
24
|
switch (tag) {
|
|
35
|
-
case
|
|
25
|
+
case "Fatal":
|
|
36
26
|
logger.fatal(msg);
|
|
37
27
|
break;
|
|
38
|
-
case
|
|
28
|
+
case "Error":
|
|
39
29
|
logger.error(msg);
|
|
40
30
|
break;
|
|
41
|
-
case
|
|
42
|
-
|
|
31
|
+
case "Warning":
|
|
32
|
+
// Effect v3
|
|
33
|
+
case "Warn":
|
|
43
34
|
logger.warn(msg);
|
|
44
35
|
break;
|
|
45
|
-
case
|
|
36
|
+
case "Info":
|
|
46
37
|
logger.info(msg);
|
|
47
38
|
break;
|
|
48
|
-
case
|
|
39
|
+
case "Debug":
|
|
49
40
|
logger.debug(msg);
|
|
50
41
|
break;
|
|
51
|
-
case
|
|
42
|
+
case "Trace":
|
|
52
43
|
logger.trace(msg);
|
|
53
44
|
break;
|
|
54
45
|
}
|
package/build/esm/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sources":["../../src/logger.ts"],"sourcesContent":["import { logger as sentryLogger } from '@sentry/core';\nimport * as Logger from 'effect/Logger';\nimport type * as LogLevel from 'effect/LogLevel';\n\nfunction getLogLevelTag(logLevel: LogLevel.LogLevel): LogLevel.LogLevel | 'Warning' {\n // Effect v4: logLevel is a string literal directly\n if (typeof logLevel === 'string') {\n return logLevel;\n }\n\n // Effect v3: logLevel has _tag property\n if (logLevel && typeof logLevel === 'object' && '_tag' in logLevel) {\n return (logLevel as { _tag: LogLevel.LogLevel })._tag;\n }\n\n return 'Info';\n}\n\n/**\n * Effect Logger that sends logs to Sentry.\n */\nexport const SentryEffectLogger = Logger.make(({ logLevel, message }) => {\n let msg: string;\n if (typeof message === 'string') {\n msg = message;\n } else if (Array.isArray(message) && message.length === 1) {\n const firstElement = message[0];\n msg = typeof firstElement === 'string' ? firstElement : JSON.stringify(firstElement);\n } else {\n msg = JSON.stringify(message);\n }\n\n const tag = getLogLevelTag(logLevel);\n\n switch (tag) {\n case 'Fatal':\n sentryLogger.fatal(msg);\n break;\n case 'Error':\n sentryLogger.error(msg);\n break;\n case 'Warning': // Effect v3\n case 'Warn': // Effect v4\n sentryLogger.warn(msg);\n break;\n case 'Info':\n sentryLogger.info(msg);\n break;\n case 'Debug':\n sentryLogger.debug(msg);\n break;\n case 'Trace':\n sentryLogger.trace(msg);\n break;\n case 'All':\n case 'None':\n break;\n default:\n tag satisfies never;\n }\n});\n"],"names":["sentryLogger"],"mappings":";;;AAIA,SAAS,
|
|
1
|
+
{"version":3,"file":"logger.js","sources":["../../src/logger.ts"],"sourcesContent":["import { logger as sentryLogger } from '@sentry/core';\nimport * as Logger from 'effect/Logger';\nimport type * as LogLevel from 'effect/LogLevel';\n\nfunction getLogLevelTag(logLevel: LogLevel.LogLevel): LogLevel.LogLevel | 'Warning' {\n // Effect v4: logLevel is a string literal directly\n if (typeof logLevel === 'string') {\n return logLevel;\n }\n\n // Effect v3: logLevel has _tag property\n if (logLevel && typeof logLevel === 'object' && '_tag' in logLevel) {\n return (logLevel as { _tag: LogLevel.LogLevel })._tag;\n }\n\n return 'Info';\n}\n\n/**\n * Effect Logger that sends logs to Sentry.\n */\nexport const SentryEffectLogger = Logger.make(({ logLevel, message }) => {\n let msg: string;\n if (typeof message === 'string') {\n msg = message;\n } else if (Array.isArray(message) && message.length === 1) {\n const firstElement = message[0];\n msg = typeof firstElement === 'string' ? firstElement : JSON.stringify(firstElement);\n } else {\n msg = JSON.stringify(message);\n }\n\n const tag = getLogLevelTag(logLevel);\n\n switch (tag) {\n case 'Fatal':\n sentryLogger.fatal(msg);\n break;\n case 'Error':\n sentryLogger.error(msg);\n break;\n case 'Warning': // Effect v3\n case 'Warn': // Effect v4\n sentryLogger.warn(msg);\n break;\n case 'Info':\n sentryLogger.info(msg);\n break;\n case 'Debug':\n sentryLogger.debug(msg);\n break;\n case 'Trace':\n sentryLogger.trace(msg);\n break;\n case 'All':\n case 'None':\n break;\n default:\n tag satisfies never;\n }\n});\n"],"names":["sentryLogger"],"mappings":";;;AAIA,SAAS,eAAe,QAAA,EAA4D;AAElF,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,IAAY,UAAU,QAAA,EAAU;AAClE,IAAA,OAAQ,QAAA,CAAyC,IAAA;AAAA,EACnD;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,MAAM,qBAAqB,MAAA,CAAO,IAAA,CAAK,CAAC,EAAE,QAAA,EAAU,SAAQ,KAAM;AACvE,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,GAAA,GAAM,OAAA;AAAA,EACR,WAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AACzD,IAAA,MAAM,YAAA,GAAe,QAAQ,CAAC,CAAA;AAC9B,IAAA,GAAA,GAAM,OAAO,YAAA,KAAiB,QAAA,GAAW,YAAA,GAAe,IAAA,CAAK,UAAU,YAAY,CAAA;AAAA,EACrF,CAAA,MAAO;AACL,IAAA,GAAA,GAAM,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,GAAA,GAAM,eAAe,QAAQ,CAAA;AAEnC,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,OAAA;AACH,MAAAA,MAAA,CAAa,MAAM,GAAG,CAAA;AACtB,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAAA,MAAA,CAAa,MAAM,GAAG,CAAA;AACtB,MAAA;AAAA,IACF,KAAK,SAAA;AAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAAA,MAAA,CAAa,KAAK,GAAG,CAAA;AACrB,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAAA,MAAA,CAAa,KAAK,GAAG,CAAA;AACrB,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAAA,MAAA,CAAa,MAAM,GAAG,CAAA;AACtB,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAAA,MAAA,CAAa,MAAM,GAAG,CAAA;AACtB,MAAA;AAKA;AAEN,CAAC;;;;"}
|