@testream/dotnet-reporter 1.1.0 → 1.1.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.
package/dist/index.js CHANGED
@@ -2,15 +2,15 @@
2
2
  require('./sourcemap-register.js');/******/ (() => { // webpackBootstrap
3
3
  /******/ var __webpack_modules__ = ({
4
4
 
5
- /***/ 537:
5
+ /***/ 1537:
6
6
  /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
7
7
 
8
8
  "use strict";
9
9
 
10
10
 
11
11
  const validator = __nccwpck_require__(93);
12
- const XMLParser = __nccwpck_require__(360);
13
- const XMLBuilder = __nccwpck_require__(823);
12
+ const XMLParser = __nccwpck_require__(2360);
13
+ const XMLBuilder = __nccwpck_require__(2823);
14
14
 
15
15
  module.exports = {
16
16
  XMLParser: XMLParser,
@@ -20,7 +20,7 @@ module.exports = {
20
20
 
21
21
  /***/ }),
22
22
 
23
- /***/ 64:
23
+ /***/ 3064:
24
24
  /***/ ((module) => {
25
25
 
26
26
  function getIgnoreAttributesFn(ignoreAttributes) {
@@ -46,7 +46,7 @@ module.exports = getIgnoreAttributesFn
46
46
 
47
47
  /***/ }),
48
48
 
49
- /***/ 559:
49
+ /***/ 7559:
50
50
  /***/ ((__unused_webpack_module, exports) => {
51
51
 
52
52
  "use strict";
@@ -132,7 +132,7 @@ exports.nameRegexp = nameRegexp;
132
132
  "use strict";
133
133
 
134
134
 
135
- const util = __nccwpck_require__(559);
135
+ const util = __nccwpck_require__(7559);
136
136
 
137
137
  const defaultOptions = {
138
138
  allowBooleanAttributes: false, //A tag can have attributes without any value
@@ -559,14 +559,14 @@ function getPositionFromMatch(match) {
559
559
 
560
560
  /***/ }),
561
561
 
562
- /***/ 823:
562
+ /***/ 2823:
563
563
  /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
564
564
 
565
565
  "use strict";
566
566
 
567
567
  //parse Empty Node as self closing node
568
- const buildFromOrderedJs = __nccwpck_require__(57);
569
- const getIgnoreAttributesFn = __nccwpck_require__(64)
568
+ const buildFromOrderedJs = __nccwpck_require__(1057);
569
+ const getIgnoreAttributesFn = __nccwpck_require__(3064)
570
570
 
571
571
  const defaultOptions = {
572
572
  attributeNamePrefix: '@_',
@@ -853,7 +853,7 @@ module.exports = Builder;
853
853
 
854
854
  /***/ }),
855
855
 
856
- /***/ 57:
856
+ /***/ 1057:
857
857
  /***/ ((module) => {
858
858
 
859
859
  const EOL = "\n";
@@ -995,10 +995,10 @@ module.exports = toXml;
995
995
 
996
996
  /***/ }),
997
997
 
998
- /***/ 91:
998
+ /***/ 2091:
999
999
  /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
1000
1000
 
1001
- const util = __nccwpck_require__(559);
1001
+ const util = __nccwpck_require__(7559);
1002
1002
 
1003
1003
  //TODO: handle comments
1004
1004
  function readDocType(xmlData, i){
@@ -1209,18 +1209,18 @@ exports.defaultOptions = defaultOptions;
1209
1209
 
1210
1210
  /***/ }),
1211
1211
 
1212
- /***/ 629:
1212
+ /***/ 2629:
1213
1213
  /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
1214
1214
 
1215
1215
  "use strict";
1216
1216
 
1217
1217
  ///@ts-check
1218
1218
 
1219
- const util = __nccwpck_require__(559);
1220
- const xmlNode = __nccwpck_require__(79);
1221
- const readDocType = __nccwpck_require__(91);
1222
- const toNumber = __nccwpck_require__(236);
1223
- const getIgnoreAttributesFn = __nccwpck_require__(64)
1219
+ const util = __nccwpck_require__(7559);
1220
+ const xmlNode = __nccwpck_require__(7079);
1221
+ const readDocType = __nccwpck_require__(2091);
1222
+ const toNumber = __nccwpck_require__(6236);
1223
+ const getIgnoreAttributesFn = __nccwpck_require__(3064)
1224
1224
 
1225
1225
  // const regx =
1226
1226
  // '<((!\\[CDATA\\[([\\s\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\/)(NAME)\\s*>))([^<]*)'
@@ -1823,12 +1823,12 @@ module.exports = OrderedObjParser;
1823
1823
 
1824
1824
  /***/ }),
1825
1825
 
1826
- /***/ 360:
1826
+ /***/ 2360:
1827
1827
  /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
1828
1828
 
1829
1829
  const { buildOptions} = __nccwpck_require__(901);
1830
- const OrderedObjParser = __nccwpck_require__(629);
1831
- const { prettify} = __nccwpck_require__(318);
1830
+ const OrderedObjParser = __nccwpck_require__(2629);
1831
+ const { prettify} = __nccwpck_require__(5318);
1832
1832
  const validator = __nccwpck_require__(93);
1833
1833
 
1834
1834
  class XMLParser{
@@ -1887,7 +1887,7 @@ module.exports = XMLParser;
1887
1887
 
1888
1888
  /***/ }),
1889
1889
 
1890
- /***/ 318:
1890
+ /***/ 5318:
1891
1891
  /***/ ((__unused_webpack_module, exports) => {
1892
1892
 
1893
1893
  "use strict";
@@ -2008,7 +2008,7 @@ exports.prettify = prettify;
2008
2008
 
2009
2009
  /***/ }),
2010
2010
 
2011
- /***/ 79:
2011
+ /***/ 7079:
2012
2012
  /***/ ((module) => {
2013
2013
 
2014
2014
  "use strict";
@@ -2040,7 +2040,7 @@ module.exports = XmlNode;
2040
2040
 
2041
2041
  /***/ }),
2042
2042
 
2043
- /***/ 236:
2043
+ /***/ 6236:
2044
2044
  /***/ ((module) => {
2045
2045
 
2046
2046
  const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;
@@ -2157,7 +2157,7 @@ module.exports = toNumber;
2157
2157
 
2158
2158
  /***/ }),
2159
2159
 
2160
- /***/ 406:
2160
+ /***/ 2406:
2161
2161
  /***/ ((__unused_webpack_module, exports) => {
2162
2162
 
2163
2163
  "use strict";
@@ -2296,7 +2296,7 @@ function detectCIContext() {
2296
2296
 
2297
2297
  /***/ }),
2298
2298
 
2299
- /***/ 827:
2299
+ /***/ 3827:
2300
2300
  /***/ ((__unused_webpack_module, exports) => {
2301
2301
 
2302
2302
  "use strict";
@@ -2307,7 +2307,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
2307
2307
 
2308
2308
  /***/ }),
2309
2309
 
2310
- /***/ 322:
2310
+ /***/ 7322:
2311
2311
  /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
2312
2312
 
2313
2313
  "use strict";
@@ -2329,10 +2329,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
2329
2329
  Object.defineProperty(exports, "__esModule", ({ value: true }));
2330
2330
  exports.ensureReportId = exports.mapAttachmentsToTestResults = exports.uploadArtifacts = exports.uploadTestRun = exports.detectCIContext = void 0;
2331
2331
  // CTRF types
2332
- __exportStar(__nccwpck_require__(827), exports);
2333
- var ci_detection_1 = __nccwpck_require__(406);
2332
+ __exportStar(__nccwpck_require__(3827), exports);
2333
+ var ci_detection_1 = __nccwpck_require__(2406);
2334
2334
  Object.defineProperty(exports, "detectCIContext", ({ enumerable: true, get: function () { return ci_detection_1.detectCIContext; } }));
2335
- var upload_1 = __nccwpck_require__(969);
2335
+ var upload_1 = __nccwpck_require__(8969);
2336
2336
  Object.defineProperty(exports, "uploadTestRun", ({ enumerable: true, get: function () { return upload_1.uploadTestRun; } }));
2337
2337
  Object.defineProperty(exports, "uploadArtifacts", ({ enumerable: true, get: function () { return upload_1.uploadArtifacts; } }));
2338
2338
  Object.defineProperty(exports, "mapAttachmentsToTestResults", ({ enumerable: true, get: function () { return upload_1.mapAttachmentsToTestResults; } }));
@@ -2341,7 +2341,7 @@ Object.defineProperty(exports, "ensureReportId", ({ enumerable: true, get: funct
2341
2341
 
2342
2342
  /***/ }),
2343
2343
 
2344
- /***/ 969:
2344
+ /***/ 8969:
2345
2345
  /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
2346
2346
 
2347
2347
  "use strict";
@@ -2351,10 +2351,11 @@ exports.ensureReportId = ensureReportId;
2351
2351
  exports.uploadTestRun = uploadTestRun;
2352
2352
  exports.mapAttachmentsToTestResults = mapAttachmentsToTestResults;
2353
2353
  exports.uploadArtifacts = uploadArtifacts;
2354
- const ci_detection_1 = __nccwpck_require__(406);
2355
- const DEFAULT_API_URL = 'https://test-manager-backend.fly.dev';
2354
+ const ci_detection_1 = __nccwpck_require__(2406);
2355
+ const DEFAULT_API_URL = "https://test-manager-backend.fly.dev";
2356
2356
  function ensureReportId(report) {
2357
- if (typeof report.reportId === 'string' && report.reportId.trim().length > 0) {
2357
+ if (typeof report.reportId === "string" &&
2358
+ report.reportId.trim().length > 0) {
2358
2359
  return report.reportId;
2359
2360
  }
2360
2361
  const reportId = crypto.randomUUID();
@@ -2373,7 +2374,7 @@ function resolveApiUrl(explicitApiUrl) {
2373
2374
  return DEFAULT_API_URL;
2374
2375
  }
2375
2376
  function getEnvApiUrl() {
2376
- if (typeof process === 'undefined' || !process?.env) {
2377
+ if (typeof process === "undefined" || !process?.env) {
2377
2378
  return undefined;
2378
2379
  }
2379
2380
  return normalizeApiUrl(process.env.TESTREAM_API_URL);
@@ -2386,20 +2387,25 @@ function normalizeApiUrl(value) {
2386
2387
  if (!trimmed) {
2387
2388
  return undefined;
2388
2389
  }
2389
- return trimmed.replace(/\/+$/, '');
2390
+ // Use while loop instead of regex for better performance and clarity
2391
+ let result = trimmed;
2392
+ while (result.endsWith("/")) {
2393
+ result = result.slice(0, -1);
2394
+ }
2395
+ return result;
2390
2396
  }
2391
2397
  function isReportAlreadyExistsConflict(error) {
2392
- return error.errorCode === 'report_already_exists';
2398
+ return error.errorCode === "report_already_exists";
2393
2399
  }
2394
2400
  function formatUploadError(error) {
2395
- const detail = error.detail || error.title || error.rawBody || 'Unknown error';
2396
- const codeLabel = error.errorCode ? `, code=${error.errorCode}` : '';
2401
+ const detail = error.detail || error.title || error.rawBody || "Unknown error";
2402
+ const codeLabel = error.errorCode ? `, code=${error.errorCode}` : "";
2397
2403
  return `Upload failed (HTTP ${error.statusCode}${codeLabel}): ${detail}`;
2398
2404
  }
2399
2405
  async function parseHttpError(response) {
2400
2406
  const rawBody = await response.text();
2401
- const contentType = response.headers.get('content-type') || '';
2402
- if (contentType.toLowerCase().includes('json') && rawBody.trim().length > 0) {
2407
+ const contentType = response.headers.get("content-type") || "";
2408
+ if (contentType.toLowerCase().includes("json") && rawBody.trim().length > 0) {
2403
2409
  try {
2404
2410
  const parsed = JSON.parse(rawBody);
2405
2411
  return {
@@ -2449,14 +2455,14 @@ async function uploadTestRun(options) {
2449
2455
  ...uploadContext,
2450
2456
  };
2451
2457
  // Professional logging
2452
- console.log('Uploading test results...');
2458
+ console.log("Uploading test results...");
2453
2459
  let response;
2454
2460
  try {
2455
2461
  response = await fetch(`${apiUrl}/api/v1/ingest`, {
2456
- method: 'POST',
2462
+ method: "POST",
2457
2463
  headers: {
2458
- 'X-API-KEY': apiKey,
2459
- 'Content-Type': 'application/json',
2464
+ "X-API-KEY": apiKey,
2465
+ "Content-Type": "application/json",
2460
2466
  },
2461
2467
  body: JSON.stringify(ingestPayload),
2462
2468
  });
@@ -2474,7 +2480,7 @@ async function uploadTestRun(options) {
2474
2480
  if (!response.ok) {
2475
2481
  const parsedError = await parseHttpError(response);
2476
2482
  if (response.status === 409 && isReportAlreadyExistsConflict(parsedError)) {
2477
- console.warn('Report already exists (workflow may have been re-run)');
2483
+ console.warn("Report already exists (workflow may have been re-run)");
2478
2484
  return {
2479
2485
  success: true,
2480
2486
  reportId,
@@ -2582,8 +2588,8 @@ async function uploadArtifacts(options) {
2582
2588
  async function uploadSingleArtifact(options) {
2583
2589
  const { testResultId, attachment, reportId, apiKey, apiUrl } = options;
2584
2590
  // Dynamically import fs for Node.js environments
2585
- const fs = await Promise.resolve(/* import() */).then(__nccwpck_require__.t.bind(__nccwpck_require__, 943, 23));
2586
- const path = await Promise.resolve(/* import() */).then(__nccwpck_require__.t.bind(__nccwpck_require__, 928, 23));
2591
+ const fs = await Promise.resolve(/* import() */).then(__nccwpck_require__.t.bind(__nccwpck_require__, 1943, 23));
2592
+ const path = await Promise.resolve(/* import() */).then(__nccwpck_require__.t.bind(__nccwpck_require__, 6928, 23));
2587
2593
  const filePath = path.resolve(attachment.path);
2588
2594
  // Check if file exists
2589
2595
  try {
@@ -2597,7 +2603,7 @@ async function uploadSingleArtifact(options) {
2597
2603
  let fileBuffer;
2598
2604
  let sizeBytes;
2599
2605
  const fileName = path.basename(filePath);
2600
- const contentType = attachment.contentType || 'application/octet-stream';
2606
+ const contentType = attachment.contentType || "application/octet-stream";
2601
2607
  try {
2602
2608
  fileBuffer = await fs.readFile(filePath);
2603
2609
  sizeBytes = fileBuffer.byteLength;
@@ -2637,7 +2643,7 @@ async function uploadSingleArtifact(options) {
2637
2643
  }
2638
2644
  class LegacyUploadRequiredError extends Error {
2639
2645
  constructor() {
2640
- super('Legacy upload endpoint required');
2646
+ super("Legacy upload endpoint required");
2641
2647
  }
2642
2648
  }
2643
2649
  async function uploadWithPresignedUrl(options) {
@@ -2650,10 +2656,10 @@ async function uploadWithPresignedUrl(options) {
2650
2656
  sizeBytes,
2651
2657
  };
2652
2658
  const initResponse = await fetch(`${apiUrl}/api/v1/artifacts/${reportId}/upload-url`, {
2653
- method: 'POST',
2659
+ method: "POST",
2654
2660
  headers: {
2655
- 'X-API-KEY': apiKey,
2656
- 'Content-Type': 'application/json',
2661
+ "X-API-KEY": apiKey,
2662
+ "Content-Type": "application/json",
2657
2663
  },
2658
2664
  body: JSON.stringify(initPayload),
2659
2665
  });
@@ -2665,12 +2671,14 @@ async function uploadWithPresignedUrl(options) {
2665
2671
  throw new Error(`Failed to create direct upload URL (HTTP ${initResponse.status}): ${errorText}`);
2666
2672
  }
2667
2673
  const uploadInitResult = (await initResponse.json());
2668
- const uploadHeaders = { ...(uploadInitResult.requiredHeaders ?? {}) };
2669
- if (!hasHeaderIgnoreCase(uploadHeaders, 'Content-Type')) {
2670
- uploadHeaders['Content-Type'] = contentType;
2674
+ const uploadHeaders = {
2675
+ ...(uploadInitResult.requiredHeaders ?? {}),
2676
+ };
2677
+ if (!hasHeaderIgnoreCase(uploadHeaders, "Content-Type")) {
2678
+ uploadHeaders["Content-Type"] = contentType;
2671
2679
  }
2672
2680
  const directUploadResponse = await fetch(uploadInitResult.uploadUrl, {
2673
- method: 'PUT',
2681
+ method: "PUT",
2674
2682
  headers: uploadHeaders,
2675
2683
  body: fileBuffer,
2676
2684
  });
@@ -2687,10 +2695,10 @@ async function uploadWithPresignedUrl(options) {
2687
2695
  storageKey: uploadInitResult.storageKey,
2688
2696
  };
2689
2697
  const completeResponse = await fetch(`${apiUrl}/api/v1/artifacts/${reportId}/complete`, {
2690
- method: 'POST',
2698
+ method: "POST",
2691
2699
  headers: {
2692
- 'X-API-KEY': apiKey,
2693
- 'Content-Type': 'application/json',
2700
+ "X-API-KEY": apiKey,
2701
+ "Content-Type": "application/json",
2694
2702
  },
2695
2703
  body: JSON.stringify(completePayload),
2696
2704
  });
@@ -2701,16 +2709,16 @@ async function uploadWithPresignedUrl(options) {
2701
2709
  return true;
2702
2710
  }
2703
2711
  async function uploadWithLegacyEndpoint(options) {
2704
- const { testResultId, attachmentName, reportId, apiKey, apiUrl, fileName, contentType, fileBuffer } = options;
2712
+ const { testResultId, attachmentName, reportId, apiKey, apiUrl, fileName, contentType, fileBuffer, } = options;
2705
2713
  const blob = new Blob([new Uint8Array(fileBuffer)], { type: contentType });
2706
2714
  const formData = new FormData();
2707
- formData.append('testResultId', testResultId);
2708
- formData.append('ctrfAttachmentName', attachmentName);
2709
- formData.append('file', blob, fileName);
2715
+ formData.append("testResultId", testResultId);
2716
+ formData.append("ctrfAttachmentName", attachmentName);
2717
+ formData.append("file", blob, fileName);
2710
2718
  const response = await fetch(`${apiUrl}/api/v1/artifacts/${reportId}`, {
2711
- method: 'POST',
2719
+ method: "POST",
2712
2720
  headers: {
2713
- 'X-API-KEY': apiKey,
2721
+ "X-API-KEY": apiKey,
2714
2722
  },
2715
2723
  body: formData,
2716
2724
  });
@@ -2731,7 +2739,7 @@ function hasHeaderIgnoreCase(headers, headerName) {
2731
2739
 
2732
2740
  /***/ }),
2733
2741
 
2734
- /***/ 328:
2742
+ /***/ 4328:
2735
2743
  /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
2736
2744
 
2737
2745
  "use strict";
@@ -2771,14 +2779,14 @@ var __importStar = (this && this.__importStar) || (function () {
2771
2779
  })();
2772
2780
  Object.defineProperty(exports, "__esModule", ({ value: true }));
2773
2781
  const glob_1 = __nccwpck_require__(447);
2774
- const path = __importStar(__nccwpck_require__(928));
2775
- const fs = __importStar(__nccwpck_require__(943));
2782
+ const path = __importStar(__nccwpck_require__(6928));
2783
+ const fs = __importStar(__nccwpck_require__(1943));
2776
2784
  const os = __importStar(__nccwpck_require__(857));
2777
- const child_process_1 = __nccwpck_require__(317);
2778
- const trx_parser_1 = __nccwpck_require__(914);
2779
- const uploader_1 = __nccwpck_require__(10);
2785
+ const child_process_1 = __nccwpck_require__(5317);
2786
+ const trx_parser_1 = __nccwpck_require__(8914);
2787
+ const uploader_1 = __nccwpck_require__(8010);
2780
2788
  function printUsage() {
2781
- console.log(`
2789
+ console.log(String.raw `
2782
2790
  @testream/dotnet-reporter - Run .NET tests and upload results to Testream
2783
2791
 
2784
2792
  Usage:
@@ -2823,7 +2831,7 @@ Examples:
2823
2831
  npx @testream/dotnet-reporter -k your-api-key --project ./MyTests
2824
2832
 
2825
2833
  # With environment metadata
2826
- npx @testream/dotnet-reporter -k your-api-key \\
2834
+ npx @testream/dotnet-reporter -k your-api-key \
2827
2835
  --test-environment staging --app-name MyApp --app-version 1.0.0
2828
2836
 
2829
2837
  # Pass additional arguments to dotnet test
@@ -2960,15 +2968,15 @@ async function runDotnetTest(projectPath, additionalArgs = []) {
2960
2968
  const logger = console;
2961
2969
  // Create temp directory for TRX output
2962
2970
  const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'dotnet-reporter-'));
2963
- const trxFileName = `results-${Date.now()}.trx`;
2964
2971
  // Build dotnet test command
2965
2972
  const args = ['test'];
2966
2973
  if (projectPath) {
2967
2974
  args.push(projectPath);
2968
2975
  }
2969
- // Add TRX logger
2970
- args.push('--logger', `trx;LogFileName=${trxFileName}`);
2971
- args.push('--results-directory', tempDir);
2976
+ // Add TRX logger without a fixed filename so each test project gets a unique
2977
+ // TRX file. Specifying LogFileName causes all projects in a solution to write
2978
+ // to the same file, with later projects overwriting earlier ones.
2979
+ args.push('--logger', 'trx', '--results-directory', tempDir);
2972
2980
  // Add any additional user-provided args
2973
2981
  args.push(...additionalArgs);
2974
2982
  logger.info('Running dotnet test...');
@@ -3094,7 +3102,7 @@ main();
3094
3102
 
3095
3103
  /***/ }),
3096
3104
 
3097
- /***/ 914:
3105
+ /***/ 8914:
3098
3106
  /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
3099
3107
 
3100
3108
  "use strict";
@@ -3135,16 +3143,13 @@ var __importStar = (this && this.__importStar) || (function () {
3135
3143
  Object.defineProperty(exports, "__esModule", ({ value: true }));
3136
3144
  exports.parseTrxFile = parseTrxFile;
3137
3145
  exports.parseTrxFiles = parseTrxFiles;
3138
- const fs = __importStar(__nccwpck_require__(943));
3139
- const fast_xml_parser_1 = __nccwpck_require__(537);
3146
+ const fs = __importStar(__nccwpck_require__(1943));
3147
+ const fast_xml_parser_1 = __nccwpck_require__(1537);
3148
+ const crypto_1 = __nccwpck_require__(6982);
3140
3149
  const TOOL_NAME = 'dotnet';
3141
- // Simple UUID v4 generator (avoid extra dependency)
3150
+ // Use crypto.randomUUID() for secure UUID generation (available in Node.js 15.7.0+)
3142
3151
  function generateUUID() {
3143
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
3144
- const r = (Math.random() * 16) | 0;
3145
- const v = c === 'x' ? r : (r & 0x3) | 0x8;
3146
- return v.toString(16);
3147
- });
3152
+ return (0, crypto_1.randomUUID)();
3148
3153
  }
3149
3154
  /**
3150
3155
  * Parse TRX duration string (HH:MM:SS.mmmmmmm) to milliseconds
@@ -3152,13 +3157,22 @@ function generateUUID() {
3152
3157
  function parseDuration(duration) {
3153
3158
  if (!duration)
3154
3159
  return 0;
3155
- const match = duration.match(/^(\d+):(\d+):(\d+)\.?(\d+)?$/);
3156
- if (!match)
3160
+ // Use split() instead of regex to avoid ReDoS vulnerability
3161
+ const parts = duration.split(':');
3162
+ if (parts.length !== 3)
3163
+ return 0;
3164
+ const hours = parseInt(parts[0], 10);
3165
+ if (isNaN(hours))
3166
+ return 0;
3167
+ const minutes = parseInt(parts[1], 10);
3168
+ if (isNaN(minutes))
3169
+ return 0;
3170
+ // Handle seconds and fractional part (may contain decimal point)
3171
+ const secondsParts = parts[2].split('.');
3172
+ const seconds = parseInt(secondsParts[0], 10);
3173
+ if (isNaN(seconds))
3157
3174
  return 0;
3158
- const hours = parseInt(match[1], 10);
3159
- const minutes = parseInt(match[2], 10);
3160
- const seconds = parseInt(match[3], 10);
3161
- const fraction = match[4] ? parseFloat(`0.${match[4]}`) * 1000 : 0;
3175
+ const fraction = secondsParts[1] ? parseFloat(`0.${secondsParts[1]}`) * 1000 : 0;
3162
3176
  return hours * 3600000 + minutes * 60000 + seconds * 1000 + Math.round(fraction);
3163
3177
  }
3164
3178
  /**
@@ -3208,8 +3222,8 @@ function extractLineNumber(stackTrace) {
3208
3222
  function extractFilePath(stackTrace) {
3209
3223
  if (!stackTrace)
3210
3224
  return undefined;
3211
- // Match file paths ending in .cs
3212
- const match = stackTrace.match(/([A-Za-z]:\\[^\s:]+\.cs|\/[^\s:]+\.cs)/);
3225
+ // Match file paths ending in .cs with bounded length to prevent ReDoS
3226
+ const match = stackTrace.match(/([A-Za-z]:\\[^\s:]{1,256}\.cs|\/[^\s:]{1,256}\.cs)/);
3213
3227
  return match ? match[1] : undefined;
3214
3228
  }
3215
3229
  /**
@@ -3401,7 +3415,7 @@ async function parseTrxFiles(trxPaths) {
3401
3415
 
3402
3416
  /***/ }),
3403
3417
 
3404
- /***/ 10:
3418
+ /***/ 8010:
3405
3419
  /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
3406
3420
 
3407
3421
  "use strict";
@@ -3409,7 +3423,7 @@ async function parseTrxFiles(trxPaths) {
3409
3423
  Object.defineProperty(exports, "__esModule", ({ value: true }));
3410
3424
  exports.detectGitContext = void 0;
3411
3425
  exports.uploadToApi = uploadToApi;
3412
- const shared_types_1 = __nccwpck_require__(322);
3426
+ const shared_types_1 = __nccwpck_require__(7322);
3413
3427
  /**
3414
3428
  * Upload CTRF report to Testream API
3415
3429
  */
@@ -3436,7 +3450,7 @@ exports.detectGitContext = shared_types_1.detectCIContext;
3436
3450
 
3437
3451
  /***/ }),
3438
3452
 
3439
- /***/ 317:
3453
+ /***/ 5317:
3440
3454
  /***/ ((module) => {
3441
3455
 
3442
3456
  "use strict";
@@ -3444,7 +3458,15 @@ module.exports = require("child_process");
3444
3458
 
3445
3459
  /***/ }),
3446
3460
 
3447
- /***/ 896:
3461
+ /***/ 6982:
3462
+ /***/ ((module) => {
3463
+
3464
+ "use strict";
3465
+ module.exports = require("crypto");
3466
+
3467
+ /***/ }),
3468
+
3469
+ /***/ 9896:
3448
3470
  /***/ ((module) => {
3449
3471
 
3450
3472
  "use strict";
@@ -3452,7 +3474,7 @@ module.exports = require("fs");
3452
3474
 
3453
3475
  /***/ }),
3454
3476
 
3455
- /***/ 943:
3477
+ /***/ 1943:
3456
3478
  /***/ ((module) => {
3457
3479
 
3458
3480
  "use strict";
@@ -3460,7 +3482,7 @@ module.exports = require("fs/promises");
3460
3482
 
3461
3483
  /***/ }),
3462
3484
 
3463
- /***/ 474:
3485
+ /***/ 8474:
3464
3486
  /***/ ((module) => {
3465
3487
 
3466
3488
  "use strict";
@@ -3468,7 +3490,7 @@ module.exports = require("node:events");
3468
3490
 
3469
3491
  /***/ }),
3470
3492
 
3471
- /***/ 24:
3493
+ /***/ 3024:
3472
3494
  /***/ ((module) => {
3473
3495
 
3474
3496
  "use strict";
@@ -3476,7 +3498,7 @@ module.exports = require("node:fs");
3476
3498
 
3477
3499
  /***/ }),
3478
3500
 
3479
- /***/ 455:
3501
+ /***/ 1455:
3480
3502
  /***/ ((module) => {
3481
3503
 
3482
3504
  "use strict";
@@ -3484,7 +3506,7 @@ module.exports = require("node:fs/promises");
3484
3506
 
3485
3507
  /***/ }),
3486
3508
 
3487
- /***/ 760:
3509
+ /***/ 6760:
3488
3510
  /***/ ((module) => {
3489
3511
 
3490
3512
  "use strict";
@@ -3492,7 +3514,7 @@ module.exports = require("node:path");
3492
3514
 
3493
3515
  /***/ }),
3494
3516
 
3495
- /***/ 75:
3517
+ /***/ 7075:
3496
3518
  /***/ ((module) => {
3497
3519
 
3498
3520
  "use strict";
@@ -3500,7 +3522,7 @@ module.exports = require("node:stream");
3500
3522
 
3501
3523
  /***/ }),
3502
3524
 
3503
- /***/ 193:
3525
+ /***/ 6193:
3504
3526
  /***/ ((module) => {
3505
3527
 
3506
3528
  "use strict";
@@ -3508,7 +3530,7 @@ module.exports = require("node:string_decoder");
3508
3530
 
3509
3531
  /***/ }),
3510
3532
 
3511
- /***/ 136:
3533
+ /***/ 3136:
3512
3534
  /***/ ((module) => {
3513
3535
 
3514
3536
  "use strict";
@@ -3524,7 +3546,7 @@ module.exports = require("os");
3524
3546
 
3525
3547
  /***/ }),
3526
3548
 
3527
- /***/ 928:
3549
+ /***/ 6928:
3528
3550
  /***/ ((module) => {
3529
3551
 
3530
3552
  "use strict";
@@ -3532,7 +3554,7 @@ module.exports = require("path");
3532
3554
 
3533
3555
  /***/ }),
3534
3556
 
3535
- /***/ 80:
3557
+ /***/ 7080:
3536
3558
  /***/ ((__unused_webpack_module, exports) => {
3537
3559
 
3538
3560
  "use strict";
@@ -3598,14 +3620,14 @@ exports.range = range;
3598
3620
 
3599
3621
  /***/ }),
3600
3622
 
3601
- /***/ 339:
3623
+ /***/ 2339:
3602
3624
  /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
3603
3625
 
3604
3626
  "use strict";
3605
3627
 
3606
3628
  Object.defineProperty(exports, "__esModule", ({ value: true }));
3607
3629
  exports.expand = expand;
3608
- const balanced_match_1 = __nccwpck_require__(80);
3630
+ const balanced_match_1 = __nccwpck_require__(7080);
3609
3631
  const escSlash = '\0SLASH' + Math.random() + '\0';
3610
3632
  const escOpen = '\0OPEN' + Math.random() + '\0';
3611
3633
  const escClose = '\0CLOSE' + Math.random() + '\0';
@@ -3801,18 +3823,18 @@ function expand_(str, isTop) {
3801
3823
 
3802
3824
  /***/ }),
3803
3825
 
3804
- /***/ 809:
3826
+ /***/ 8809:
3805
3827
  /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
3806
3828
 
3807
3829
  "use strict";
3808
3830
 
3809
3831
  Object.defineProperty(exports, "__esModule", ({ value: true }));
3810
3832
  exports.Glob = void 0;
3811
- const minimatch_1 = __nccwpck_require__(647);
3812
- const node_url_1 = __nccwpck_require__(136);
3813
- const path_scurry_1 = __nccwpck_require__(125);
3814
- const pattern_js_1 = __nccwpck_require__(841);
3815
- const walker_js_1 = __nccwpck_require__(89);
3833
+ const minimatch_1 = __nccwpck_require__(6647);
3834
+ const node_url_1 = __nccwpck_require__(3136);
3835
+ const path_scurry_1 = __nccwpck_require__(5125);
3836
+ const pattern_js_1 = __nccwpck_require__(2841);
3837
+ const walker_js_1 = __nccwpck_require__(6089);
3816
3838
  // if no process global, just call it linux.
3817
3839
  // so we default to case-sensitive, / separators
3818
3840
  const defaultPlatform = (typeof process === 'object' &&
@@ -4055,14 +4077,14 @@ exports.Glob = Glob;
4055
4077
 
4056
4078
  /***/ }),
4057
4079
 
4058
- /***/ 233:
4080
+ /***/ 6233:
4059
4081
  /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
4060
4082
 
4061
4083
  "use strict";
4062
4084
 
4063
4085
  Object.defineProperty(exports, "__esModule", ({ value: true }));
4064
4086
  exports.hasMagic = void 0;
4065
- const minimatch_1 = __nccwpck_require__(647);
4087
+ const minimatch_1 = __nccwpck_require__(6647);
4066
4088
  /**
4067
4089
  * Return true if the patterns provided contain any magic glob characters,
4068
4090
  * given the options provided.
@@ -4089,7 +4111,7 @@ exports.hasMagic = hasMagic;
4089
4111
 
4090
4112
  /***/ }),
4091
4113
 
4092
- /***/ 449:
4114
+ /***/ 6449:
4093
4115
  /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
4094
4116
 
4095
4117
  "use strict";
@@ -4100,8 +4122,8 @@ exports.hasMagic = hasMagic;
4100
4122
  // Ignores are always parsed in dot:true mode
4101
4123
  Object.defineProperty(exports, "__esModule", ({ value: true }));
4102
4124
  exports.Ignore = void 0;
4103
- const minimatch_1 = __nccwpck_require__(647);
4104
- const pattern_js_1 = __nccwpck_require__(841);
4125
+ const minimatch_1 = __nccwpck_require__(6647);
4126
+ const pattern_js_1 = __nccwpck_require__(2841);
4105
4127
  const defaultPlatform = (typeof process === 'object' &&
4106
4128
  process &&
4107
4129
  typeof process.platform === 'string') ?
@@ -4227,17 +4249,17 @@ exports.globStream = globStream;
4227
4249
  exports.globSync = globSync;
4228
4250
  exports.globIterateSync = globIterateSync;
4229
4251
  exports.globIterate = globIterate;
4230
- const minimatch_1 = __nccwpck_require__(647);
4231
- const glob_js_1 = __nccwpck_require__(809);
4232
- const has_magic_js_1 = __nccwpck_require__(233);
4233
- var minimatch_2 = __nccwpck_require__(647);
4252
+ const minimatch_1 = __nccwpck_require__(6647);
4253
+ const glob_js_1 = __nccwpck_require__(8809);
4254
+ const has_magic_js_1 = __nccwpck_require__(6233);
4255
+ var minimatch_2 = __nccwpck_require__(6647);
4234
4256
  Object.defineProperty(exports, "escape", ({ enumerable: true, get: function () { return minimatch_2.escape; } }));
4235
4257
  Object.defineProperty(exports, "unescape", ({ enumerable: true, get: function () { return minimatch_2.unescape; } }));
4236
- var glob_js_2 = __nccwpck_require__(809);
4258
+ var glob_js_2 = __nccwpck_require__(8809);
4237
4259
  Object.defineProperty(exports, "Glob", ({ enumerable: true, get: function () { return glob_js_2.Glob; } }));
4238
- var has_magic_js_2 = __nccwpck_require__(233);
4260
+ var has_magic_js_2 = __nccwpck_require__(6233);
4239
4261
  Object.defineProperty(exports, "hasMagic", ({ enumerable: true, get: function () { return has_magic_js_2.hasMagic; } }));
4240
- var ignore_js_1 = __nccwpck_require__(449);
4262
+ var ignore_js_1 = __nccwpck_require__(6449);
4241
4263
  Object.defineProperty(exports, "Ignore", ({ enumerable: true, get: function () { return ignore_js_1.Ignore; } }));
4242
4264
  function globStreamSync(pattern, options = {}) {
4243
4265
  return new glob_js_1.Glob(pattern, options).streamSync();
@@ -4290,7 +4312,7 @@ exports.glob.glob = exports.glob;
4290
4312
 
4291
4313
  /***/ }),
4292
4314
 
4293
- /***/ 841:
4315
+ /***/ 2841:
4294
4316
  /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
4295
4317
 
4296
4318
  "use strict";
@@ -4298,7 +4320,7 @@ exports.glob.glob = exports.glob;
4298
4320
  // this is just a very light wrapper around 2 arrays with an offset index
4299
4321
  Object.defineProperty(exports, "__esModule", ({ value: true }));
4300
4322
  exports.Pattern = void 0;
4301
- const minimatch_1 = __nccwpck_require__(647);
4323
+ const minimatch_1 = __nccwpck_require__(6647);
4302
4324
  const isPatternList = (pl) => pl.length >= 1;
4303
4325
  const isGlobList = (gl) => gl.length >= 1;
4304
4326
  /**
@@ -4516,7 +4538,7 @@ exports.Pattern = Pattern;
4516
4538
 
4517
4539
  /***/ }),
4518
4540
 
4519
- /***/ 999:
4541
+ /***/ 7999:
4520
4542
  /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
4521
4543
 
4522
4544
  "use strict";
@@ -4524,7 +4546,7 @@ exports.Pattern = Pattern;
4524
4546
  // synchronous utility for filtering entries and calculating subwalks
4525
4547
  Object.defineProperty(exports, "__esModule", ({ value: true }));
4526
4548
  exports.Processor = exports.SubWalks = exports.MatchRecord = exports.HasWalkedCache = void 0;
4527
- const minimatch_1 = __nccwpck_require__(647);
4549
+ const minimatch_1 = __nccwpck_require__(6647);
4528
4550
  /**
4529
4551
  * A cache of which patterns have been processed for a given Path
4530
4552
  */
@@ -4824,7 +4846,7 @@ exports.Processor = Processor;
4824
4846
 
4825
4847
  /***/ }),
4826
4848
 
4827
- /***/ 89:
4849
+ /***/ 6089:
4828
4850
  /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
4829
4851
 
4830
4852
  "use strict";
@@ -4837,9 +4859,9 @@ exports.GlobStream = exports.GlobWalker = exports.GlobUtil = void 0;
4837
4859
  *
4838
4860
  * @module
4839
4861
  */
4840
- const minipass_1 = __nccwpck_require__(31);
4841
- const ignore_js_1 = __nccwpck_require__(449);
4842
- const processor_js_1 = __nccwpck_require__(999);
4862
+ const minipass_1 = __nccwpck_require__(1031);
4863
+ const ignore_js_1 = __nccwpck_require__(6449);
4864
+ const processor_js_1 = __nccwpck_require__(7999);
4843
4865
  const makeIgnore = (ignore, opts) => typeof ignore === 'string' ? new ignore_js_1.Ignore([ignore], opts)
4844
4866
  : Array.isArray(ignore) ? new ignore_js_1.Ignore(ignore, opts)
4845
4867
  : ignore;
@@ -5218,7 +5240,7 @@ exports.GlobStream = GlobStream;
5218
5240
 
5219
5241
  /***/ }),
5220
5242
 
5221
- /***/ 481:
5243
+ /***/ 3481:
5222
5244
  /***/ ((__unused_webpack_module, exports) => {
5223
5245
 
5224
5246
  "use strict";
@@ -6831,7 +6853,7 @@ exports.assertValidPattern = assertValidPattern;
6831
6853
 
6832
6854
  /***/ }),
6833
6855
 
6834
- /***/ 743:
6856
+ /***/ 8743:
6835
6857
  /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
6836
6858
 
6837
6859
  "use strict";
@@ -6839,8 +6861,8 @@ exports.assertValidPattern = assertValidPattern;
6839
6861
  // parse a single path portion
6840
6862
  Object.defineProperty(exports, "__esModule", ({ value: true }));
6841
6863
  exports.AST = void 0;
6842
- const brace_expressions_js_1 = __nccwpck_require__(694);
6843
- const unescape_js_1 = __nccwpck_require__(967);
6864
+ const brace_expressions_js_1 = __nccwpck_require__(6694);
6865
+ const unescape_js_1 = __nccwpck_require__(7967);
6844
6866
  const types = new Set(['!', '?', '+', '*', '@']);
6845
6867
  const isExtglobType = (c) => types.has(c);
6846
6868
  // Patterns that get prepended to bind to the start of either the
@@ -7429,7 +7451,7 @@ exports.AST = AST;
7429
7451
 
7430
7452
  /***/ }),
7431
7453
 
7432
- /***/ 694:
7454
+ /***/ 6694:
7433
7455
  /***/ ((__unused_webpack_module, exports) => {
7434
7456
 
7435
7457
  "use strict";
@@ -7588,7 +7610,7 @@ exports.parseClass = parseClass;
7588
7610
 
7589
7611
  /***/ }),
7590
7612
 
7591
- /***/ 516:
7613
+ /***/ 7516:
7592
7614
  /***/ ((__unused_webpack_module, exports) => {
7593
7615
 
7594
7616
  "use strict";
@@ -7625,18 +7647,18 @@ exports.escape = escape;
7625
7647
 
7626
7648
  /***/ }),
7627
7649
 
7628
- /***/ 647:
7650
+ /***/ 6647:
7629
7651
  /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
7630
7652
 
7631
7653
  "use strict";
7632
7654
 
7633
7655
  Object.defineProperty(exports, "__esModule", ({ value: true }));
7634
7656
  exports.unescape = exports.escape = exports.AST = exports.Minimatch = exports.match = exports.makeRe = exports.braceExpand = exports.defaults = exports.filter = exports.GLOBSTAR = exports.sep = exports.minimatch = void 0;
7635
- const brace_expansion_1 = __nccwpck_require__(339);
7657
+ const brace_expansion_1 = __nccwpck_require__(2339);
7636
7658
  const assert_valid_pattern_js_1 = __nccwpck_require__(557);
7637
- const ast_js_1 = __nccwpck_require__(743);
7638
- const escape_js_1 = __nccwpck_require__(516);
7639
- const unescape_js_1 = __nccwpck_require__(967);
7659
+ const ast_js_1 = __nccwpck_require__(8743);
7660
+ const escape_js_1 = __nccwpck_require__(7516);
7661
+ const unescape_js_1 = __nccwpck_require__(7967);
7640
7662
  const minimatch = (p, pattern, options = {}) => {
7641
7663
  (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
7642
7664
  // shortcut: comments match nothing.
@@ -8646,11 +8668,11 @@ class Minimatch {
8646
8668
  }
8647
8669
  exports.Minimatch = Minimatch;
8648
8670
  /* c8 ignore start */
8649
- var ast_js_2 = __nccwpck_require__(743);
8671
+ var ast_js_2 = __nccwpck_require__(8743);
8650
8672
  Object.defineProperty(exports, "AST", ({ enumerable: true, get: function () { return ast_js_2.AST; } }));
8651
- var escape_js_2 = __nccwpck_require__(516);
8673
+ var escape_js_2 = __nccwpck_require__(7516);
8652
8674
  Object.defineProperty(exports, "escape", ({ enumerable: true, get: function () { return escape_js_2.escape; } }));
8653
- var unescape_js_2 = __nccwpck_require__(967);
8675
+ var unescape_js_2 = __nccwpck_require__(7967);
8654
8676
  Object.defineProperty(exports, "unescape", ({ enumerable: true, get: function () { return unescape_js_2.unescape; } }));
8655
8677
  /* c8 ignore stop */
8656
8678
  exports.minimatch.AST = ast_js_1.AST;
@@ -8661,7 +8683,7 @@ exports.minimatch.unescape = unescape_js_1.unescape;
8661
8683
 
8662
8684
  /***/ }),
8663
8685
 
8664
- /***/ 967:
8686
+ /***/ 7967:
8665
8687
  /***/ ((__unused_webpack_module, exports) => {
8666
8688
 
8667
8689
  "use strict";
@@ -8706,7 +8728,7 @@ exports.unescape = unescape;
8706
8728
 
8707
8729
  /***/ }),
8708
8730
 
8709
- /***/ 31:
8731
+ /***/ 1031:
8710
8732
  /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
8711
8733
 
8712
8734
  "use strict";
@@ -8722,9 +8744,9 @@ const proc = typeof process === 'object' && process
8722
8744
  stdout: null,
8723
8745
  stderr: null,
8724
8746
  };
8725
- const node_events_1 = __nccwpck_require__(474);
8726
- const node_stream_1 = __importDefault(__nccwpck_require__(75));
8727
- const node_string_decoder_1 = __nccwpck_require__(193);
8747
+ const node_events_1 = __nccwpck_require__(8474);
8748
+ const node_stream_1 = __importDefault(__nccwpck_require__(7075));
8749
+ const node_string_decoder_1 = __nccwpck_require__(6193);
8728
8750
  /**
8729
8751
  * Return true if the argument is a Minipass stream, Node stream, or something
8730
8752
  * else that Minipass can interact with.
@@ -9741,7 +9763,7 @@ exports.Minipass = Minipass;
9741
9763
 
9742
9764
  /***/ }),
9743
9765
 
9744
- /***/ 125:
9766
+ /***/ 5125:
9745
9767
  /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
9746
9768
 
9747
9769
  "use strict";
@@ -9771,16 +9793,16 @@ var __importStar = (this && this.__importStar) || function (mod) {
9771
9793
  };
9772
9794
  Object.defineProperty(exports, "__esModule", ({ value: true }));
9773
9795
  exports.PathScurry = exports.Path = exports.PathScurryDarwin = exports.PathScurryPosix = exports.PathScurryWin32 = exports.PathScurryBase = exports.PathPosix = exports.PathWin32 = exports.PathBase = exports.ChildrenCache = exports.ResolveCache = void 0;
9774
- const lru_cache_1 = __nccwpck_require__(481);
9775
- const node_path_1 = __nccwpck_require__(760);
9776
- const node_url_1 = __nccwpck_require__(136);
9777
- const fs_1 = __nccwpck_require__(896);
9778
- const actualFS = __importStar(__nccwpck_require__(24));
9796
+ const lru_cache_1 = __nccwpck_require__(3481);
9797
+ const node_path_1 = __nccwpck_require__(6760);
9798
+ const node_url_1 = __nccwpck_require__(3136);
9799
+ const fs_1 = __nccwpck_require__(9896);
9800
+ const actualFS = __importStar(__nccwpck_require__(3024));
9779
9801
  const realpathSync = fs_1.realpathSync.native;
9780
9802
  // TODO: test perf of fs/promises realpath vs realpathCB,
9781
9803
  // since the promises one uses realpath.native
9782
- const promises_1 = __nccwpck_require__(455);
9783
- const minipass_1 = __nccwpck_require__(31);
9804
+ const promises_1 = __nccwpck_require__(1455);
9805
+ const minipass_1 = __nccwpck_require__(1031);
9784
9806
  const defaultFS = {
9785
9807
  lstatSync: fs_1.lstatSync,
9786
9808
  readdir: fs_1.readdir,
@@ -11866,7 +11888,7 @@ exports.PathScurry = process.platform === 'win32' ? PathScurryWin32
11866
11888
  /******/ // startup
11867
11889
  /******/ // Load entry module and return exports
11868
11890
  /******/ // This entry module is referenced by other modules so it can't be inlined
11869
- /******/ var __webpack_exports__ = __nccwpck_require__(328);
11891
+ /******/ var __webpack_exports__ = __nccwpck_require__(4328);
11870
11892
  /******/ module.exports = __webpack_exports__;
11871
11893
  /******/
11872
11894
  /******/ })()