@testomatio/reporter 2.0.1-beta-ignore-xml → 2.0.1-beta.1

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.
Files changed (63) hide show
  1. package/lib/adapter/codecept.js +0 -2
  2. package/lib/adapter/cypress-plugin/index.js +0 -2
  3. package/lib/adapter/mocha.js +0 -1
  4. package/lib/adapter/nightwatch.d.ts +4 -0
  5. package/lib/adapter/nightwatch.js +80 -0
  6. package/lib/adapter/webdriver.d.ts +1 -1
  7. package/lib/adapter/webdriver.js +17 -8
  8. package/lib/bin/cli.js +126 -8
  9. package/lib/bin/reportXml.js +4 -2
  10. package/lib/bin/startTest.js +3 -2
  11. package/lib/bin/uploadArtifacts.js +5 -4
  12. package/lib/client.js +18 -9
  13. package/lib/config.js +2 -2
  14. package/lib/data-storage.d.ts +1 -1
  15. package/lib/data-storage.js +17 -7
  16. package/lib/junit-adapter/csharp.d.ts +1 -0
  17. package/lib/junit-adapter/csharp.js +11 -1
  18. package/lib/pipe/bitbucket.d.ts +2 -0
  19. package/lib/pipe/bitbucket.js +38 -26
  20. package/lib/pipe/debug.js +17 -3
  21. package/lib/pipe/github.d.ts +2 -2
  22. package/lib/pipe/github.js +35 -3
  23. package/lib/pipe/gitlab.d.ts +2 -0
  24. package/lib/pipe/gitlab.js +27 -9
  25. package/lib/pipe/html.d.ts +1 -0
  26. package/lib/pipe/html.js +1 -3
  27. package/lib/pipe/index.js +17 -7
  28. package/lib/pipe/testomatio.d.ts +2 -1
  29. package/lib/pipe/testomatio.js +79 -73
  30. package/lib/reporter.d.ts +12 -12
  31. package/lib/services/artifacts.d.ts +1 -1
  32. package/lib/services/key-values.d.ts +1 -1
  33. package/lib/services/logger.d.ts +1 -1
  34. package/lib/services/logger.js +1 -2
  35. package/lib/template/testomatio.hbs +443 -68
  36. package/lib/uploader.js +2 -2
  37. package/lib/utils/utils.d.ts +2 -0
  38. package/lib/utils/utils.js +41 -18
  39. package/lib/xmlReader.js +54 -19
  40. package/package.json +8 -9
  41. package/src/adapter/codecept.js +0 -2
  42. package/src/adapter/cypress-plugin/index.js +0 -2
  43. package/src/adapter/mocha.js +0 -1
  44. package/src/adapter/nightwatch.js +88 -0
  45. package/src/adapter/webdriver.js +1 -2
  46. package/src/bin/cli.js +131 -2
  47. package/src/bin/reportXml.js +4 -1
  48. package/src/bin/startTest.js +2 -1
  49. package/src/bin/uploadArtifacts.js +2 -1
  50. package/src/client.js +1 -2
  51. package/src/config.js +2 -2
  52. package/src/junit-adapter/csharp.js +13 -1
  53. package/src/pipe/bitbucket.js +22 -24
  54. package/src/pipe/debug.js +18 -3
  55. package/src/pipe/github.js +1 -2
  56. package/src/pipe/gitlab.js +27 -9
  57. package/src/pipe/html.js +3 -4
  58. package/src/pipe/testomatio.js +98 -103
  59. package/src/services/logger.js +1 -2
  60. package/src/template/testomatio.hbs +443 -68
  61. package/src/uploader.js +2 -2
  62. package/src/utils/utils.js +19 -9
  63. package/src/xmlReader.js +69 -17
@@ -28,74 +28,449 @@
28
28
  <title>Report Testomat.io</title>
29
29
  {{/if}}
30
30
  <style>
