sentry-testkit 3.3.6 → 3.3.7
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 +2 -0
- package/README.md +9 -0
- package/dist/browser.js +21 -0
- package/dist/index.js +16 -261
- package/dist/initNetworkInterceptor.js +37 -0
- package/dist/localServerApi.js +89 -0
- package/dist/parsers.js +50 -0
- package/dist/sentryTransport.js +38 -0
- package/dist/testkit.js +79 -0
- package/dist/transformers.js +42 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
|
4
4
|
|
|
5
|
+
### [3.3.7](https://github.com/wix/sentry-testkit/compare/v3.3.6...v3.3.7) (2021-10-27)
|
|
6
|
+
|
|
5
7
|
### [3.3.6](https://github.com/wix/sentry-testkit/compare/v3.3.5...v3.3.6) (2021-10-18)
|
|
6
8
|
|
|
7
9
|
### [3.3.5](https://github.com/wix/sentry-testkit/compare/v3.3.4...v3.3.5) (2021-10-13)
|
package/README.md
CHANGED
|
@@ -126,3 +126,12 @@ See full API description and documentation here: https://wix.github.io/sentry-te
|
|
|
126
126
|
|
|
127
127
|
## Raven-Testkit
|
|
128
128
|
The good old legacy `raven-testkit` documentation can be found [here](LEGACY_API.md). It it still there to serve `Raven` which is the old legacy SDK of *Sentry* for JavaScript/Node.js platforms
|
|
129
|
+
|
|
130
|
+
## Running in browser
|
|
131
|
+
`sentry-testkit` relies on `express` and `http` packages from NodeJS. We have separated entry `sentry-testkit/browser` where we not include any NodeJS-related code.
|
|
132
|
+
```javascript
|
|
133
|
+
const sentryTestkit = require('sentry-testkit/browser');
|
|
134
|
+
|
|
135
|
+
const {testkit} = sentryTestkit()
|
|
136
|
+
// Your code for browser
|
|
137
|
+
```
|
package/dist/browser.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _require = require('./testkit'),
|
|
4
|
+
createTestkit = _require.createTestkit;
|
|
5
|
+
|
|
6
|
+
var _require2 = require('./initNetworkInterceptor'),
|
|
7
|
+
createInitNetworkInterceptor = _require2.createInitNetworkInterceptor;
|
|
8
|
+
|
|
9
|
+
var _require3 = require('./sentryTransport'),
|
|
10
|
+
createSentryTransport = _require3.createSentryTransport;
|
|
11
|
+
|
|
12
|
+
module.exports = function () {
|
|
13
|
+
var testkit = createTestkit();
|
|
14
|
+
var sentryTransport = createSentryTransport(testkit);
|
|
15
|
+
var initNetworkInterceptor = createInitNetworkInterceptor(testkit);
|
|
16
|
+
return {
|
|
17
|
+
sentryTransport: sentryTransport,
|
|
18
|
+
testkit: testkit,
|
|
19
|
+
initNetworkInterceptor: initNetworkInterceptor
|
|
20
|
+
};
|
|
21
|
+
};
|
package/dist/index.js
CHANGED
|
@@ -1,271 +1,26 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
var _require = require('./testkit'),
|
|
4
|
+
createTestkit = _require.createTestkit;
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
var _require2 = require('./localServerApi'),
|
|
7
|
+
createLocalServerApi = _require2.createLocalServerApi;
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
var _require3 = require('./initNetworkInterceptor'),
|
|
10
|
+
createInitNetworkInterceptor = _require3.createInitNetworkInterceptor;
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
12
|
-
|
|
13
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
14
|
-
|
|
15
|
-
var express = require('express');
|
|
16
|
-
|
|
17
|
-
var bodyParser = require('body-parser');
|
|
18
|
-
|
|
19
|
-
var http = require('http');
|
|
20
|
-
|
|
21
|
-
var _require = require('./parseDsn'),
|
|
22
|
-
parseDsn = _require.parseDsn;
|
|
23
|
-
|
|
24
|
-
function getException(report) {
|
|
25
|
-
return report.error;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function transformReport(report) {
|
|
29
|
-
var exception = report.exception && report.exception.values && report.exception.values[0];
|
|
30
|
-
var error = exception ? {
|
|
31
|
-
name: exception.type,
|
|
32
|
-
message: exception.value,
|
|
33
|
-
stacktrace: exception.stacktrace
|
|
34
|
-
} : undefined;
|
|
35
|
-
return {
|
|
36
|
-
breadcrumbs: report.breadcrumbs || [],
|
|
37
|
-
error: error,
|
|
38
|
-
message: report.message,
|
|
39
|
-
extra: report.extra,
|
|
40
|
-
level: report.level || 'error',
|
|
41
|
-
release: report.release,
|
|
42
|
-
user: report.user,
|
|
43
|
-
tags: report.tags || {},
|
|
44
|
-
originalReport: report
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function parseEnvelopeRequest(reqBody) {
|
|
49
|
-
var _reqBody$split = reqBody.split('\n'),
|
|
50
|
-
_reqBody$split2 = _slicedToArray(_reqBody$split, 3),
|
|
51
|
-
_header = _reqBody$split2[0],
|
|
52
|
-
itemHeader = _reqBody$split2[1],
|
|
53
|
-
itemPayload = _reqBody$split2[2];
|
|
54
|
-
|
|
55
|
-
return {
|
|
56
|
-
type: JSON.parse(itemHeader).type,
|
|
57
|
-
payload: JSON.parse(itemPayload)
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function transformTransaction(item) {
|
|
62
|
-
return {
|
|
63
|
-
name: item.transaction,
|
|
64
|
-
traceId: item.contexts.trace.trace_id,
|
|
65
|
-
release: item.release,
|
|
66
|
-
tags: item.tags || {},
|
|
67
|
-
extra: item.extra,
|
|
68
|
-
spans: item.spans.map(function (span) {
|
|
69
|
-
return {
|
|
70
|
-
id: span.span_id || span.spanId,
|
|
71
|
-
op: span.op,
|
|
72
|
-
parentSpanId: span.parent_span_id || span.parentSpanId,
|
|
73
|
-
description: span.description
|
|
74
|
-
};
|
|
75
|
-
})
|
|
76
|
-
};
|
|
77
|
-
}
|
|
12
|
+
var _require4 = require('./sentryTransport'),
|
|
13
|
+
createSentryTransport = _require4.createSentryTransport;
|
|
78
14
|
|
|
79
15
|
module.exports = function () {
|
|
80
|
-
var
|
|
81
|
-
var
|
|
82
|
-
var
|
|
83
|
-
|
|
84
|
-
var createPuppeteerHandler = function createPuppeteerHandler(baseUrl) {
|
|
85
|
-
return function (request) {
|
|
86
|
-
var url = request.url();
|
|
87
|
-
|
|
88
|
-
if (!url.startsWith(baseUrl)) {
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
var path = url.substring(baseUrl.length);
|
|
93
|
-
|
|
94
|
-
if (/\/api\/[0-9]*\/store/.test(path)) {
|
|
95
|
-
_reports.push(transformReport(JSON.parse(request.postData())));
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (/\/api\/[0-9]*\/envelope/.test(path)) {
|
|
99
|
-
var _parseEnvelopeRequest = parseEnvelopeRequest(request.postData()),
|
|
100
|
-
type = _parseEnvelopeRequest.type,
|
|
101
|
-
payload = _parseEnvelopeRequest.payload;
|
|
102
|
-
|
|
103
|
-
if (type === 'transaction') {
|
|
104
|
-
_transactions.push(transformTransaction(payload));
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
};
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
var createLocalServerApi = function createLocalServerApi() {
|
|
111
|
-
var runningServer = null;
|
|
112
|
-
var localDsn = null;
|
|
113
|
-
|
|
114
|
-
var start = function start(userDsn) {
|
|
115
|
-
if (runningServer !== null) {
|
|
116
|
-
throw new Error('Local server is already running');
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
var _parseDsn = parseDsn(userDsn),
|
|
120
|
-
project = _parseDsn.project;
|
|
121
|
-
|
|
122
|
-
var app = express(); // the performance endpoint uses a custom non-json payload so
|
|
123
|
-
// we can't use bodyParser.json() directly
|
|
124
|
-
|
|
125
|
-
app.use(bodyParser.text({
|
|
126
|
-
type: ['application/json', 'application/x-sentry-envelope']
|
|
127
|
-
}));
|
|
128
|
-
app.post("/api/".concat(project, "/store/"), function (req, res) {
|
|
129
|
-
_reports.push(transformReport(JSON.parse(req.body)));
|
|
130
|
-
|
|
131
|
-
res.sendStatus(200);
|
|
132
|
-
});
|
|
133
|
-
app.post("/api/".concat(project, "/envelope/"), function (req, res) {
|
|
134
|
-
var _parseEnvelopeRequest2 = parseEnvelopeRequest(req.body),
|
|
135
|
-
type = _parseEnvelopeRequest2.type,
|
|
136
|
-
payload = _parseEnvelopeRequest2.payload;
|
|
137
|
-
|
|
138
|
-
if (type === 'transaction') {
|
|
139
|
-
_transactions.push(transformTransaction(payload));
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
res.sendStatus(200);
|
|
143
|
-
});
|
|
144
|
-
runningServer = http.createServer(app);
|
|
145
|
-
return new Promise(function (resolve) {
|
|
146
|
-
runningServer.listen(function () {
|
|
147
|
-
var port = runningServer.address().port;
|
|
148
|
-
localDsn = "http://acacaeaccacacacabcaacdacdacadaca@localhost:".concat(port, "/").concat(project);
|
|
149
|
-
resolve();
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
var stop = function stop() {
|
|
155
|
-
if (runningServer === null) {
|
|
156
|
-
throw new Error('Local server is not running');
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
return new Promise(function (resolve, reject) {
|
|
160
|
-
runningServer.close(function (error) {
|
|
161
|
-
return error ? reject(error) : resolve();
|
|
162
|
-
});
|
|
163
|
-
runningServer = null;
|
|
164
|
-
localDsn = null;
|
|
165
|
-
});
|
|
166
|
-
};
|
|
167
|
-
|
|
168
|
-
var getDsn = function getDsn() {
|
|
169
|
-
if (runningServer === null) {
|
|
170
|
-
throw new Error('Local server is not running');
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
return localDsn;
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
return {
|
|
177
|
-
start: start,
|
|
178
|
-
stop: stop,
|
|
179
|
-
getDsn: getDsn
|
|
180
|
-
};
|
|
181
|
-
};
|
|
182
|
-
|
|
16
|
+
var testkit = createTestkit();
|
|
17
|
+
var sentryTransport = createSentryTransport(testkit);
|
|
18
|
+
var initNetworkInterceptor = createInitNetworkInterceptor(testkit);
|
|
19
|
+
var localServer = createLocalServerApi(testkit);
|
|
183
20
|
return {
|
|
184
|
-
sentryTransport:
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
} else {
|
|
189
|
-
_reports.push(transformReport(event));
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
return Promise.resolve({
|
|
193
|
-
status: 'success',
|
|
194
|
-
event: event
|
|
195
|
-
});
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
var close = function close() {
|
|
199
|
-
return Promise.resolve(true);
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
return {
|
|
203
|
-
// captureEvent(event: SentryEvent): Promise<SentryResponse>;
|
|
204
|
-
captureEvent: sendEvent,
|
|
205
|
-
// support for v4 API
|
|
206
|
-
sendEvent: sendEvent,
|
|
207
|
-
// support for v5 API
|
|
208
|
-
// close(timeout?: number): Promise<boolean>;
|
|
209
|
-
close: close
|
|
210
|
-
};
|
|
211
|
-
},
|
|
212
|
-
initNetworkInterceptor: function initNetworkInterceptor(dsn, cb) {
|
|
213
|
-
var _parseDsn2 = parseDsn(dsn),
|
|
214
|
-
protocol = _parseDsn2.protocol,
|
|
215
|
-
host = _parseDsn2.host;
|
|
216
|
-
|
|
217
|
-
var baseUrl = "".concat(protocol, "://").concat(host);
|
|
218
|
-
|
|
219
|
-
var handleRequestBody = function handleRequestBody(requestBody) {
|
|
220
|
-
return _reports.push(transformReport(requestBody));
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
var handleEnvelopeRequestBody = function handleEnvelopeRequestBody(requestBody) {
|
|
224
|
-
var _parseEnvelopeRequest3 = parseEnvelopeRequest(requestBody),
|
|
225
|
-
type = _parseEnvelopeRequest3.type,
|
|
226
|
-
payload = _parseEnvelopeRequest3.payload;
|
|
227
|
-
|
|
228
|
-
if (type === 'transaction') {
|
|
229
|
-
_transactions.push(transformTransaction(payload));
|
|
230
|
-
}
|
|
231
|
-
};
|
|
232
|
-
|
|
233
|
-
return cb(baseUrl, handleRequestBody, handleEnvelopeRequestBody);
|
|
234
|
-
},
|
|
235
|
-
localServer: createLocalServerApi(),
|
|
236
|
-
testkit: {
|
|
237
|
-
puppeteer: {
|
|
238
|
-
startListening: function startListening(page) {
|
|
239
|
-
var baseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'https://sentry.io';
|
|
240
|
-
puppeteerHandler = createPuppeteerHandler(baseUrl);
|
|
241
|
-
page.on('request', puppeteerHandler);
|
|
242
|
-
},
|
|
243
|
-
stopListening: function stopListening(page) {
|
|
244
|
-
page.removeListener('request', puppeteerHandler);
|
|
245
|
-
}
|
|
246
|
-
},
|
|
247
|
-
reports: function reports() {
|
|
248
|
-
return _reports;
|
|
249
|
-
},
|
|
250
|
-
transactions: function transactions() {
|
|
251
|
-
return _transactions;
|
|
252
|
-
},
|
|
253
|
-
reset: function reset() {
|
|
254
|
-
_reports = [];
|
|
255
|
-
_transactions = [];
|
|
256
|
-
},
|
|
257
|
-
getExceptionAt: function getExceptionAt(index) {
|
|
258
|
-
return getException(_reports[index]);
|
|
259
|
-
},
|
|
260
|
-
findReport: function findReport(e) {
|
|
261
|
-
return _reports.find(function (r) {
|
|
262
|
-
var err = getException(r);
|
|
263
|
-
return err.name === e.name && err.message === e.message;
|
|
264
|
-
});
|
|
265
|
-
},
|
|
266
|
-
isExist: function isExist(e) {
|
|
267
|
-
return this.findReport(e) !== undefined;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
21
|
+
sentryTransport: sentryTransport,
|
|
22
|
+
testkit: testkit,
|
|
23
|
+
initNetworkInterceptor: initNetworkInterceptor,
|
|
24
|
+
localServer: localServer
|
|
270
25
|
};
|
|
271
26
|
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _require = require('./parsers'),
|
|
4
|
+
parseDsn = _require.parseDsn,
|
|
5
|
+
parseEnvelopeRequest = _require.parseEnvelopeRequest;
|
|
6
|
+
|
|
7
|
+
var _require2 = require('./transformers'),
|
|
8
|
+
transformReport = _require2.transformReport,
|
|
9
|
+
transformTransaction = _require2.transformTransaction;
|
|
10
|
+
|
|
11
|
+
var createInitNetworkInterceptor = function createInitNetworkInterceptor(testkit) {
|
|
12
|
+
return function (dsn, cb) {
|
|
13
|
+
var _parseDsn = parseDsn(dsn),
|
|
14
|
+
protocol = _parseDsn.protocol,
|
|
15
|
+
host = _parseDsn.host;
|
|
16
|
+
|
|
17
|
+
var baseUrl = "".concat(protocol, "://").concat(host);
|
|
18
|
+
|
|
19
|
+
var handleRequestBody = function handleRequestBody(requestBody) {
|
|
20
|
+
return testkit.reports().push(transformReport(requestBody));
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
var handleEnvelopeRequestBody = function handleEnvelopeRequestBody(requestBody) {
|
|
24
|
+
var _parseEnvelopeRequest = parseEnvelopeRequest(requestBody),
|
|
25
|
+
type = _parseEnvelopeRequest.type,
|
|
26
|
+
payload = _parseEnvelopeRequest.payload;
|
|
27
|
+
|
|
28
|
+
if (type === 'transaction') {
|
|
29
|
+
testkit.transactions().push(transformTransaction(payload));
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
return cb(baseUrl, handleRequestBody, handleEnvelopeRequestBody);
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
module.exports.createInitNetworkInterceptor = createInitNetworkInterceptor;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var express = require('express');
|
|
4
|
+
|
|
5
|
+
var bodyParser = require('body-parser');
|
|
6
|
+
|
|
7
|
+
var http = require('http');
|
|
8
|
+
|
|
9
|
+
var _require = require('./parsers'),
|
|
10
|
+
parseDsn = _require.parseDsn,
|
|
11
|
+
parseEnvelopeRequest = _require.parseEnvelopeRequest;
|
|
12
|
+
|
|
13
|
+
var _require2 = require('./transformers'),
|
|
14
|
+
transformReport = _require2.transformReport,
|
|
15
|
+
transformTransaction = _require2.transformTransaction;
|
|
16
|
+
|
|
17
|
+
var createLocalServerApi = function createLocalServerApi(testkit) {
|
|
18
|
+
var runningServer = null;
|
|
19
|
+
var localDsn = null;
|
|
20
|
+
|
|
21
|
+
var start = function start(userDsn) {
|
|
22
|
+
if (runningServer !== null) {
|
|
23
|
+
throw new Error('Local server is already running');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
var _parseDsn = parseDsn(userDsn),
|
|
27
|
+
project = _parseDsn.project;
|
|
28
|
+
|
|
29
|
+
var app = express(); // the performance endpoint uses a custom non-json payload so
|
|
30
|
+
// we can't use bodyParser.json() directly
|
|
31
|
+
|
|
32
|
+
app.use(bodyParser.text({
|
|
33
|
+
type: ['application/json', 'application/x-sentry-envelope']
|
|
34
|
+
}));
|
|
35
|
+
app.post("/api/".concat(project, "/store/"), function (req, res) {
|
|
36
|
+
testkit.reports().push(transformReport(JSON.parse(req.body)));
|
|
37
|
+
res.sendStatus(200);
|
|
38
|
+
});
|
|
39
|
+
app.post("/api/".concat(project, "/envelope/"), function (req, res) {
|
|
40
|
+
var _parseEnvelopeRequest = parseEnvelopeRequest(req.body),
|
|
41
|
+
type = _parseEnvelopeRequest.type,
|
|
42
|
+
payload = _parseEnvelopeRequest.payload;
|
|
43
|
+
|
|
44
|
+
if (type === 'transaction') {
|
|
45
|
+
testkit.transactions().push(transformTransaction(payload));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
res.sendStatus(200);
|
|
49
|
+
});
|
|
50
|
+
runningServer = http.createServer(app);
|
|
51
|
+
return new Promise(function (resolve) {
|
|
52
|
+
runningServer.listen(function () {
|
|
53
|
+
var port = runningServer.address().port;
|
|
54
|
+
localDsn = "http://acacaeaccacacacabcaacdacdacadaca@localhost:".concat(port, "/").concat(project);
|
|
55
|
+
resolve();
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
var stop = function stop() {
|
|
61
|
+
if (runningServer === null) {
|
|
62
|
+
throw new Error('Local server is not running');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return new Promise(function (resolve, reject) {
|
|
66
|
+
runningServer.close(function (error) {
|
|
67
|
+
return error ? reject(error) : resolve();
|
|
68
|
+
});
|
|
69
|
+
runningServer = null;
|
|
70
|
+
localDsn = null;
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
var getDsn = function getDsn() {
|
|
75
|
+
if (runningServer === null) {
|
|
76
|
+
throw new Error('Local server is not running');
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return localDsn;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
return {
|
|
83
|
+
start: start,
|
|
84
|
+
stop: stop,
|
|
85
|
+
getDsn: getDsn
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
module.exports.createLocalServerApi = createLocalServerApi;
|
package/dist/parsers.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
4
|
+
|
|
5
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
6
|
+
|
|
7
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
8
|
+
|
|
9
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
10
|
+
|
|
11
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
12
|
+
|
|
13
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
14
|
+
|
|
15
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
16
|
+
|
|
17
|
+
var dsnKeys = 'source protocol user pass host port path'.split(' ');
|
|
18
|
+
var dsnPattern = /^(?:(\w+):)?\/\/(?:(\w+)(:\w+)?@)?([\w\.-]+)(?::(\d+))?(\/.*)/; //eslint-disable-line no-useless-escape
|
|
19
|
+
|
|
20
|
+
var parseDsn = function parseDsn(dsn) {
|
|
21
|
+
var _dsn$match$reduce = dsn.match(dsnPattern).reduce(function (parsed, current, index) {
|
|
22
|
+
return Object.assign({}, parsed, _defineProperty({}, dsnKeys[index], current));
|
|
23
|
+
}, {}),
|
|
24
|
+
protocol = _dsn$match$reduce.protocol,
|
|
25
|
+
host = _dsn$match$reduce.host,
|
|
26
|
+
path = _dsn$match$reduce.path;
|
|
27
|
+
|
|
28
|
+
var project = path.substr(path.lastIndexOf('/') + 1);
|
|
29
|
+
return {
|
|
30
|
+
protocol: protocol,
|
|
31
|
+
project: project,
|
|
32
|
+
host: host
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
var parseEnvelopeRequest = function parseEnvelopeRequest(reqBody) {
|
|
37
|
+
var _reqBody$split = reqBody.split('\n'),
|
|
38
|
+
_reqBody$split2 = _slicedToArray(_reqBody$split, 3),
|
|
39
|
+
_header = _reqBody$split2[0],
|
|
40
|
+
itemHeader = _reqBody$split2[1],
|
|
41
|
+
itemPayload = _reqBody$split2[2];
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
type: JSON.parse(itemHeader).type,
|
|
45
|
+
payload: JSON.parse(itemPayload)
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
module.exports.parseDsn = parseDsn;
|
|
50
|
+
module.exports.parseEnvelopeRequest = parseEnvelopeRequest;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _require = require('./transformers'),
|
|
4
|
+
transformReport = _require.transformReport,
|
|
5
|
+
transformTransaction = _require.transformTransaction;
|
|
6
|
+
|
|
7
|
+
var createSentryTransport = function createSentryTransport(testkit) {
|
|
8
|
+
return function (options) {
|
|
9
|
+
var sendEvent = function sendEvent(event) {
|
|
10
|
+
if (event.type === 'transaction') {
|
|
11
|
+
testkit.transactions().push(transformTransaction(event));
|
|
12
|
+
} else {
|
|
13
|
+
testkit.reports().push(transformReport(event));
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return Promise.resolve({
|
|
17
|
+
status: 'success',
|
|
18
|
+
event: event
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
var close = function close() {
|
|
23
|
+
return Promise.resolve(true);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
return {
|
|
27
|
+
// captureEvent(event: SentryEvent): Promise<SentryResponse>;
|
|
28
|
+
captureEvent: sendEvent,
|
|
29
|
+
// support for v4 API
|
|
30
|
+
sendEvent: sendEvent,
|
|
31
|
+
// support for v5 API
|
|
32
|
+
// close(timeout?: number): Promise<boolean>;
|
|
33
|
+
close: close
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
module.exports.createSentryTransport = createSentryTransport;
|
package/dist/testkit.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _require = require('./parsers'),
|
|
4
|
+
parseEnvelopeRequest = _require.parseEnvelopeRequest;
|
|
5
|
+
|
|
6
|
+
var _require2 = require('./transformers'),
|
|
7
|
+
transformReport = _require2.transformReport,
|
|
8
|
+
transformTransaction = _require2.transformTransaction;
|
|
9
|
+
|
|
10
|
+
function getException(report) {
|
|
11
|
+
return report.error;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
module.exports.createTestkit = function () {
|
|
15
|
+
var _reports = [];
|
|
16
|
+
var _transactions = [];
|
|
17
|
+
var puppeteerHandler = null;
|
|
18
|
+
|
|
19
|
+
var createPuppeteerHandler = function createPuppeteerHandler(baseUrl) {
|
|
20
|
+
return function (request) {
|
|
21
|
+
var url = request.url();
|
|
22
|
+
|
|
23
|
+
if (!url.startsWith(baseUrl)) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
var path = url.substring(baseUrl.length);
|
|
28
|
+
|
|
29
|
+
if (/\/api\/[0-9]*\/store/.test(path)) {
|
|
30
|
+
_reports.push(transformReport(JSON.parse(request.postData())));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (/\/api\/[0-9]*\/envelope/.test(path)) {
|
|
34
|
+
var _parseEnvelopeRequest = parseEnvelopeRequest(request.postData()),
|
|
35
|
+
type = _parseEnvelopeRequest.type,
|
|
36
|
+
payload = _parseEnvelopeRequest.payload;
|
|
37
|
+
|
|
38
|
+
if (type === 'transaction') {
|
|
39
|
+
_transactions.push(transformTransaction(payload));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
puppeteer: {
|
|
47
|
+
startListening: function startListening(page) {
|
|
48
|
+
var baseUrl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'https://sentry.io';
|
|
49
|
+
puppeteerHandler = createPuppeteerHandler(baseUrl);
|
|
50
|
+
page.on('request', puppeteerHandler);
|
|
51
|
+
},
|
|
52
|
+
stopListening: function stopListening(page) {
|
|
53
|
+
page.removeListener('request', puppeteerHandler);
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
reports: function reports() {
|
|
57
|
+
return _reports;
|
|
58
|
+
},
|
|
59
|
+
transactions: function transactions() {
|
|
60
|
+
return _transactions;
|
|
61
|
+
},
|
|
62
|
+
reset: function reset() {
|
|
63
|
+
_reports = [];
|
|
64
|
+
_transactions = [];
|
|
65
|
+
},
|
|
66
|
+
getExceptionAt: function getExceptionAt(index) {
|
|
67
|
+
return getException(_reports[index]);
|
|
68
|
+
},
|
|
69
|
+
findReport: function findReport(e) {
|
|
70
|
+
return _reports.find(function (r) {
|
|
71
|
+
var err = getException(r);
|
|
72
|
+
return err.name === e.name && err.message === e.message;
|
|
73
|
+
});
|
|
74
|
+
},
|
|
75
|
+
isExist: function isExist(e) {
|
|
76
|
+
return this.findReport(e) !== undefined;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function transformReport(report) {
|
|
4
|
+
var exception = report.exception && report.exception.values && report.exception.values[0];
|
|
5
|
+
var error = exception ? {
|
|
6
|
+
name: exception.type,
|
|
7
|
+
message: exception.value,
|
|
8
|
+
stacktrace: exception.stacktrace
|
|
9
|
+
} : undefined;
|
|
10
|
+
return {
|
|
11
|
+
breadcrumbs: report.breadcrumbs || [],
|
|
12
|
+
error: error,
|
|
13
|
+
message: report.message,
|
|
14
|
+
extra: report.extra,
|
|
15
|
+
level: report.level || 'error',
|
|
16
|
+
release: report.release,
|
|
17
|
+
user: report.user,
|
|
18
|
+
tags: report.tags || {},
|
|
19
|
+
originalReport: report
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function transformTransaction(item) {
|
|
24
|
+
return {
|
|
25
|
+
name: item.transaction,
|
|
26
|
+
traceId: item.contexts.trace.trace_id,
|
|
27
|
+
release: item.release,
|
|
28
|
+
tags: item.tags || {},
|
|
29
|
+
extra: item.extra,
|
|
30
|
+
spans: item.spans.map(function (span) {
|
|
31
|
+
return {
|
|
32
|
+
id: span.span_id || span.spanId,
|
|
33
|
+
op: span.op,
|
|
34
|
+
parentSpanId: span.parent_span_id || span.parentSpanId,
|
|
35
|
+
description: span.description
|
|
36
|
+
};
|
|
37
|
+
})
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
module.exports.transformReport = transformReport;
|
|
42
|
+
module.exports.transformTransaction = transformTransaction;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sentry-testkit",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.7",
|
|
4
4
|
"description": "Sentry Testkit enables Sentry to work natively in your application while running tests. The report is not really sent but rather logged locally into memory. In this way, the logged reports can be fetched for your own verification or any other purpose in your local development environment.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "index.d.ts",
|