@prairielearn/sentry 2.0.3 → 2.0.5
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/CHANGELOG.md +13 -0
- package/dist/index.d.ts +16 -2
- package/dist/index.js +54 -1
- package/dist/index.js.map +1 -1
- package/package.json +6 -5
- package/src/index.ts +81 -28
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @prairielearn/sentry
|
|
2
2
|
|
|
3
|
+
## 2.0.5
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- a8438ff: Upgrade all JavaScript dependencies
|
|
8
|
+
- f33f309: Update Sentry dependencies
|
|
9
|
+
|
|
10
|
+
## 2.0.4
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- 68653a6: Handle errors inside request event processor
|
|
15
|
+
|
|
3
16
|
## 2.0.3
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -4,5 +4,19 @@ import * as Sentry from '@sentry/node';
|
|
|
4
4
|
* based on the current Git revision.
|
|
5
5
|
*/
|
|
6
6
|
export declare function init(options: Sentry.NodeOptions): Promise<void>;
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
/**
|
|
8
|
+
* Sentry v8 switched from simple, manual instrumentation to "automatic"
|
|
9
|
+
* instrumentation based on OpenTelemetry. However, this interferes with
|
|
10
|
+
* the way that our applications asynchronously load their configuration,
|
|
11
|
+
* specifically the Sentry DSN. Sentry's automatic request isolation and
|
|
12
|
+
* request data extraction requires that `Sentry.init` be called before
|
|
13
|
+
* any other code is loaded, but our application startup structure is such
|
|
14
|
+
* that we import most of our own code before we can load the Sentry DSN.
|
|
15
|
+
*
|
|
16
|
+
* Rather than jumping through hoops to restructure our application to
|
|
17
|
+
* support this, this small function can be added as Express middleware to
|
|
18
|
+
* isolate requests and set request data for Sentry.
|
|
19
|
+
*/
|
|
20
|
+
export declare function requestHandler(): (req: any, _res: any, next: any) => void;
|
|
21
|
+
export { Breadcrumb, BreadcrumbHint, Event, EventHint, Exception, NodeOptions, PolymorphicRequest, Request, SdkInfo, Session, SeverityLevel, Span, StackFrame, Stacktrace, Thread, User, } from '@sentry/node';
|
|
22
|
+
export { addBreadcrumb, addEventProcessor, addRequestDataToEvent, captureEvent, captureException, captureMessage, close, createTransport, defaultStackParser, expressErrorHandler, expressIntegration, extractRequestData, flush, getCurrentHub, getCurrentScope, getSentryRelease, makeNodeTransport, NodeClient, Scope, SDK_VERSION, SentryContextManager, setContext, setExtra, setExtras, setTag, setTags, setupExpressErrorHandler, setUser, startInactiveSpan, startSpan, startSpanManual, withIsolationScope, withScope, } from '@sentry/node';
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as Sentry from '@sentry/node';
|
|
2
|
+
import { stripUrlQueryAndFragment } from '@sentry/utils';
|
|
2
3
|
import { execa } from 'execa';
|
|
3
4
|
/**
|
|
4
5
|
* A thin wrapper around {@link Sentry.init} that automatically sets `release`
|
|
@@ -20,5 +21,57 @@ export async function init(options) {
|
|
|
20
21
|
...options,
|
|
21
22
|
});
|
|
22
23
|
}
|
|
23
|
-
|
|
24
|
+
/**
|
|
25
|
+
* Based on Sentry code that is not exported:
|
|
26
|
+
* https://github.com/getsentry/sentry-javascript/blob/602703652959b581304a7849cb97117f296493bc/packages/utils/src/requestdata.ts#L102
|
|
27
|
+
*/
|
|
28
|
+
function extractTransaction(req) {
|
|
29
|
+
const method = req.method?.toUpperCase() || '';
|
|
30
|
+
const path = stripUrlQueryAndFragment(req.originalUrl || req.url || '');
|
|
31
|
+
let name = '';
|
|
32
|
+
if (method) {
|
|
33
|
+
name += method;
|
|
34
|
+
}
|
|
35
|
+
if (method && path) {
|
|
36
|
+
name += ' ';
|
|
37
|
+
}
|
|
38
|
+
if (path) {
|
|
39
|
+
name += path;
|
|
40
|
+
}
|
|
41
|
+
return name;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Sentry v8 switched from simple, manual instrumentation to "automatic"
|
|
45
|
+
* instrumentation based on OpenTelemetry. However, this interferes with
|
|
46
|
+
* the way that our applications asynchronously load their configuration,
|
|
47
|
+
* specifically the Sentry DSN. Sentry's automatic request isolation and
|
|
48
|
+
* request data extraction requires that `Sentry.init` be called before
|
|
49
|
+
* any other code is loaded, but our application startup structure is such
|
|
50
|
+
* that we import most of our own code before we can load the Sentry DSN.
|
|
51
|
+
*
|
|
52
|
+
* Rather than jumping through hoops to restructure our application to
|
|
53
|
+
* support this, this small function can be added as Express middleware to
|
|
54
|
+
* isolate requests and set request data for Sentry.
|
|
55
|
+
*/
|
|
56
|
+
export function requestHandler() {
|
|
57
|
+
return (req, _res, next) => {
|
|
58
|
+
Sentry.withIsolationScope((scope) => {
|
|
59
|
+
scope.addEventProcessor((event) => {
|
|
60
|
+
// If an event processor throws an error, Sentry will catch it and
|
|
61
|
+
// retrigger the event processor, which infinitely recurses. We'll
|
|
62
|
+
// treat our event processor as a best-effort operation and silently
|
|
63
|
+
// swallow any errors.
|
|
64
|
+
try {
|
|
65
|
+
event.transaction = extractTransaction(req);
|
|
66
|
+
return Sentry.addRequestDataToEvent(event, req);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return event;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
next();
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export { addBreadcrumb, addEventProcessor, addRequestDataToEvent, captureEvent, captureException, captureMessage, close, createTransport, defaultStackParser, expressErrorHandler, expressIntegration, extractRequestData, flush, getCurrentHub, getCurrentScope, getSentryRelease, makeNodeTransport, NodeClient, Scope, SDK_VERSION, SentryContextManager, setContext, setExtra, setExtras, setTag, setTags, setupExpressErrorHandler, setUser, startInactiveSpan, startSpan, startSpanManual, withIsolationScope, withScope, } from '@sentry/node';
|
|
24
77
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAA2B;IACpD,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAE9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACtE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,mEAAmE;YACnE,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC;QACV,OAAO;QACP,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,OAA2B;IACpD,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAE9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACtE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,mEAAmE;YACnE,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC;QACV,OAAO;QACP,GAAG,OAAO;KACX,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,GAAQ;IAClC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,wBAAwB,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IAExE,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,IAAI,MAAM,CAAC;IACjB,CAAC;IACD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,IAAI,IAAI,GAAG,CAAC;IACd,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,IAAI,IAAI,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,GAAQ,EAAE,IAAS,EAAE,IAAS,EAAE,EAAE;QACxC,MAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,EAAE;YAClC,KAAK,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,EAAE;gBAChC,kEAAkE;gBAClE,kEAAkE;gBAClE,oEAAoE;gBACpE,sBAAsB;gBACtB,IAAI,CAAC;oBACH,KAAK,CAAC,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;oBAC5C,OAAO,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBAClD,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAwBD,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,KAAK,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,EACL,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,KAAK,EACL,WAAW,EACX,oBAAoB,EACpB,UAAU,EACV,QAAQ,EACR,SAAS,EACT,MAAM,EACN,OAAO,EACP,wBAAwB,EACxB,OAAO,EACP,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,SAAS,GACV,MAAM,cAAc,CAAC","sourcesContent":["import * as Sentry from '@sentry/node';\nimport { stripUrlQueryAndFragment } from '@sentry/utils';\nimport { execa } from 'execa';\n\n/**\n * A thin wrapper around {@link Sentry.init} that automatically sets `release`\n * based on the current Git revision.\n */\nexport async function init(options: Sentry.NodeOptions) {\n let release = options.release;\n\n if (!release) {\n try {\n release = (await execa('git', ['rev-parse', 'HEAD'])).stdout.trim();\n } catch (e) {\n // This most likely isn't running in an initialized git repository.\n // Default to not setting a release.\n }\n }\n\n Sentry.init({\n release,\n ...options,\n });\n}\n\n/**\n * Based on Sentry code that is not exported:\n * https://github.com/getsentry/sentry-javascript/blob/602703652959b581304a7849cb97117f296493bc/packages/utils/src/requestdata.ts#L102\n */\nfunction extractTransaction(req: any) {\n const method = req.method?.toUpperCase() || '';\n const path = stripUrlQueryAndFragment(req.originalUrl || req.url || '');\n\n let name = '';\n if (method) {\n name += method;\n }\n if (method && path) {\n name += ' ';\n }\n if (path) {\n name += path;\n }\n\n return name;\n}\n\n/**\n * Sentry v8 switched from simple, manual instrumentation to \"automatic\"\n * instrumentation based on OpenTelemetry. However, this interferes with\n * the way that our applications asynchronously load their configuration,\n * specifically the Sentry DSN. Sentry's automatic request isolation and\n * request data extraction requires that `Sentry.init` be called before\n * any other code is loaded, but our application startup structure is such\n * that we import most of our own code before we can load the Sentry DSN.\n *\n * Rather than jumping through hoops to restructure our application to\n * support this, this small function can be added as Express middleware to\n * isolate requests and set request data for Sentry.\n */\nexport function requestHandler() {\n return (req: any, _res: any, next: any) => {\n Sentry.withIsolationScope((scope) => {\n scope.addEventProcessor((event) => {\n // If an event processor throws an error, Sentry will catch it and\n // retrigger the event processor, which infinitely recurses. We'll\n // treat our event processor as a best-effort operation and silently\n // swallow any errors.\n try {\n event.transaction = extractTransaction(req);\n return Sentry.addRequestDataToEvent(event, req);\n } catch {\n return event;\n }\n });\n\n next();\n });\n };\n}\n\n// We export every type and function from `@sentry/node` *except* for init,\n// which we replace with our own version up above.\n\nexport {\n Breadcrumb,\n BreadcrumbHint,\n Event,\n EventHint,\n Exception,\n NodeOptions,\n PolymorphicRequest,\n Request,\n SdkInfo,\n Session,\n SeverityLevel,\n Span,\n StackFrame,\n Stacktrace,\n Thread,\n User,\n} from '@sentry/node';\n\nexport {\n addBreadcrumb,\n addEventProcessor,\n addRequestDataToEvent,\n captureEvent,\n captureException,\n captureMessage,\n close,\n createTransport,\n defaultStackParser,\n expressErrorHandler,\n expressIntegration,\n extractRequestData,\n flush,\n getCurrentHub,\n getCurrentScope,\n getSentryRelease,\n makeNodeTransport,\n NodeClient,\n Scope,\n SDK_VERSION,\n SentryContextManager,\n setContext,\n setExtra,\n setExtras,\n setTag,\n setTags,\n setupExpressErrorHandler,\n setUser,\n startInactiveSpan,\n startSpan,\n startSpanManual,\n withIsolationScope,\n withScope,\n} from '@sentry/node';\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prairielearn/sentry",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"repository": {
|
|
@@ -14,12 +14,13 @@
|
|
|
14
14
|
},
|
|
15
15
|
"devDependencies": {
|
|
16
16
|
"@prairielearn/tsconfig": "^0.0.0",
|
|
17
|
-
"@types/node": "^20.14.
|
|
18
|
-
"tsx": "^4.16.
|
|
19
|
-
"typescript": "^5.5.
|
|
17
|
+
"@types/node": "^20.14.13",
|
|
18
|
+
"tsx": "^4.16.5",
|
|
19
|
+
"typescript": "^5.5.4"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@sentry/node": "^
|
|
22
|
+
"@sentry/node": "^8.22.0",
|
|
23
|
+
"@sentry/utils": "^8.22.0",
|
|
23
24
|
"execa": "^9.3.0"
|
|
24
25
|
}
|
|
25
26
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as Sentry from '@sentry/node';
|
|
2
|
+
import { stripUrlQueryAndFragment } from '@sentry/utils';
|
|
2
3
|
import { execa } from 'execa';
|
|
3
4
|
|
|
4
5
|
/**
|
|
@@ -23,64 +24,116 @@ export async function init(options: Sentry.NodeOptions) {
|
|
|
23
24
|
});
|
|
24
25
|
}
|
|
25
26
|
|
|
27
|
+
/**
|
|
28
|
+
* Based on Sentry code that is not exported:
|
|
29
|
+
* https://github.com/getsentry/sentry-javascript/blob/602703652959b581304a7849cb97117f296493bc/packages/utils/src/requestdata.ts#L102
|
|
30
|
+
*/
|
|
31
|
+
function extractTransaction(req: any) {
|
|
32
|
+
const method = req.method?.toUpperCase() || '';
|
|
33
|
+
const path = stripUrlQueryAndFragment(req.originalUrl || req.url || '');
|
|
34
|
+
|
|
35
|
+
let name = '';
|
|
36
|
+
if (method) {
|
|
37
|
+
name += method;
|
|
38
|
+
}
|
|
39
|
+
if (method && path) {
|
|
40
|
+
name += ' ';
|
|
41
|
+
}
|
|
42
|
+
if (path) {
|
|
43
|
+
name += path;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return name;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Sentry v8 switched from simple, manual instrumentation to "automatic"
|
|
51
|
+
* instrumentation based on OpenTelemetry. However, this interferes with
|
|
52
|
+
* the way that our applications asynchronously load their configuration,
|
|
53
|
+
* specifically the Sentry DSN. Sentry's automatic request isolation and
|
|
54
|
+
* request data extraction requires that `Sentry.init` be called before
|
|
55
|
+
* any other code is loaded, but our application startup structure is such
|
|
56
|
+
* that we import most of our own code before we can load the Sentry DSN.
|
|
57
|
+
*
|
|
58
|
+
* Rather than jumping through hoops to restructure our application to
|
|
59
|
+
* support this, this small function can be added as Express middleware to
|
|
60
|
+
* isolate requests and set request data for Sentry.
|
|
61
|
+
*/
|
|
62
|
+
export function requestHandler() {
|
|
63
|
+
return (req: any, _res: any, next: any) => {
|
|
64
|
+
Sentry.withIsolationScope((scope) => {
|
|
65
|
+
scope.addEventProcessor((event) => {
|
|
66
|
+
// If an event processor throws an error, Sentry will catch it and
|
|
67
|
+
// retrigger the event processor, which infinitely recurses. We'll
|
|
68
|
+
// treat our event processor as a best-effort operation and silently
|
|
69
|
+
// swallow any errors.
|
|
70
|
+
try {
|
|
71
|
+
event.transaction = extractTransaction(req);
|
|
72
|
+
return Sentry.addRequestDataToEvent(event, req);
|
|
73
|
+
} catch {
|
|
74
|
+
return event;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
next();
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
26
83
|
// We export every type and function from `@sentry/node` *except* for init,
|
|
27
84
|
// which we replace with our own version up above.
|
|
28
85
|
|
|
29
86
|
export {
|
|
30
87
|
Breadcrumb,
|
|
31
88
|
BreadcrumbHint,
|
|
32
|
-
Request,
|
|
33
|
-
SdkInfo,
|
|
34
89
|
Event,
|
|
35
90
|
EventHint,
|
|
36
91
|
Exception,
|
|
92
|
+
NodeOptions,
|
|
93
|
+
PolymorphicRequest,
|
|
94
|
+
Request,
|
|
95
|
+
SdkInfo,
|
|
37
96
|
Session,
|
|
38
|
-
Severity,
|
|
39
97
|
SeverityLevel,
|
|
98
|
+
Span,
|
|
40
99
|
StackFrame,
|
|
41
100
|
Stacktrace,
|
|
42
101
|
Thread,
|
|
43
102
|
User,
|
|
44
|
-
AddRequestDataToEventOptions,
|
|
45
|
-
PolymorphicRequest,
|
|
46
|
-
NodeOptions,
|
|
47
103
|
} from '@sentry/node';
|
|
48
104
|
|
|
49
105
|
export {
|
|
50
|
-
addGlobalEventProcessor,
|
|
51
106
|
addBreadcrumb,
|
|
52
|
-
|
|
107
|
+
addEventProcessor,
|
|
108
|
+
addRequestDataToEvent,
|
|
53
109
|
captureEvent,
|
|
110
|
+
captureException,
|
|
54
111
|
captureMessage,
|
|
55
|
-
|
|
112
|
+
close,
|
|
56
113
|
createTransport,
|
|
57
|
-
|
|
114
|
+
defaultStackParser,
|
|
115
|
+
expressErrorHandler,
|
|
116
|
+
expressIntegration,
|
|
117
|
+
extractRequestData,
|
|
118
|
+
flush,
|
|
58
119
|
getCurrentHub,
|
|
59
|
-
|
|
60
|
-
|
|
120
|
+
getCurrentScope,
|
|
121
|
+
getSentryRelease,
|
|
122
|
+
makeNodeTransport,
|
|
123
|
+
NodeClient,
|
|
61
124
|
Scope,
|
|
62
|
-
startTransaction,
|
|
63
125
|
SDK_VERSION,
|
|
126
|
+
SentryContextManager,
|
|
64
127
|
setContext,
|
|
65
128
|
setExtra,
|
|
66
129
|
setExtras,
|
|
67
130
|
setTag,
|
|
68
131
|
setTags,
|
|
132
|
+
setupExpressErrorHandler,
|
|
69
133
|
setUser,
|
|
134
|
+
startInactiveSpan,
|
|
135
|
+
startSpan,
|
|
136
|
+
startSpanManual,
|
|
137
|
+
withIsolationScope,
|
|
70
138
|
withScope,
|
|
71
|
-
NodeClient,
|
|
72
|
-
makeNodeTransport,
|
|
73
|
-
addRequestDataToEvent,
|
|
74
|
-
extractRequestData,
|
|
75
|
-
defaultIntegrations,
|
|
76
|
-
defaultStackParser,
|
|
77
|
-
lastEventId,
|
|
78
|
-
flush,
|
|
79
|
-
close,
|
|
80
|
-
getSentryRelease,
|
|
81
|
-
deepReadDirSync,
|
|
82
|
-
Integrations,
|
|
83
|
-
Handlers,
|
|
84
|
-
runWithAsyncContext,
|
|
85
|
-
getCurrentScope,
|
|
86
139
|
} from '@sentry/node';
|