31
- body { padding: 0; margin: 0; font-family: "Inter", sans-serif; } header, div, p, form, input, a, span, button {
32
- box-sizing: border-box; } img { width: 100%; display: block; max-width: 100%; height: auto; } p, span {
33
- font-weight: 400; font-size: 14px; color: grey; margin: 0; } .report { padding-top: 15px; } .level_1 {
34
- margin-bottom: 20px; border-bottom: 2px solid #ABABAB; padding-bottom: 20px; } .header { display: flex;
35
- justify-content: space-between; align-items: center; } .header__point { width: 8px; height: 8px; border-radius:
36
- 50%; margin-right: 15px; } .header__point_red { background: red; } .header__block { display: flex; align-items:
37
- center; } .header__case { display: flex; align-items: center; margin-right: 15px; } .header__case p {
38
- margin-right: 7px; } .header__case span { color: black; } .header__block button { margin-left: 15px; }
39
- .header__type { font-size: 15px; font-weight: 600; background: #CA95FF; color: #FFF; border-radius: 5px; padding:
40
- 5px 35px; margin-right: 15px; } .btn { box-shadow:none!important; } .btn-report { text-decoration: none;
41
- font-weight: 600; background: #CA95FF; color: #FFF!important; border-radius: 5px; padding: 9px 37px; font-size:
42
- 15px; } .run-style { color: #5D5C5D; } .run-span { font-weight: 800!important; color: #5D5C5D!important; }
43
- .btn-report:hover { background: #B468FF; } .border-none { border: none; } .level_4 { height: 53px!important; }
44
- .inputSearch:focus { box-shadow: none; border: 1px solid black!important; background: #FFF!important;
45
- border-radius: 3px; } .btn-all { border: 1px solid #A0CAFF!important; } .btn-passed { border: 1px solid
46
- #75B583!important; } .btn-failed { border: 1px solid #FF6363!important; } .btn-skipped { border: 1px solid
47
- #FFC350!important; } .btn-all:hover, .btn-all:focus { color: #A0CAFF!important; background: #FFF!important;
48
- border: 1px solid #A0CAFF!important; font-weight: 700!important; } .btn-all:hover span, .btn-all:focus span {
49
- color: #A0CAFF!important; font-weight: 700!important; } .allTest:checked + .btn-all span { color:
50
- #A0CAFF!important; } .allTest:checked + .btn-all { color:#A0CAFF!important; background: #FFF!important; border:
51
- 1px solid #A0CAFF!important; font-weight: 700!important; } .btn-passed:hover, .btn-passed:focus { color:
52
- #75B583!important; border: 1px solid #75B583!important; background: #FFF!important; font-weight: 700!important; }
53
- .btn-passed:hover span, .btn-passed:focus span { color: #75B583!important; font-weight: 700!important; }
54
- .passedTest:checked + .btn-passed span { color: #75B583!important; font-weight: 700!important; }
55
- .passedTest:checked + .btn-passed { color: #75B583!important; border: 1px solid #75B583!important; background:
56
- #FFF!important; font-weight: 700!important; } .btn-failed:hover, .btn-failed:focus { color: #FF6363!important;
57
- border: 1px solid #FF6363!important; background: #FFF!important; font-weight: 700!important; } .btn-failed:hover
58
- span, .btn-failed:focus span { color: #FF6363!important; font-weight: 700!important; } .failedTest:checked +
59
- .btn-failed span { color: #FF6363!important; font-weight: 700!important; } .failedTest:checked + .btn-failed {
60
- color: #FF6363!important; border: 1px solid #FF6363!important; background: #FFF!important; font-weight:
61
- 700!important; } .btn-skipped:hover, .btn-skipped:focus { color: #FFC350!important; border: 1px solid
62
- #FFC350!important; background: #FFF!important; font-weight: 700!important; } .btn-skipped:hover span,
63
- .btn-skipped:focus span { color: #FFC350!important; font-weight: 700!important; } .skippedTest:checked +
64
- .btn-skipped span { color: #FFC350!important; font-weight: 700!important; } .skippedTest:checked + .btn-skipped {
65
- color: #FFC350!important; border: 1px solid #FFC350!important; background: #FFF!important; font-weight:
66
- 700!important; } .passed { color: #75B583; } .failed { color: #FF6363; } .skipped { color: #FFC350; } .testWrapp {
67
- margin-top: 45px; } .fa-arrow-right { display: none!important; } .header__type:hover { background: #B468FF; }
68
- .header__case i { color: grey; margin-right: 5px; } .title { display: flex; margin-bottom: 20px; } .title p {
69
- color: #262523; font-size: 15px; font-weight: 500; margin-right: 5px; } .statright { display: flex; } .statdesc {
70
- display: flex; flex-direction: column; } .statdesc__row { padding: 15px 25px; display: flex; border-radius: 5px; }
71
- .statdesc__row_first { width: 150px; } .statdesc__row:nth-child(odd) { background: #F6FAFF; } .statdesc__row p,
72
- .statdesc__row span { font-weight: semi-bold; font-size: 11px; } .statdesc { width: 100%; } .statstatus { display:
73
- flex; align-items: center; } .statstatus p { font-weight: bold; } .statstatus div { font-weight: bold; }
74
- .statstatus_failed div { width: 10px; height: 10px; border-radius: 50%; margin-right: 5px; } .statstatus_failed p
75
- { color: red; text-transform: uppercase; } .statstatus_failed div { background: red; } .statstatus_passed div {
76
- width: 10px; height: 10px; border-radius: 50%; margin-right: 5px; text-transform: uppercase; } .statstatus_passed
77
- div { background: green; } .statstatus_passed p { color: green; text-transform: uppercase; } .statstatus_skipped
78
- div{ width: 10px; height: 10px; border-radius: 50%; margin-right: 5px; text-transform: uppercase; }
79
- .statstatus_skipped div { background: yellow; } .statstatus_skipped p { color: yellow; text-transform: uppercase;
80
- } .fa-magnifying-glass { font-size: 24px; color: gray; } .numTest { font-weight: 500; font-size: 16px; color:
81
- #0D6EFD; } .testitem { border: 1px solid grey; border-radius: 3px; margin-bottom: 15px; } .testitem__top { width:
82
- 100%; display: flex; background: #F6FAFF; padding: 15px 13px 15px 30px; border-radius: 10px; cursor: pointer;
83
- justify-content: space-between; } .testitem__icon { display: flex; align-items: center; justify-content: center;
84
- width: 30px; margin-right: 5px; } .testitem__ico { font-size: 18px; } .testitem__name { font-weight: 700; color:
85
- black; font-size: 16px; } .testitem__body { display: flex; background-color: #FFF; margin-top: 10px; }
86
- .testitem__menu { display: flex; flex-direction: column; padding: 21px 51px 21px 51px; } .testitem__mitem {
87
- font-size: 15px; font-weight: 600; cursor: pointer; color: #808080; width: 170px; height: 65px; text-align:
88
- center; padding-top: 20px; padding-bottom: 20px; } .testitem__mitem_active { background: #F6FAFF; color: #4D4C4C;
89
- font-weight: 700; } .testitem__case { display: flex; flex-direction: column; padding: 10px; } .testitem__title {
90
- font-size: 18px; color: black; font-weight: 700; margin-bottom: 15px; text-decoration: underline; }
91
- .testitem__block p { font-size: 14px; white-space: pre-line; } .test__empty__list { margin-bottom: 10px; color:
92
- grey; } .testitem__content { width: 92%; } /* Pagination component styles*/ .page-link { color: black;
93
- background-color: #F6FAFF; padding: 7px 19px; font-weight: 600; border-radius: 3px; } .page-link:hover { color:
94
- black; } .form-select { background-color:#F6FAFF; } .form-select:focus { border-color: #ADADAD; box-shadow: 0 0 0
95
- 0.25rem rgb(67 71 78 / 25%); } .page-item:not(:first-child) { margin-left: 15px; } .page-item.active .page-link {
96
- background: #F6FAFF; border: 2px solid #4384FE; color: black; } .noData { display: flex; align-items: center;
97
- flex-direction: column; justify-content: center; margin-bottom: 150px; } .noDataText { font-weight: 600;
98
- font-size: 20px; color: #A1A1A1; }
31
+ body {
32
+ padding: 0;
33
+ margin: 0;
34
+ font-family: 'Inter', sans-serif;
35
+ }
36
+ header,
37
+ div,
38
+ p,
39
+ form,
40
+ input,
41
+ a,
42
+ span,
43
+ button {
44
+ box-sizing: border-box;
45
+ }
46
+ img {
47
+ width: 100%;
48
+ display: block;
49
+ max-width: 100%;
50
+ height: auto;
51
+ }
52
+ p,
53
+ span {
54
+ font-weight: 400;
55
+ font-size: 14px;
56
+ color: grey;
57
+ margin: 0;
58
+ }
59
+ .report {
60
+ padding-top: 15px;
61
+ }
62
+ .level_1 {
63
+ margin-bottom: 20px;
64
+ border-bottom: 2px solid #ababab;
65
+ padding-bottom: 20px;
66
+ }
67
+ .header {
68
+ display: flex;
69
+ justify-content: space-between;
70
+ align-items: center;
71
+ }
72
+ .header__point {
73
+ width: 8px;
74
+ height: 8px;
75
+ border-radius: 50%;
76
+ margin-right: 15px;
77
+ }
78
+ .header__point_red {
79
+ background: red;
80
+ }
81
+ .header__block {
82
+ display: flex;
83
+ align-items: center;
84
+ }
85
+ .header__case {
86
+ display: flex;
87
+ align-items: center;
88
+ margin-right: 15px;
89
+ }
90
+ .header__case p {
91
+ margin-right: 7px;
92
+ }
93
+ .header__case span {
94
+ color: black;
95
+ }
96
+ .header__block button {
97
+ margin-left: 15px;
98
+ }
99
+ .header__type {
100
+ font-size: 15px;
101
+ font-weight: 600;
102
+ background: #ca95ff;
103
+ color: #fff;
104
+ border-radius: 5px;
105
+ padding: 5px 35px;
106
+ margin-right: 15px;
107
+ }
108
+ .btn {
109
+ box-shadow: none !important;
110
+ }
111
+ .btn-report {
112
+ text-decoration: none;
113
+ font-weight: 600;
114
+ background: #ca95ff;
115
+ color: #fff !important;
116
+ border-radius: 5px;
117
+ padding: 9px 37px;
118
+ font-size: 15px;
119
+ }
120
+ .run-style {
121
+ color: #5d5c5d;
122
+ }
123
+ .run-span {
124
+ font-weight: 800 !important;
125
+ color: #5d5c5d !important;
126
+ }
127
+ .btn-report:hover {
128
+ background: #b468ff;
129
+ }
130
+ .border-none {
131
+ border: none;
132
+ }
133
+ .level_4 {
134
+ height: 53px !important;
135
+ }
136
+ .inputSearch:focus {
137
+ box-shadow: none;
138
+ border: 1px solid black !important;
139
+ background: #fff !important;
140
+ border-radius: 3px;
141
+ }
142
+ .btn-all {
143
+ border: 1px solid #a0caff !important;
144
+ }
145
+ .btn-passed {
146
+ border: 1px solid #75b583 !important;
147
+ }
148
+ .btn-failed {
149
+ border: 1px solid #ff6363 !important;
150
+ }
151
+ .btn-skipped {
152
+ border: 1px solid #ffc350 !important;
153
+ }
154
+ .btn-all:hover,
155
+ .btn-all:focus {
156
+ color: #a0caff !important;
157
+ background: #fff !important;
158
+ border: 1px solid #a0caff !important;
159
+ font-weight: 700 !important;
160
+ }
161
+ .btn-all:hover span,
162
+ .btn-all:focus span {
163
+ color: #a0caff !important;
164
+ font-weight: 700 !important;
165
+ }
166
+ .allTest:checked + .btn-all span {
167
+ color: #a0caff !important;
168
+ }
169
+ .allTest:checked + .btn-all {
170
+ color: #a0caff !important;
171
+ background: #fff !important;
172
+ border: 1px solid #a0caff !important;
173
+ font-weight: 700 !important;
174
+ }
175
+ .btn-passed:hover,
176
+ .btn-passed:focus {
177
+ color: #75b583 !important;
178
+ border: 1px solid #75b583 !important;
179
+ background: #fff !important;
180
+ font-weight: 700 !important;
181
+ }
182
+ .btn-passed:hover span,
183
+ .btn-passed:focus span {
184
+ color: #75b583 !important;
185
+ font-weight: 700 !important;
186
+ }
187
+ .passedTest:checked + .btn-passed span {
188
+ color: #75b583 !important;
189
+ font-weight: 700 !important;
190
+ }
191
+ .passedTest:checked + .btn-passed {
192
+ color: #75b583 !important;
193
+ border: 1px solid #75b583 !important;
194
+ background: #fff !important;
195
+ font-weight: 700 !important;
196
+ }
197
+ .btn-failed:hover,
198
+ .btn-failed:focus {
199
+ color: #ff6363 !important;
200
+ border: 1px solid #ff6363 !important;
201
+ background: #fff !important;
202
+ font-weight: 700 !important;
203
+ }
204
+ .btn-failed:hover span,
205
+ .btn-failed:focus span {
206
+ color: #ff6363 !important;
207
+ font-weight: 700 !important;
208
+ }
209
+ .failedTest:checked + .btn-failed span {
210
+ color: #ff6363 !important;
211
+ font-weight: 700 !important;
212
+ }
213
+ .failedTest:checked + .btn-failed {
214
+ color: #ff6363 !important;
215
+ border: 1px solid #ff6363 !important;
216
+ background: #fff !important;
217
+ font-weight: 700 !important;
218
+ }
219
+ .btn-skipped:hover,
220
+ .btn-skipped:focus {
221
+ color: #ffc350 !important;
222
+ border: 1px solid #ffc350 !important;
223
+ background: #fff !important;
224
+ font-weight: 700 !important;
225
+ }
226
+ .btn-skipped:hover span,
227
+ .btn-skipped:focus span {
228
+ color: #ffc350 !important;
229
+ font-weight: 700 !important;
230
+ }
231
+ .skippedTest:checked + .btn-skipped span {
232
+ color: #ffc350 !important;
233
+ font-weight: 700 !important;
234
+ }
235
+ .skippedTest:checked + .btn-skipped {
236
+ color: #ffc350 !important;
237
+ border: 1px solid #ffc350 !important;
238
+ background: #fff !important;
239
+ font-weight: 700 !important;
240
+ }
241
+ .passed {
242
+ color: #75b583;
243
+ }
244
+ .failed {
245
+ color: #ff6363;
246
+ }
247
+ .skipped {
248
+ color: #ffc350;
249
+ }
250
+ .testWrapp {
251
+ margin-top: 45px;
252
+ }
253
+ .fa-arrow-right {
254
+ display: none !important;
255
+ }
256
+ .header__type:hover {
257
+ background: #b468ff;
258
+ }
259
+ .header__case i {
260
+ color: grey;
261
+ margin-right: 5px;
262
+ }
263
+ .title {
264
+ display: flex;
265
+ margin-bottom: 20px;
266
+ }
267
+ .title p {
268
+ color: #262523;
269
+ font-size: 15px;
270
+ font-weight: 500;
271
+ margin-right: 5px;
272
+ }
273
+ .statright {
274
+ display: flex;
275
+ }
276
+ .statdesc {
277
+ display: flex;
278
+ flex-direction: column;
279
+ }
280
+ .statdesc__row {
281
+ padding: 15px 25px;
282
+ display: flex;
283
+ border-radius: 5px;
284
+ }
285
+ .statdesc__row_first {
286
+ width: 150px;
287
+ }
288
+ .statdesc__row:nth-child(odd) {
289
+ background: #f6faff;
290
+ }
291
+ .statdesc__row p,
292
+ .statdesc__row span {
293
+ font-weight: semi-bold;
294
+ font-size: 11px;
295
+ }
296
+ .statdesc {
297
+ width: 100%;
298
+ }
299
+ .statstatus {
300
+ display: flex;
301
+ align-items: center;
302
+ }
303
+ .statstatus p {
304
+ font-weight: bold;
305
+ }
306
+ .statstatus div {
307
+ font-weight: bold;
308
+ }
309
+ .statstatus_failed div {
310
+ width: 10px;
311
+ height: 10px;
312
+ border-radius: 50%;
313
+ margin-right: 5px;
314
+ }
315
+ .statstatus_failed p {
316
+ color: red;
317
+ text-transform: uppercase;
318
+ }
319
+ .statstatus_failed div {
320
+ background: red;
321
+ }
322
+ .statstatus_passed div {
323
+ width: 10px;
324
+ height: 10px;
325
+ border-radius: 50%;
326
+ margin-right: 5px;
327
+ text-transform: uppercase;
328
+ }
329
+ .statstatus_passed div {
330
+ background: green;
331
+ }
332
+ .statstatus_passed p {
333
+ color: green;
334
+ text-transform: uppercase;
335
+ }
336
+ .statstatus_skipped div {
337
+ width: 10px;
338
+ height: 10px;
339
+ border-radius: 50%;
340
+ margin-right: 5px;
341
+ text-transform: uppercase;
342
+ }
343
+ .statstatus_skipped div {
344
+ background: yellow;
345
+ }
346
+ .statstatus_skipped p {
347
+ color: yellow;
348
+ text-transform: uppercase;
349
+ }
350
+ .fa-magnifying-glass {
351
+ font-size: 24px;
352
+ color: gray;
353
+ }
354
+ .numTest {
355
+ font-weight: 500;
356
+ font-size: 16px;
357
+ color: #0d6efd;
358
+ }
359
+ .testitem {
360
+ border: 1px solid grey;
361
+ border-radius: 3px;
362
+ margin-bottom: 15px;
363
+ }
364
+ .testitem__top {
365
+ width: 100%;
366
+ display: flex;
367
+ background: #f6faff;
368
+ padding: 15px 13px 15px 30px;
369
+ border-radius: 10px;
370
+ cursor: pointer;
371
+ justify-content: space-between;
372
+ }
373
+ .testitem__icon {
374
+ display: flex;
375
+ align-items: center;
376
+ justify-content: center;
377
+ width: 30px;
378
+ margin-right: 5px;
379
+ }
380
+ .testitem__ico {
381
+ font-size: 18px;
382
+ }
383
+ .testitem__name {
384
+ font-weight: 700;
385
+ color: black;
386
+ font-size: 16px;
387
+ }
388
+ .testitem__body {
389
+ display: flex;
390
+ background-color: #fff;
391
+ margin-top: 10px;
392
+ }
393
+ .testitem__menu {
394
+ display: flex;
395
+ flex-direction: column;
396
+ padding: 21px 51px 21px 51px;
397
+ }
398
+ .testitem__mitem {
399
+ font-size: 15px;
400
+ font-weight: 600;
401
+ cursor: pointer;
402
+ color: #808080;
403
+ width: 170px;
404
+ height: 65px;
405
+ text-align: center;
406
+ padding-top: 20px;
407
+ padding-bottom: 20px;
408
+ }
409
+ .testitem__mitem_active {
410
+ background: #f6faff;
411
+ color: #4d4c4c;
412
+ font-weight: 700;
413
+ }
414
+ .testitem__case {
415
+ display: flex;
416
+ flex-direction: column;
417
+ padding: 10px;
418
+ }
419
+ .testitem__title {
420
+ font-size: 18px;
421
+ color: black;
422
+ font-weight: 700;
423
+ margin-bottom: 15px;
424
+ text-decoration: underline;
425
+ }
426
+ .testitem__block p {
427
+ font-size: 14px;
428
+ white-space: pre-line;
429
+ }
430
+ .test__empty__list {
431
+ margin-bottom: 10px;
432
+ color: grey;
433
+ }
434
+ .testitem__content {
435
+ width: 92%;
436
+ } /* Pagination component styles*/
437
+ .page-link {
438
+ color: black;
439
+ background-color: #f6faff;
440
+ padding: 7px 19px;
441
+ font-weight: 600;
442
+ border-radius: 3px;
443
+ }
444
+ .page-link:hover {
445
+ color: black;
446
+ }
447
+ .form-select {
448
+ background-color: #f6faff;
449
+ }
450
+ .form-select:focus {
451
+ border-color: #adadad;
452
+ box-shadow: 0 0 0 0.25rem rgb(67 71 78 / 25%);
453
+ }
454
+ .page-item:not(:first-child) {
455
+ margin-left: 15px;
456
+ }
457
+ .page-item.active .page-link {
458
+ background: #f6faff;
459
+ border: 2px solid #4384fe;
460
+ color: black;
461
+ }
462
+ .noData {
463
+ display: flex;
464
+ align-items: center;
465
+ flex-direction: column;
466
+ justify-content: center;
467
+ margin-bottom: 150px;
468
+ }
469
+ .noDataText {
470
+ font-weight: 600;
471
+ font-size: 20px;
472
+ color: #a1a1a1;
473
+ }
99
474
  </style>
100
475
  </head>
101
476
 
package/src/uploader.js CHANGED
@@ -255,7 +255,7 @@ export class S3Uploader {
255
255
  debug('File:', filePath, 'exists, size:', prettyBytes(fileSize));
256
256
 
257
257
  const fileStream = fs.createReadStream(filePath);
258
- const Key = pathInS3.join('/');
258
+ const Key = pathInS3.filter(p => !!p).join('/');
259
259
 
260
260
  const link = await this.#uploadToS3(fileStream, Key, { path: filePath, size: fileSize });
261
261
 
@@ -272,7 +272,7 @@ export class S3Uploader {
272
272
  async uploadFileAsBuffer(buffer, pathInS3) {
273
273
  if (!this.isEnabled) return;
274
274
 
275
- let Key = pathInS3.join('/');
275
+ let Key = pathInS3.filter(p => !!p).join('/');
276
276
  const ext = this.#getFileExtBase64(buffer);
277
277
 
278
278
  if (ext) {
@@ -5,9 +5,16 @@ import fs from 'fs';
5
5
  import isValid from 'is-valid-path';
6
6
  import createDebugMessages from 'debug';
7
7
  import os from 'os';
8
+ import { fileURLToPath } from 'url';
8
9
 
9
10
  const debug = createDebugMessages('@testomatio/reporter:util');
10
11
 
12
+ // Use __dirname directly since we're compiling to CommonJS
13
+ // prettier-ignore
14
+ // @ts-ignore
15
+ // eslint-disable-next-line max-len
16
+ const __dirname = typeof global.__dirname !== 'undefined' ? global.__dirname : path.dirname(fileURLToPath(import.meta.url));
17
+
11
18
  /**
12
19
  * @param {String} testTitle - Test title
13
20
  *
@@ -50,7 +57,6 @@ const ansiRegExp = () => {
50
57
 
51
58
  const isValidUrl = s => {
52
59
  try {
53
- // eslint-disable-next-line no-new
54
60
  new URL(s);
55
61
  return true;
56
62
  } catch (err) {
@@ -108,7 +114,7 @@ const fetchSourceCodeFromStackTrace = (stack = '') => {
108
114
  .join('\n');
109
115
  };
110
116
 
111
- const TEST_ID_REGEX = /@T([\w\d]{8})/;
117
+ export const TEST_ID_REGEX = /@T([\w\d]{8})/;
112
118
 
113
119
  const fetchIdFromCode = (code, opts = {}) => {
114
120
  const comments = code
@@ -128,12 +134,9 @@ const fetchIdFromCode = (code, opts = {}) => {
128
134
  };
129
135
 
130
136
  const fetchIdFromOutput = output => {
131
- const lines = output
132
- .split('\n')
133
- .map(l => l.trim())
134
- .filter(l => l.startsWith('tid://'));
137
+ const TID_FULL_PATTERN = new RegExp(`tid:\\/\\/.*?(${TEST_ID_REGEX.source})`);
135
138
 
136
- return lines.find(c => c.match(TEST_ID_REGEX))?.match(TEST_ID_REGEX)?.[1];
139
+ return output.match(TID_FULL_PATTERN)?.[2];
137
140
  };
138
141
 
139
142
  const fetchSourceCode = (contents, opts = {}) => {
@@ -154,6 +157,9 @@ const fetchSourceCode = (contents, opts = {}) => {
154
157
  if (lineIndex === -1) lineIndex = lines.findIndex(l => l.includes(`@DisplayName("${title}`));
155
158
  if (lineIndex === -1) lineIndex = lines.findIndex(l => l.includes(`public void ${title}`));
156
159
  if (lineIndex === -1) lineIndex = lines.findIndex(l => l.includes(`${title}(`));
160
+ } else if (opts.lang === 'csharp') {
161
+ if (lineIndex === -1) lineIndex = lines.findIndex(l => l.includes(`public void ${title}`));
162
+ if (lineIndex === -1) lineIndex = lines.findIndex(l => l.includes(`${title}(`));
157
163
  } else {
158
164
  lineIndex = lines.findIndex(l => l.includes(title));
159
165
  }
@@ -300,7 +306,6 @@ const decamelize = text => {
300
306
  * @returns
301
307
  */
302
308
  function removeColorCodes(input) {
303
- // eslint-disable-next-line no-control-regex
304
309
  return input.replace(/\x1b\[[0-9;]*m/g, '');
305
310
  }
306
311
 
@@ -313,7 +318,6 @@ const testRunnerHelper = {
313
318
  try {
314
319
  // TODO: expect?.getState()?.testPath + ' ' + expect?.getState()?.currentTestName
315
320
  // @ts-expect-error "expect" could only be defined inside Jest environement (forbidden to import it outside)
316
- // eslint-disable-next-line no-undef
317
321
  return expect?.getState()?.currentTestName;
318
322
  } catch (e) {
319
323
  return null;
@@ -359,6 +363,12 @@ function formatStep(step, shift = 0) {
359
363
  return lines;
360
364
  }
361
365
 
366
+ export function getPackageVersion() {
367
+ const packageJsonPath = path.resolve(__dirname, '../../package.json');
368
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
369
+ return packageJson.version;
370
+ }
371
+
362
372
  export {
363
373
  ansiRegExp,
364
374
  isSameTest,