@sectester/reporter 0.45.0 → 0.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/package.json +5 -4
  2. package/src/__fixtures__/issues.d.ts +3 -0
  3. package/src/__fixtures__/issues.js +1 -0
  4. package/src/__fixtures__/issues.js.map +1 -1
  5. package/src/__fixtures__/junit-reports.d.ts +14 -0
  6. package/src/__fixtures__/junit-reports.js +71 -0
  7. package/src/__fixtures__/junit-reports.js.map +1 -0
  8. package/src/index.d.ts +1 -1
  9. package/src/index.js +2 -1
  10. package/src/index.js.map +1 -1
  11. package/src/reporters/github/GitHubCheckRunReporter.d.ts +3 -2
  12. package/src/reporters/github/GitHubCheckRunReporter.js +8 -21
  13. package/src/reporters/github/GitHubCheckRunReporter.js.map +1 -1
  14. package/src/reporters/gitlab/GitLabReporter.d.ts +15 -0
  15. package/src/reporters/gitlab/GitLabReporter.js +62 -0
  16. package/src/reporters/gitlab/GitLabReporter.js.map +1 -0
  17. package/src/reporters/gitlab/api/GitLabCIArtifacts.d.ts +6 -0
  18. package/src/reporters/gitlab/api/GitLabCIArtifacts.js +5 -0
  19. package/src/reporters/gitlab/api/GitLabCIArtifacts.js.map +1 -0
  20. package/src/reporters/gitlab/api/GitLabCodeQualityFileWriter.d.ts +10 -0
  21. package/src/reporters/gitlab/api/GitLabCodeQualityFileWriter.js +49 -0
  22. package/src/reporters/gitlab/api/GitLabCodeQualityFileWriter.js.map +1 -0
  23. package/src/reporters/gitlab/api/GitLabConfig.d.ts +7 -0
  24. package/src/reporters/gitlab/api/GitLabConfig.js +5 -0
  25. package/src/reporters/gitlab/api/GitLabConfig.js.map +1 -0
  26. package/src/reporters/gitlab/api/index.d.ts +3 -0
  27. package/src/reporters/gitlab/api/index.js +10 -0
  28. package/src/reporters/gitlab/api/index.js.map +1 -0
  29. package/src/reporters/gitlab/api/register.d.ts +1 -0
  30. package/src/reporters/gitlab/api/register.js +19 -0
  31. package/src/reporters/gitlab/api/register.js.map +1 -0
  32. package/src/reporters/gitlab/builders/CodeQualityReportBuilder.d.ts +11 -0
  33. package/src/reporters/gitlab/builders/CodeQualityReportBuilder.js +53 -0
  34. package/src/reporters/gitlab/builders/CodeQualityReportBuilder.js.map +1 -0
  35. package/src/reporters/gitlab/builders/JUnitReportBuilder.d.ts +10 -0
  36. package/src/reporters/gitlab/builders/JUnitReportBuilder.js +43 -0
  37. package/src/reporters/gitlab/builders/JUnitReportBuilder.js.map +1 -0
  38. package/src/reporters/gitlab/builders/index.d.ts +2 -0
  39. package/src/reporters/gitlab/builders/index.js +8 -0
  40. package/src/reporters/gitlab/builders/index.js.map +1 -0
  41. package/src/reporters/gitlab/index.d.ts +2 -0
  42. package/src/reporters/gitlab/index.js +7 -0
  43. package/src/reporters/gitlab/index.js.map +1 -0
  44. package/src/reporters/gitlab/types/CodeQualityReport.d.ts +16 -0
  45. package/src/reporters/gitlab/types/CodeQualityReport.js +3 -0
  46. package/src/reporters/gitlab/types/CodeQualityReport.js.map +1 -0
  47. package/src/reporters/gitlab/types/TestReport.d.ts +24 -0
  48. package/src/reporters/gitlab/types/TestReport.js +3 -0
  49. package/src/reporters/gitlab/types/TestReport.js.map +1 -0
  50. package/src/reporters/gitlab/types/index.d.ts +3 -0
  51. package/src/reporters/gitlab/types/index.js +3 -0
  52. package/src/reporters/gitlab/types/index.js.map +1 -0
  53. package/src/reporters/gitlab/utils/build-junit-xml.d.ts +2 -0
  54. package/src/reporters/gitlab/utils/build-junit-xml.js +91 -0
  55. package/src/reporters/gitlab/utils/build-junit-xml.js.map +1 -0
  56. package/src/reporters/gitlab/utils/index.d.ts +1 -0
  57. package/src/reporters/gitlab/utils/index.js +6 -0
  58. package/src/reporters/gitlab/utils/index.js.map +1 -0
  59. package/src/reporters/index.d.ts +1 -0
  60. package/src/reporters/index.js +1 -0
  61. package/src/reporters/index.js.map +1 -1
  62. package/src/utils/JestTestFilePathResolver.d.ts +4 -0
  63. package/src/utils/JestTestFilePathResolver.js +28 -0
  64. package/src/utils/JestTestFilePathResolver.js.map +1 -0
  65. package/src/utils/TestFilePathResolver.d.ts +4 -0
  66. package/src/utils/TestFilePathResolver.js +5 -0
  67. package/src/utils/TestFilePathResolver.js.map +1 -0
  68. package/src/utils/index.d.ts +3 -0
  69. package/src/utils/index.js +6 -1
  70. package/src/utils/index.js.map +1 -1
  71. package/src/utils/register.d.ts +1 -0
  72. package/src/utils/register.js +7 -0
  73. package/src/utils/register.js.map +1 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sectester/reporter",
3
- "version": "0.45.0",
3
+ "version": "0.47.0",
4
4
  "description": "Provide an abstraction for generating test results as part of the particular test frameworks.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -34,12 +34,13 @@
34
34
  "reporter"
35
35
  ],
36
36
  "dependencies": {
37
+ "@octokit/types": "^13.5.0",
37
38
  "chalk": "^4.1.2",
39
+ "fast-xml-parser": "^5.2.5",
40
+ "reflect-metadata": "^0.2.2",
38
41
  "tslib": "~2.6.3",
39
42
  "tsyringe": "^4.8.0",
40
- "tty-table": "^4.2.3",
41
- "@octokit/types": "^13.5.0",
42
- "reflect-metadata": "^0.2.2"
43
+ "tty-table": "^4.2.3"
43
44
  },
44
45
  "peerDependencies": {
45
46
  "@sectester/scan": ">=0.16.0 <1.0.0"
@@ -2,6 +2,7 @@ import { HttpMethod, Severity } from '@sectester/scan';
2
2
  export declare const issueWithoutResourcesText = "Issue in Bright UI: http://app.brightsec.com/scans/pDzxcEXQC8df1fcz1QwPf9/issues/pDzxcEXQC8df1fcz1QwPf9\nName: Database connection crashed\nSeverity: Medium\nRemediation:\nThe best way to protect against those kind of issues is making sure the Database resources are sufficient\nDetails:\nCross-site request forgery is a type of malicious website exploit.";
3
3
  export declare const issueWithoutResources: {
4
4
  id: `${string}-${string}-${string}-${string}-${string}`;
5
+ entryPointId: string;
5
6
  details: string;
6
7
  name: string;
7
8
  severity: Severity.MEDIUM;
@@ -29,6 +30,7 @@ export declare const fullyDescribedIssue: {
29
30
  }[];
30
31
  resources: string[];
31
32
  id: `${string}-${string}-${string}-${string}-${string}`;
33
+ entryPointId: string;
32
34
  details: string;
33
35
  name: string;
34
36
  severity: Severity.MEDIUM;
@@ -51,6 +53,7 @@ export declare const issueWithoutExtraInfoText = "Issue in Bright UI: http://a
51
53
  export declare const issueWithoutExtraInfo: {
52
54
  resources: string[];
53
55
  id: `${string}-${string}-${string}-${string}-${string}`;
56
+ entryPointId: string;
54
57
  details: string;
55
58
  name: string;
56
59
  severity: Severity.MEDIUM;
@@ -12,6 +12,7 @@ Details:
12
12
  Cross-site request forgery is a type of malicious website exploit.`;
13
13
  exports.issueWithoutResources = {
14
14
  id: (0, crypto_1.randomUUID)(),
15
+ entryPointId: 'upmVm5iPkddvzY6RisT7Cr',
15
16
  details: 'Cross-site request forgery is a type of malicious website exploit.',
16
17
  name: 'Database connection crashed',
17
18
  severity: scan_1.Severity.MEDIUM,
@@ -1 +1 @@
1
- {"version":3,"file":"issues.js","sourceRoot":"","sources":["../../../../../packages/reporter/src/__fixtures__/issues.ts"],"names":[],"mappings":";;;AAAA,0CAA8D;AAC9D,mCAAoC;AAEvB,QAAA,yBAAyB,GAAG;;;;;;mEAM0B,CAAC;AACvD,QAAA,qBAAqB,GAAG;IACnC,EAAE,EAAE,IAAA,mBAAU,GAAE;IAChB,OAAO,EAAE,oEAAoE;IAC7E,IAAI,EAAE,6BAA6B;IACnC,QAAQ,EAAE,eAAQ,CAAC,MAAM;IACzB,QAAQ,EAAE,MAAM;IAChB,MAAM,EACJ,2GAA2G;IAC7G,IAAI,EAAE,8CAA8C;IACpD,IAAI,EAAE,IAAI,IAAI,EAAE;IAChB,eAAe,EAAE;QACf,MAAM,EAAE,iBAAU,CAAC,GAAG;QACtB,GAAG,EAAE,6BAA6B;KACnC;IACD,OAAO,EAAE;QACP,MAAM,EAAE,iBAAU,CAAC,GAAG;QACtB,GAAG,EAAE,6BAA6B;KACnC;IACD,IAAI,EAAE,qFAAqF;IAC3F,SAAS,EAAE,IAAI;CACA,CAAC;AAEL,QAAA,uBAAuB,GAAG,GAAG,iCAAyB;;;;;;;oEAOC,CAAC;AACxD,QAAA,mBAAmB,GAAG;IACjC,GAAG,6BAAqB;IACxB,QAAQ,EAAE;QACR;YACE,QAAQ,EAAE,0CAA0C;YACpD,IAAI,EAAE,6IAA6I;YACnJ,KAAK,EAAE;gBACL,mEAAmE;aACpE;SACF;KACF;IACD,SAAS,EAAE;QACT,mEAAmE;KACpE;CACF,CAAC;AACW,QAAA,yBAAyB,GAAG,GAAG,iCAAyB;;qEAEA,CAAC;AACzD,QAAA,qBAAqB,GAAG;IACnC,GAAG,6BAAqB;IACxB,SAAS,EAAE;QACT,mEAAmE;KACpE;CACc,CAAC"}
1
+ {"version":3,"file":"issues.js","sourceRoot":"","sources":["../../../../../packages/reporter/src/__fixtures__/issues.ts"],"names":[],"mappings":";;;AAAA,0CAA8D;AAC9D,mCAAoC;AAEvB,QAAA,yBAAyB,GAAG;;;;;;mEAM0B,CAAC;AACvD,QAAA,qBAAqB,GAAG;IACnC,EAAE,EAAE,IAAA,mBAAU,GAAE;IAChB,YAAY,EAAE,wBAAwB;IACtC,OAAO,EAAE,oEAAoE;IAC7E,IAAI,EAAE,6BAA6B;IACnC,QAAQ,EAAE,eAAQ,CAAC,MAAM;IACzB,QAAQ,EAAE,MAAM;IAChB,MAAM,EACJ,2GAA2G;IAC7G,IAAI,EAAE,8CAA8C;IACpD,IAAI,EAAE,IAAI,IAAI,EAAE;IAChB,eAAe,EAAE;QACf,MAAM,EAAE,iBAAU,CAAC,GAAG;QACtB,GAAG,EAAE,6BAA6B;KACnC;IACD,OAAO,EAAE;QACP,MAAM,EAAE,iBAAU,CAAC,GAAG;QACtB,GAAG,EAAE,6BAA6B;KACnC;IACD,IAAI,EAAE,qFAAqF;IAC3F,SAAS,EAAE,IAAI;CACA,CAAC;AAEL,QAAA,uBAAuB,GAAG,GAAG,iCAAyB;;;;;;;oEAOC,CAAC;AACxD,QAAA,mBAAmB,GAAG;IACjC,GAAG,6BAAqB;IACxB,QAAQ,EAAE;QACR;YACE,QAAQ,EAAE,0CAA0C;YACpD,IAAI,EAAE,6IAA6I;YACnJ,KAAK,EAAE;gBACL,mEAAmE;aACpE;SACF;KACF;IACD,SAAS,EAAE;QACT,mEAAmE;KACpE;CACF,CAAC;AACW,QAAA,yBAAyB,GAAG,GAAG,iCAAyB;;qEAEA,CAAC;AACzD,QAAA,qBAAqB,GAAG;IACnC,GAAG,6BAAqB;IACxB,SAAS,EAAE;QACT,mEAAmE;KACpE;CACc,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { TestReport, JUnitTestSuite, JUnitTestCase } from '../reporters/gitlab/types';
2
+ export declare const createVulnerabilityTestCase: (method: string, endpoint: string, vulnerability: string, time?: number) => JUnitTestCase;
3
+ export declare const createTestCaseWithSystemOut: (baseTestCase: JUnitTestCase, systemOut: string) => JUnitTestCase;
4
+ export declare const createTestCaseWithSpecialChars: (failure: string) => JUnitTestCase;
5
+ export declare const createPassingTestCase: (classname: string, name: string, time?: number) => JUnitTestCase;
6
+ export declare const createTestSuite: (name: string, testCases: JUnitTestCase[], failures?: number) => JUnitTestSuite;
7
+ export declare const brightTestSuite: JUnitTestSuite;
8
+ export declare const criticalBrightTestSuite: JUnitTestSuite;
9
+ export declare const highBrightTestSuite: JUnitTestSuite;
10
+ export declare const minimalTestReport: TestReport;
11
+ export declare const testReportWithSystemOut: TestReport;
12
+ export declare const testReportWithSpecialCharacters: TestReport;
13
+ export declare const testReportWithoutFailures: TestReport;
14
+ export declare const multipleTestSuitesReport: TestReport;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.multipleTestSuitesReport = exports.testReportWithoutFailures = exports.testReportWithSpecialCharacters = exports.testReportWithSystemOut = exports.minimalTestReport = exports.highBrightTestSuite = exports.criticalBrightTestSuite = exports.brightTestSuite = exports.createTestSuite = exports.createPassingTestCase = exports.createTestCaseWithSpecialChars = exports.createTestCaseWithSystemOut = exports.createVulnerabilityTestCase = void 0;
4
+ const createVulnerabilityTestCase = (method, endpoint, vulnerability, time = 0) => ({
5
+ time,
6
+ classname: `${method} ${endpoint}`,
7
+ name: vulnerability,
8
+ file: 'test.spec.ts',
9
+ failure: `${vulnerability} vulnerability found at ${method} ${endpoint}`
10
+ });
11
+ exports.createVulnerabilityTestCase = createVulnerabilityTestCase;
12
+ const createTestCaseWithSystemOut = (baseTestCase, systemOut) => ({
13
+ ...baseTestCase,
14
+ systemOut
15
+ });
16
+ exports.createTestCaseWithSystemOut = createTestCaseWithSystemOut;
17
+ const createTestCaseWithSpecialChars = (failure) => ({
18
+ failure,
19
+ classname: 'GET https://example.com/api/search',
20
+ name: 'XSS',
21
+ file: 'test.spec.ts',
22
+ time: 0
23
+ });
24
+ exports.createTestCaseWithSpecialChars = createTestCaseWithSpecialChars;
25
+ const createPassingTestCase = (classname, name, time = 0.5) => ({
26
+ classname,
27
+ name,
28
+ time,
29
+ file: 'test.spec.ts'
30
+ });
31
+ exports.createPassingTestCase = createPassingTestCase;
32
+ const createTestSuite = (name, testCases, failures) => ({
33
+ name,
34
+ testCases,
35
+ tests: testCases.length,
36
+ failures: failures !== null && failures !== void 0 ? failures : testCases.filter(tc => tc.failure).length
37
+ });
38
+ exports.createTestSuite = createTestSuite;
39
+ exports.brightTestSuite = (0, exports.createTestSuite)('Bright Tests', [
40
+ (0, exports.createVulnerabilityTestCase)('POST', 'https://example.com/api/users', 'SQLi')
41
+ ]);
42
+ exports.criticalBrightTestSuite = (0, exports.createTestSuite)('Critical Bright Tests', [(0, exports.createVulnerabilityTestCase)('POST', 'https://example.com/api/users', 'SQLi')]);
43
+ exports.highBrightTestSuite = (0, exports.createTestSuite)('High Bright Tests', [
44
+ (0, exports.createVulnerabilityTestCase)('PUT', 'https://example.com/api/profile', 'XSS')
45
+ ]);
46
+ exports.minimalTestReport = {
47
+ testSuites: [exports.brightTestSuite]
48
+ };
49
+ exports.testReportWithSystemOut = {
50
+ testSuites: [
51
+ (0, exports.createTestSuite)('Bright Tests', [
52
+ (0, exports.createTestCaseWithSystemOut)((0, exports.createVulnerabilityTestCase)('GET', 'https://example.com/api/search', 'XSS'), '{"id": "issue-1", "name": "XSS"}')
53
+ ])
54
+ ]
55
+ };
56
+ exports.testReportWithSpecialCharacters = {
57
+ testSuites: [
58
+ (0, exports.createTestSuite)('Bright Tests & More', [
59
+ (0, exports.createTestCaseWithSpecialChars)('XSS vulnerability found at GET https://example.com/api/search?q=Bar & Co')
60
+ ])
61
+ ]
62
+ };
63
+ exports.testReportWithoutFailures = {
64
+ testSuites: [
65
+ (0, exports.createTestSuite)('Bright Tests', [(0, exports.createPassingTestCase)('GET https://example.com/api/search', 'XSS')], 0)
66
+ ]
67
+ };
68
+ exports.multipleTestSuitesReport = {
69
+ testSuites: [exports.criticalBrightTestSuite, exports.highBrightTestSuite]
70
+ };
71
+ //# sourceMappingURL=junit-reports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"junit-reports.js","sourceRoot":"","sources":["../../../../../packages/reporter/src/__fixtures__/junit-reports.ts"],"names":[],"mappings":"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"}
package/src/index.d.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  export { PlainTextFormatter } from './formatters';
2
2
  export { Reporter, Formatter } from './lib';
3
- export { GitHubCheckRunReporter, StdReporter } from './reporters';
3
+ export { GitHubCheckRunReporter, GitLabReporter, StdReporter } from './reporters';
package/src/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.StdReporter = exports.GitHubCheckRunReporter = exports.Formatter = exports.Reporter = exports.PlainTextFormatter = void 0;
3
+ exports.StdReporter = exports.GitLabReporter = exports.GitHubCheckRunReporter = exports.Formatter = exports.Reporter = exports.PlainTextFormatter = void 0;
4
4
  var formatters_1 = require("./formatters");
5
5
  Object.defineProperty(exports, "PlainTextFormatter", { enumerable: true, get: function () { return formatters_1.PlainTextFormatter; } });
6
6
  var lib_1 = require("./lib");
@@ -8,5 +8,6 @@ Object.defineProperty(exports, "Reporter", { enumerable: true, get: function ()
8
8
  Object.defineProperty(exports, "Formatter", { enumerable: true, get: function () { return lib_1.Formatter; } });
9
9
  var reporters_1 = require("./reporters");
10
10
  Object.defineProperty(exports, "GitHubCheckRunReporter", { enumerable: true, get: function () { return reporters_1.GitHubCheckRunReporter; } });
11
+ Object.defineProperty(exports, "GitLabReporter", { enumerable: true, get: function () { return reporters_1.GitLabReporter; } });
11
12
  Object.defineProperty(exports, "StdReporter", { enumerable: true, get: function () { return reporters_1.StdReporter; } });
12
13
  //# sourceMappingURL=index.js.map
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/reporter/src/index.ts"],"names":[],"mappings":";;;AAAA,2CAAkD;AAAzC,gHAAA,kBAAkB,OAAA;AAC3B,6BAA4C;AAAnC,+FAAA,QAAQ,OAAA;AAAE,gGAAA,SAAS,OAAA;AAC5B,yCAAkE;AAAzD,mHAAA,sBAAsB,OAAA;AAAE,wGAAA,WAAW,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/reporter/src/index.ts"],"names":[],"mappings":";;;AAAA,2CAAkD;AAAzC,gHAAA,kBAAkB,OAAA;AAC3B,6BAA4C;AAAnC,+FAAA,QAAQ,OAAA;AAAE,gGAAA,SAAS,OAAA;AAC5B,yCAIqB;AAHnB,mHAAA,sBAAsB,OAAA;AACtB,2GAAA,cAAc,OAAA;AACd,wGAAA,WAAW,OAAA"}
@@ -1,12 +1,13 @@
1
1
  import { Reporter } from '../../lib';
2
2
  import type { GitHubClient } from './api';
3
3
  import type { GitHubConfig } from './types';
4
+ import { TestFilePathResolver } from '../../utils';
4
5
  import type { Scan } from '@sectester/scan';
5
6
  export declare class GitHubCheckRunReporter implements Reporter {
6
7
  private readonly config;
7
8
  private readonly githubClient;
8
- constructor(config: GitHubConfig, githubClient: GitHubClient);
9
+ private readonly testFilePathResolver;
10
+ constructor(config: GitHubConfig, githubClient: GitHubClient, testFilePathResolver: TestFilePathResolver);
9
11
  report(scan: Scan): Promise<void>;
10
12
  private createCheckRunPayloadBuilder;
11
- private getTestFilePath;
12
13
  }
@@ -4,13 +4,14 @@ exports.GitHubCheckRunReporter = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const api_1 = require("./api");
6
6
  const builders_1 = require("./builders");
7
+ const utils_1 = require("../../utils");
7
8
  const tsyringe_1 = require("tsyringe");
8
- const node_path_1 = tslib_1.__importDefault(require("node:path"));
9
9
  // TODO add `GitHubCheckRunReporter` description to README
10
10
  let GitHubCheckRunReporter = class GitHubCheckRunReporter {
11
- constructor(config, githubClient) {
11
+ constructor(config, githubClient, testFilePathResolver) {
12
12
  this.config = config;
13
13
  this.githubClient = githubClient;
14
+ this.testFilePathResolver = testFilePathResolver;
14
15
  if (!this.config.token) {
15
16
  throw new Error('GitHub token is not set');
16
17
  }
@@ -29,25 +30,10 @@ let GitHubCheckRunReporter = class GitHubCheckRunReporter {
29
30
  await this.githubClient.createCheckRun(checkRunPayload);
30
31
  }
31
32
  createCheckRunPayloadBuilder(issues) {
33
+ const testFilePath = this.testFilePathResolver.getTestFilePath();
32
34
  return issues.length === 1
33
- ? new builders_1.SingleItemPayloadBuilder(issues[0], this.config.commitSha, this.getTestFilePath())
34
- : new builders_1.MultiItemsPayloadBuilder(issues, this.config.commitSha, this.getTestFilePath());
35
- }
36
- // TODO subject to improvement
37
- getTestFilePath() {
38
- var _a;
39
- // Check if running in Jest environment
40
- const jestState = (_a = global.expect) === null || _a === void 0 ? void 0 : _a.getState();
41
- if (jestState) {
42
- const testPath = jestState.testPath;
43
- const rootDir = jestState.snapshotState._rootDir;
44
- return node_path_1.default.join(node_path_1.default.basename(rootDir), node_path_1.default.relative(rootDir, testPath));
45
- }
46
- // Relies on `TestContext` from Node.js built-in test runner appearing in the stack
47
- const matchRes = String(new Error().stack).match(/\n\s+at (?:async )?TestContext.* \((.*):\d+:\d+\)\n/);
48
- return (matchRes === null || matchRes === void 0 ? void 0 : matchRes[1])
49
- ? node_path_1.default.relative(process.cwd(), matchRes[1] || '')
50
- : 'unknown';
35
+ ? new builders_1.SingleItemPayloadBuilder(issues[0], this.config.commitSha, testFilePath)
36
+ : new builders_1.MultiItemsPayloadBuilder(issues, this.config.commitSha, testFilePath);
51
37
  }
52
38
  };
53
39
  exports.GitHubCheckRunReporter = GitHubCheckRunReporter;
@@ -55,6 +41,7 @@ exports.GitHubCheckRunReporter = GitHubCheckRunReporter = tslib_1.__decorate([
55
41
  (0, tsyringe_1.injectable)(),
56
42
  tslib_1.__param(0, (0, tsyringe_1.inject)(api_1.GITHUB_CONFIG)),
57
43
  tslib_1.__param(1, (0, tsyringe_1.inject)(api_1.GITHUB_CLIENT)),
58
- tslib_1.__metadata("design:paramtypes", [Object, Object])
44
+ tslib_1.__param(2, (0, tsyringe_1.inject)(utils_1.TEST_FILE_PATH_RESOLVER)),
45
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Object])
59
46
  ], GitHubCheckRunReporter);
60
47
  //# sourceMappingURL=GitHubCheckRunReporter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GitHubCheckRunReporter.js","sourceRoot":"","sources":["../../../../../../packages/reporter/src/reporters/github/GitHubCheckRunReporter.ts"],"names":[],"mappings":";;;;AACA,+BAAqD;AAErD,yCAAgF;AAGhF,uCAA8C;AAE9C,kEAA6B;AAE7B,0DAA0D;AAEnD,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACjC,YAC0C,MAAoB,EACpB,YAA0B;QAD1B,WAAM,GAAN,MAAM,CAAc;QACpB,iBAAY,GAAZ,YAAY,CAAc;QAElE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,IAAU;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEhC,MAAM,eAAe,GAAG,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;QAC1E,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IAC1D,CAAC;IAEO,4BAA4B,CAClC,MAAe;QAEf,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC;YACxB,CAAC,CAAC,IAAI,mCAAwB,CAC1B,MAAM,CAAC,CAAC,CAAC,EACT,IAAI,CAAC,MAAM,CAAC,SAAS,EACrB,IAAI,CAAC,eAAe,EAAE,CACvB;YACH,CAAC,CAAC,IAAI,mCAAwB,CAC1B,MAAM,EACN,IAAI,CAAC,MAAM,CAAC,SAAS,EACrB,IAAI,CAAC,eAAe,EAAE,CACvB,CAAC;IACR,CAAC;IAED,8BAA8B;IACtB,eAAe;;QACrB,uCAAuC;QACvC,MAAM,SAAS,GAAG,MAAC,MAAc,CAAC,MAAM,0CAAE,QAAQ,EAAE,CAAC;QACrD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;YACpC,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC;YAEjD,OAAO,mBAAI,CAAC,IAAI,CACd,mBAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EACtB,mBAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CACjC,CAAC;QACJ,CAAC;QAED,mFAAmF;QACnF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,CAC9C,qDAAqD,CACtD,CAAC;QAEF,OAAO,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,CAAC,CAAC;YAClB,CAAC,CAAC,mBAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjD,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;CACF,CAAA;AAjEY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,qBAAU,GAAE;IAGR,mBAAA,IAAA,iBAAM,EAAC,mBAAa,CAAC,CAAA;IACrB,mBAAA,IAAA,iBAAM,EAAC,mBAAa,CAAC,CAAA;;GAHb,sBAAsB,CAiElC"}
1
+ {"version":3,"file":"GitHubCheckRunReporter.js","sourceRoot":"","sources":["../../../../../../packages/reporter/src/reporters/github/GitHubCheckRunReporter.ts"],"names":[],"mappings":";;;;AACA,+BAAqD;AAErD,yCAAgF;AAGhF,uCAA4E;AAC5E,uCAA8C;AAG9C,0DAA0D;AAEnD,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACjC,YAC0C,MAAoB,EACpB,YAA0B,EAEjD,oBAA0C;QAHnB,WAAM,GAAN,MAAM,CAAc;QACpB,iBAAY,GAAZ,YAAY,CAAc;QAEjD,yBAAoB,GAApB,oBAAoB,CAAsB;QAE3D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,IAAU;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEhC,MAAM,eAAe,GAAG,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;QAC1E,MAAM,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;IAC1D,CAAC;IAEO,4BAA4B,CAClC,MAAe;QAEf,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAC;QAEjE,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC;YACxB,CAAC,CAAC,IAAI,mCAAwB,CAC1B,MAAM,CAAC,CAAC,CAAC,EACT,IAAI,CAAC,MAAM,CAAC,SAAS,EACrB,YAAY,CACb;YACH,CAAC,CAAC,IAAI,mCAAwB,CAC1B,MAAM,EACN,IAAI,CAAC,MAAM,CAAC,SAAS,EACrB,YAAY,CACb,CAAC;IACR,CAAC;CACF,CAAA;AA7CY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,qBAAU,GAAE;IAGR,mBAAA,IAAA,iBAAM,EAAC,mBAAa,CAAC,CAAA;IACrB,mBAAA,IAAA,iBAAM,EAAC,mBAAa,CAAC,CAAA;IACrB,mBAAA,IAAA,iBAAM,EAAC,+BAAuB,CAAC,CAAA;;GAJvB,sBAAsB,CA6ClC"}
@@ -0,0 +1,15 @@
1
+ import { Reporter } from '../../lib';
2
+ import type { GitLabCIArtifacts, GitLabConfig } from './api';
3
+ import { TestFilePathResolver } from '../../utils';
4
+ import type { Scan } from '@sectester/scan';
5
+ export declare class GitLabReporter implements Reporter {
6
+ private readonly gitlabCIArtifacts;
7
+ private readonly config;
8
+ private readonly testFilePathResolver;
9
+ constructor(gitlabCIArtifacts: GitLabCIArtifacts, config: GitLabConfig, testFilePathResolver: TestFilePathResolver);
10
+ report(scan: Scan): Promise<void>;
11
+ private generateCodeQualityReport;
12
+ private generateTestReport;
13
+ private createCodeQualityReportBuilder;
14
+ private createJUnitReportBuilder;
15
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitLabReporter = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const api_1 = require("./api");
6
+ const builders_1 = require("./builders");
7
+ const utils_1 = require("../../utils");
8
+ const tsyringe_1 = require("tsyringe");
9
+ let GitLabReporter = class GitLabReporter {
10
+ constructor(gitlabCIArtifacts, config, testFilePathResolver) {
11
+ this.gitlabCIArtifacts = gitlabCIArtifacts;
12
+ this.config = config;
13
+ this.testFilePathResolver = testFilePathResolver;
14
+ }
15
+ async report(scan) {
16
+ var _a;
17
+ const issues = await scan.issues();
18
+ if (issues.length > 0) {
19
+ const reportFormat = (_a = this.config.reportFormat) !== null && _a !== void 0 ? _a : 'test';
20
+ switch (reportFormat) {
21
+ case 'code-quality':
22
+ await this.generateCodeQualityReport(issues);
23
+ break;
24
+ case 'test':
25
+ await this.generateTestReport(issues);
26
+ break;
27
+ case 'both':
28
+ default:
29
+ await Promise.all([
30
+ this.generateCodeQualityReport(issues),
31
+ this.generateTestReport(issues)
32
+ ]);
33
+ break;
34
+ }
35
+ }
36
+ }
37
+ async generateCodeQualityReport(issues) {
38
+ const testFilePath = this.testFilePathResolver.getTestFilePath();
39
+ const codeQualityReport = this.createCodeQualityReportBuilder(issues, testFilePath).build();
40
+ await this.gitlabCIArtifacts.writeCodeQualityReport(codeQualityReport);
41
+ }
42
+ async generateTestReport(issues) {
43
+ const testFilePath = this.testFilePathResolver.getTestFilePath();
44
+ const testReport = this.createJUnitReportBuilder(issues, testFilePath).build();
45
+ await this.gitlabCIArtifacts.writeTestReport(testReport);
46
+ }
47
+ createCodeQualityReportBuilder(issues, testFilePath) {
48
+ return new builders_1.CodeQualityReportBuilder(issues, testFilePath);
49
+ }
50
+ createJUnitReportBuilder(issues, testFilePath) {
51
+ return new builders_1.JUnitReportBuilder(issues, testFilePath);
52
+ }
53
+ };
54
+ exports.GitLabReporter = GitLabReporter;
55
+ exports.GitLabReporter = GitLabReporter = tslib_1.__decorate([
56
+ (0, tsyringe_1.injectable)(),
57
+ tslib_1.__param(0, (0, tsyringe_1.inject)(api_1.GITLAB_CI_ARTIFACTS)),
58
+ tslib_1.__param(1, (0, tsyringe_1.inject)(api_1.GITLAB_CONFIG)),
59
+ tslib_1.__param(2, (0, tsyringe_1.inject)(utils_1.TEST_FILE_PATH_RESOLVER)),
60
+ tslib_1.__metadata("design:paramtypes", [Object, Object, Object])
61
+ ], GitLabReporter);
62
+ //# sourceMappingURL=GitLabReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitLabReporter.js","sourceRoot":"","sources":["../../../../../../packages/reporter/src/reporters/gitlab/GitLabReporter.ts"],"names":[],"mappings":";;;;AACA,+BAA2D;AAE3D,yCAA0E;AAC1E,uCAA4E;AAC5E,uCAA8C;AAIvC,IAAM,cAAc,GAApB,MAAM,cAAc;IACzB,YAEmB,iBAAoC,EAEpC,MAAoB,EAEpB,oBAA0C;QAJ1C,sBAAiB,GAAjB,iBAAiB,CAAmB;QAEpC,WAAM,GAAN,MAAM,CAAc;QAEpB,yBAAoB,GAApB,oBAAoB,CAAsB;IAC1D,CAAC;IAEG,KAAK,CAAC,MAAM,CAAC,IAAU;;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAEnC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,YAAY,GAAG,MAAA,IAAI,CAAC,MAAM,CAAC,YAAY,mCAAI,MAAM,CAAC;YAExD,QAAQ,YAAY,EAAE,CAAC;gBACrB,KAAK,cAAc;oBACjB,MAAM,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;oBAC7C,MAAM;gBACR,KAAK,MAAM;oBACT,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;oBACtC,MAAM;gBACR,KAAK,MAAM,CAAC;gBACZ;oBACE,MAAM,OAAO,CAAC,GAAG,CAAC;wBAChB,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC;wBACtC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;qBAChC,CAAC,CAAC;oBACH,MAAM;YACV,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,MAAe;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAC;QACjE,MAAM,iBAAiB,GAAG,IAAI,CAAC,8BAA8B,CAC3D,MAAM,EACN,YAAY,CACb,CAAC,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;IACzE,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,MAAe;QAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAC;QACjE,MAAM,UAAU,GAAG,IAAI,CAAC,wBAAwB,CAC9C,MAAM,EACN,YAAY,CACb,CAAC,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IAC3D,CAAC;IAEO,8BAA8B,CACpC,MAAe,EACf,YAAoB;QAEpB,OAAO,IAAI,mCAAwB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC5D,CAAC;IAEO,wBAAwB,CAC9B,MAAe,EACf,YAAoB;QAEpB,OAAO,IAAI,6BAAkB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACtD,CAAC;CACF,CAAA;AAjEY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,qBAAU,GAAE;IAGR,mBAAA,IAAA,iBAAM,EAAC,yBAAmB,CAAC,CAAA;IAE3B,mBAAA,IAAA,iBAAM,EAAC,mBAAa,CAAC,CAAA;IAErB,mBAAA,IAAA,iBAAM,EAAC,+BAAuB,CAAC,CAAA;;GANvB,cAAc,CAiE1B"}
@@ -0,0 +1,6 @@
1
+ import type { CodeQualityReport, TestReport } from '../types';
2
+ export interface GitLabCIArtifacts {
3
+ writeCodeQualityReport(report: CodeQualityReport): Promise<void>;
4
+ writeTestReport(report: TestReport): Promise<void>;
5
+ }
6
+ export declare const GITLAB_CI_ARTIFACTS: unique symbol;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GITLAB_CI_ARTIFACTS = void 0;
4
+ exports.GITLAB_CI_ARTIFACTS = Symbol('GITLAB_CI_ARTIFACTS');
5
+ //# sourceMappingURL=GitLabCIArtifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitLabCIArtifacts.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/api/GitLabCIArtifacts.ts"],"names":[],"mappings":";;;AAOa,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { CodeQualityReport, TestReport } from '../types';
2
+ import type { GitLabCIArtifacts } from './GitLabCIArtifacts';
3
+ import type { GitLabConfig } from './GitLabConfig';
4
+ export declare class GitLabCIArtifactsFileWriter implements GitLabCIArtifacts {
5
+ private readonly config;
6
+ constructor(config: GitLabConfig);
7
+ writeCodeQualityReport(report: CodeQualityReport): Promise<void>;
8
+ writeTestReport(report: TestReport): Promise<void>;
9
+ private generateUniqueFileName;
10
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitLabCIArtifactsFileWriter = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const GitLabConfig_1 = require("./GitLabConfig");
6
+ const utils_1 = require("../utils");
7
+ const tsyringe_1 = require("tsyringe");
8
+ const promises_1 = require("node:fs/promises");
9
+ const node_crypto_1 = require("node:crypto");
10
+ const node_path_1 = require("node:path");
11
+ let GitLabCIArtifactsFileWriter = class GitLabCIArtifactsFileWriter {
12
+ constructor(config) {
13
+ this.config = config;
14
+ }
15
+ async writeCodeQualityReport(report) {
16
+ // This method writes GitLab Code Quality reports to a file.
17
+ // To display these reports in GitLab merge requests, you need to configure your .gitlab-ci.yml:
18
+ // artifacts:
19
+ // reports:
20
+ // codequality: gl-code-quality-report.json
21
+ const reportJson = JSON.stringify(report, null, 2);
22
+ const filename = this.config.codeQualityReportFilename;
23
+ await (0, promises_1.writeFile)(filename, reportJson, 'utf-8');
24
+ }
25
+ async writeTestReport(report) {
26
+ const fileName = this.generateUniqueFileName();
27
+ // This method writes GitLab Test reports in JUnit XML format to a file.
28
+ // To display these reports in GitLab merge requests, you need to configure your .gitlab-ci.yml:
29
+ // artifacts:
30
+ // reports:
31
+ // junit: gl-test-report-*.xml
32
+ // Note: Filenames are automatically made unique for concurrent test runs
33
+ const reportXml = (0, utils_1.buildJUnitXML)(report);
34
+ await (0, promises_1.writeFile)(fileName, reportXml, 'utf-8');
35
+ }
36
+ generateUniqueFileName() {
37
+ const ext = (0, node_path_1.extname)(this.config.testReportFilename);
38
+ const baseName = (0, node_path_1.basename)(this.config.testReportFilename, ext);
39
+ const fileName = `${baseName}-${(0, node_crypto_1.randomUUID)()}.${ext}`;
40
+ return fileName;
41
+ }
42
+ };
43
+ exports.GitLabCIArtifactsFileWriter = GitLabCIArtifactsFileWriter;
44
+ exports.GitLabCIArtifactsFileWriter = GitLabCIArtifactsFileWriter = tslib_1.__decorate([
45
+ (0, tsyringe_1.injectable)(),
46
+ tslib_1.__param(0, (0, tsyringe_1.inject)(GitLabConfig_1.GITLAB_CONFIG)),
47
+ tslib_1.__metadata("design:paramtypes", [Object])
48
+ ], GitLabCIArtifactsFileWriter);
49
+ //# sourceMappingURL=GitLabCodeQualityFileWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitLabCodeQualityFileWriter.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/api/GitLabCodeQualityFileWriter.ts"],"names":[],"mappings":";;;;AAGA,iDAA+C;AAC/C,oCAAyC;AACzC,uCAA8C;AAC9C,+CAA6C;AAC7C,6CAAyC;AACzC,yCAA8C;AAGvC,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IACtC,YAAoD,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAErE,KAAK,CAAC,sBAAsB,CACjC,MAAyB;QAEzB,4DAA4D;QAC5D,gGAAgG;QAChG,eAAe;QACf,eAAe;QACf,iDAAiD;QACjD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC;QACvD,MAAM,IAAA,oBAAS,EAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,MAAkB;QAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC/C,wEAAwE;QACxE,gGAAgG;QAChG,eAAe;QACf,eAAe;QACf,oCAAoC;QACpC,yEAAyE;QACzE,MAAM,SAAS,GAAG,IAAA,qBAAa,EAAC,MAAM,CAAC,CAAC;QACxC,MAAM,IAAA,oBAAS,EAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAEO,sBAAsB;QAC5B,MAAM,GAAG,GAAG,IAAA,mBAAO,EAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAA,oBAAQ,EAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,GAAG,QAAQ,IAAI,IAAA,wBAAU,GAAE,IAAI,GAAG,EAAE,CAAC;QAEtD,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAA;AAnCY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,qBAAU,GAAE;IAEE,mBAAA,IAAA,iBAAM,EAAC,4BAAa,CAAC,CAAA;;GADvB,2BAA2B,CAmCvC"}
@@ -0,0 +1,7 @@
1
+ export type GitLabReportFormat = 'code-quality' | 'test' | 'both';
2
+ export interface GitLabConfig {
3
+ codeQualityReportFilename: string;
4
+ testReportFilename: string;
5
+ reportFormat?: GitLabReportFormat;
6
+ }
7
+ export declare const GITLAB_CONFIG: unique symbol;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GITLAB_CONFIG = void 0;
4
+ exports.GITLAB_CONFIG = Symbol('GITLAB_CONFIG');
5
+ //# sourceMappingURL=GitLabConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitLabConfig.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/api/GitLabConfig.ts"],"names":[],"mappings":";;;AAQa,QAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { GitLabCIArtifacts, GITLAB_CI_ARTIFACTS } from './GitLabCIArtifacts';
2
+ export { GitLabCIArtifactsFileWriter } from './GitLabCodeQualityFileWriter';
3
+ export { GitLabConfig, GITLAB_CONFIG } from './GitLabConfig';
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GITLAB_CONFIG = exports.GitLabCIArtifactsFileWriter = exports.GITLAB_CI_ARTIFACTS = void 0;
4
+ var GitLabCIArtifacts_1 = require("./GitLabCIArtifacts");
5
+ Object.defineProperty(exports, "GITLAB_CI_ARTIFACTS", { enumerable: true, get: function () { return GitLabCIArtifacts_1.GITLAB_CI_ARTIFACTS; } });
6
+ var GitLabCodeQualityFileWriter_1 = require("./GitLabCodeQualityFileWriter");
7
+ Object.defineProperty(exports, "GitLabCIArtifactsFileWriter", { enumerable: true, get: function () { return GitLabCodeQualityFileWriter_1.GitLabCIArtifactsFileWriter; } });
8
+ var GitLabConfig_1 = require("./GitLabConfig");
9
+ Object.defineProperty(exports, "GITLAB_CONFIG", { enumerable: true, get: function () { return GitLabConfig_1.GITLAB_CONFIG; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/api/index.ts"],"names":[],"mappings":";;;AAAA,yDAA6E;AAAjD,wHAAA,mBAAmB,OAAA;AAC/C,6EAA4E;AAAnE,0IAAA,2BAA2B,OAAA;AACpC,+CAA6D;AAAtC,6GAAA,aAAa,OAAA"}
@@ -0,0 +1 @@
1
+ import 'reflect-metadata';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ require("reflect-metadata");
4
+ const GitLabCodeQualityFileWriter_1 = require("./GitLabCodeQualityFileWriter");
5
+ const GitLabCIArtifacts_1 = require("./GitLabCIArtifacts");
6
+ const GitLabConfig_1 = require("./GitLabConfig");
7
+ const tsyringe_1 = require("tsyringe");
8
+ tsyringe_1.container.register(GitLabConfig_1.GITLAB_CONFIG, {
9
+ useValue: {
10
+ codeQualityReportFilename: process.env.GITLAB_CODE_QUALITY_REPORT_FILENAME ||
11
+ 'gl-code-quality-report.json',
12
+ testReportFilename: process.env.GITLAB_TEST_REPORT_FILENAME || 'gl-test-report.xml',
13
+ reportFormat: process.env.GITLAB_REPORT_FORMAT || 'both'
14
+ }
15
+ });
16
+ tsyringe_1.container.register(GitLabCIArtifacts_1.GITLAB_CI_ARTIFACTS, {
17
+ useClass: GitLabCodeQualityFileWriter_1.GitLabCIArtifactsFileWriter
18
+ });
19
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/api/register.ts"],"names":[],"mappings":";;AAAA,4BAA0B;AAC1B,+EAA4E;AAC5E,2DAA0D;AAC1D,iDAA+C;AAC/C,uCAAqC;AAErC,oBAAS,CAAC,QAAQ,CAAC,4BAAa,EAAE;IAChC,QAAQ,EAAE;QACR,yBAAyB,EACvB,OAAO,CAAC,GAAG,CAAC,mCAAmC;YAC/C,6BAA6B;QAC/B,kBAAkB,EAChB,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,oBAAoB;QACjE,YAAY,EAAG,OAAO,CAAC,GAAG,CAAC,oBAA4B,IAAI,MAAM;KAClE;CACF,CAAC,CAAC;AAEH,oBAAS,CAAC,QAAQ,CAAC,uCAAmB,EAAE;IACtC,QAAQ,EAAE,yDAA2B;CACtC,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { CodeQualityReport } from '../types';
2
+ import { Issue } from '@sectester/scan';
3
+ export declare class CodeQualityReportBuilder {
4
+ private readonly issues;
5
+ private readonly testFilePath;
6
+ constructor(issues: Issue[], testFilePath: string);
7
+ build(): CodeQualityReport;
8
+ private convertIssueToCodeQualityIssue;
9
+ private createFingerprint;
10
+ private mapSeverity;
11
+ }
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodeQualityReportBuilder = void 0;
4
+ const scan_1 = require("@sectester/scan");
5
+ const node_crypto_1 = require("node:crypto");
6
+ class CodeQualityReportBuilder {
7
+ constructor(issues, testFilePath) {
8
+ this.issues = issues;
9
+ this.testFilePath = testFilePath;
10
+ }
11
+ build() {
12
+ return this.issues.map(issue => this.convertIssueToCodeQualityIssue(issue));
13
+ }
14
+ convertIssueToCodeQualityIssue(issue) {
15
+ const { originalRequest, name, severity } = issue;
16
+ const description = `${name} vulnerability found at ${originalRequest.method.toUpperCase()} ${originalRequest.url}`;
17
+ const fingerprint = this.createFingerprint(issue);
18
+ const gitlabSeverity = this.mapSeverity(severity);
19
+ return {
20
+ description,
21
+ fingerprint,
22
+ check_name: name,
23
+ severity: gitlabSeverity,
24
+ raw_details: JSON.stringify(issue, null, 2),
25
+ location: {
26
+ path: this.testFilePath,
27
+ lines: {
28
+ begin: 1
29
+ }
30
+ }
31
+ };
32
+ }
33
+ createFingerprint(issue) {
34
+ const content = `${issue.name}-${issue.entryPointId}`;
35
+ return (0, node_crypto_1.createHash)('md5').update(content).digest('hex');
36
+ }
37
+ mapSeverity(severity) {
38
+ switch (severity) {
39
+ case scan_1.Severity.LOW:
40
+ return 'minor';
41
+ case scan_1.Severity.MEDIUM:
42
+ return 'major';
43
+ case scan_1.Severity.HIGH:
44
+ return 'critical';
45
+ case scan_1.Severity.CRITICAL:
46
+ return 'blocker';
47
+ default:
48
+ return 'info';
49
+ }
50
+ }
51
+ }
52
+ exports.CodeQualityReportBuilder = CodeQualityReportBuilder;
53
+ //# sourceMappingURL=CodeQualityReportBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeQualityReportBuilder.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/builders/CodeQualityReportBuilder.ts"],"names":[],"mappings":";;;AAKA,0CAAkD;AAClD,6CAAyC;AAEzC,MAAa,wBAAwB;IACnC,YACmB,MAAe,EACf,YAAoB;QADpB,WAAM,GAAN,MAAM,CAAS;QACf,iBAAY,GAAZ,YAAY,CAAQ;IACpC,CAAC;IAEG,KAAK;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9E,CAAC;IAEO,8BAA8B,CAAC,KAAY;QACjD,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;QAClD,MAAM,WAAW,GAAG,GAAG,IAAI,2BAA2B,eAAe,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,eAAe,CAAC,GAAG,EAAE,CAAC;QAEpH,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAElD,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAElD,OAAO;YACL,WAAW;YACX,WAAW;YACX,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,cAAc;YACxB,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3C,QAAQ,EAAE;gBACR,IAAI,EAAE,IAAI,CAAC,YAAY;gBACvB,KAAK,EAAE;oBACL,KAAK,EAAE,CAAC;iBACT;aACF;SACF,CAAC;IACJ,CAAC;IAEO,iBAAiB,CAAC,KAAY;QACpC,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QAEtD,OAAO,IAAA,wBAAU,EAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;IAEO,WAAW,CAAC,QAAkB;QACpC,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,eAAQ,CAAC,GAAG;gBACf,OAAO,OAAO,CAAC;YACjB,KAAK,eAAQ,CAAC,MAAM;gBAClB,OAAO,OAAO,CAAC;YACjB,KAAK,eAAQ,CAAC,IAAI;gBAChB,OAAO,UAAU,CAAC;YACpB,KAAK,eAAQ,CAAC,QAAQ;gBACpB,OAAO,SAAS,CAAC;YACnB;gBACE,OAAO,MAAM,CAAC;QAClB,CAAC;IACH,CAAC;CACF;AArDD,4DAqDC"}
@@ -0,0 +1,10 @@
1
+ import type { TestReport } from '../types';
2
+ import { type Issue } from '@sectester/scan';
3
+ export declare class JUnitReportBuilder {
4
+ private readonly issues;
5
+ private readonly testFilePath;
6
+ constructor(issues: Issue[], testFilePath: string);
7
+ build(): TestReport;
8
+ private createTestSuite;
9
+ private convertIssueToTestCase;
10
+ }
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JUnitReportBuilder = void 0;
4
+ class JUnitReportBuilder {
5
+ constructor(issues, testFilePath) {
6
+ this.issues = issues;
7
+ this.testFilePath = testFilePath;
8
+ }
9
+ build() {
10
+ const testSuite = this.createTestSuite();
11
+ return {
12
+ testSuites: [testSuite]
13
+ };
14
+ }
15
+ createTestSuite() {
16
+ const testCases = this.issues.map(issue => this.convertIssueToTestCase(issue));
17
+ const failures = testCases.filter(tc => tc.failure).length;
18
+ return {
19
+ testCases,
20
+ failures,
21
+ name: 'Bright Tests',
22
+ tests: testCases.length,
23
+ time: 0 // We don't have execution time
24
+ };
25
+ }
26
+ convertIssueToTestCase(issue) {
27
+ const { originalRequest, name } = issue;
28
+ const failure = `${name} vulnerability found at ${originalRequest.method.toUpperCase()} ${originalRequest.url}`;
29
+ const baseUrl = new URL(originalRequest.url);
30
+ baseUrl.hash = '';
31
+ baseUrl.search = '';
32
+ return {
33
+ failure,
34
+ name,
35
+ classname: `${originalRequest.method.toUpperCase()} ${baseUrl.toString()}`,
36
+ file: this.testFilePath,
37
+ time: 0,
38
+ systemOut: JSON.stringify(issue)
39
+ };
40
+ }
41
+ }
42
+ exports.JUnitReportBuilder = JUnitReportBuilder;
43
+ //# sourceMappingURL=JUnitReportBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JUnitReportBuilder.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/builders/JUnitReportBuilder.ts"],"names":[],"mappings":";;;AAGA,MAAa,kBAAkB;IAC7B,YACmB,MAAe,EACf,YAAoB;QADpB,WAAM,GAAN,MAAM,CAAS;QACf,iBAAY,GAAZ,YAAY,CAAQ;IACpC,CAAC;IAEG,KAAK;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAEzC,OAAO;YACL,UAAU,EAAE,CAAC,SAAS,CAAC;SACxB,CAAC;IACJ,CAAC;IAEO,eAAe;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACxC,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CACnC,CAAC;QACF,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAE3D,OAAO;YACL,SAAS;YACT,QAAQ;YACR,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,SAAS,CAAC,MAAM;YACvB,IAAI,EAAE,CAAC,CAAC,+BAA+B;SACxC,CAAC;IACJ,CAAC;IAEO,sBAAsB,CAAC,KAAY;QACzC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;QACxC,MAAM,OAAO,GAAG,GAAG,IAAI,2BAA2B,eAAe,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,eAAe,CAAC,GAAG,EAAE,CAAC;QAEhH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,GAAG,EAAE,CAAC;QAEpB,OAAO;YACL,OAAO;YACP,IAAI;YACJ,SAAS,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE;YAC1E,IAAI,EAAE,IAAI,CAAC,YAAY;YACvB,IAAI,EAAE,CAAC;YACP,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SACjC,CAAC;IACJ,CAAC;CACF;AA9CD,gDA8CC"}
@@ -0,0 +1,2 @@
1
+ export { CodeQualityReportBuilder } from './CodeQualityReportBuilder';
2
+ export { JUnitReportBuilder } from './JUnitReportBuilder';
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JUnitReportBuilder = exports.CodeQualityReportBuilder = void 0;
4
+ var CodeQualityReportBuilder_1 = require("./CodeQualityReportBuilder");
5
+ Object.defineProperty(exports, "CodeQualityReportBuilder", { enumerable: true, get: function () { return CodeQualityReportBuilder_1.CodeQualityReportBuilder; } });
6
+ var JUnitReportBuilder_1 = require("./JUnitReportBuilder");
7
+ Object.defineProperty(exports, "JUnitReportBuilder", { enumerable: true, get: function () { return JUnitReportBuilder_1.JUnitReportBuilder; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/builders/index.ts"],"names":[],"mappings":";;;AAAA,uEAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AACjC,2DAA0D;AAAjD,wHAAA,kBAAkB,OAAA"}
@@ -0,0 +1,2 @@
1
+ import './api/register';
2
+ export { GitLabReporter } from './GitLabReporter';
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GitLabReporter = void 0;
4
+ require("./api/register");
5
+ var GitLabReporter_1 = require("./GitLabReporter");
6
+ Object.defineProperty(exports, "GitLabReporter", { enumerable: true, get: function () { return GitLabReporter_1.GitLabReporter; } });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/reporter/src/reporters/gitlab/index.ts"],"names":[],"mappings":";;;AAAA,0BAAwB;AACxB,mDAAkD;AAAzC,gHAAA,cAAc,OAAA"}
@@ -0,0 +1,16 @@
1
+ export interface CodeQualityIssue {
2
+ description: string;
3
+ check_name: string;
4
+ raw_details: string;
5
+ fingerprint: string;
6
+ severity: CodeQualitySeverity;
7
+ location: {
8
+ path: string;
9
+ lines: {
10
+ begin: number;
11
+ end?: number;
12
+ };
13
+ };
14
+ }
15
+ export type CodeQualityReport = CodeQualityIssue[];
16
+ export type CodeQualitySeverity = 'info' | 'minor' | 'major' | 'critical' | 'blocker';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=CodeQualityReport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeQualityReport.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/types/CodeQualityReport.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ export interface JUnitTestCase {
2
+ classname: string;
3
+ name: string;
4
+ file?: string;
5
+ time?: number;
6
+ failure?: string;
7
+ error?: string;
8
+ skipped?: string;
9
+ systemOut?: string;
10
+ systemErr?: string;
11
+ }
12
+ export interface JUnitTestSuite {
13
+ name: string;
14
+ tests: number;
15
+ failures?: number;
16
+ errors?: number;
17
+ skipped?: number;
18
+ time?: number;
19
+ testCases: JUnitTestCase[];
20
+ }
21
+ export interface JUnitTestSuites {
22
+ testSuites: JUnitTestSuite[];
23
+ }
24
+ export type TestReport = JUnitTestSuites;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=TestReport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestReport.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/types/TestReport.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { GitLabConfig, GitLabReportFormat } from '../api/GitLabConfig';
2
+ export { CodeQualityReport, CodeQualityIssue, CodeQualitySeverity } from './CodeQualityReport';
3
+ export { TestReport, JUnitTestSuites, JUnitTestSuite, JUnitTestCase } from './TestReport';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import type { TestReport } from '../types';
2
+ export declare function buildJUnitXML(report: TestReport): string;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildJUnitXML = buildJUnitXML;
4
+ const fast_xml_parser_1 = require("fast-xml-parser");
5
+ const xmlBuilder = new fast_xml_parser_1.XMLBuilder({
6
+ ignoreAttributes: false,
7
+ format: true,
8
+ indentBy: ' ',
9
+ attributeNamePrefix: '@_',
10
+ textNodeName: '#text',
11
+ suppressEmptyNode: true,
12
+ suppressUnpairedNode: false
13
+ });
14
+ function buildJUnitXML(report) {
15
+ const xmlObject = {
16
+ '?xml': {
17
+ '@_version': '1.0',
18
+ '@_encoding': 'UTF-8'
19
+ },
20
+ 'testsuites': {
21
+ testsuite: report.testSuites.map(suite => buildTestSuiteObject(suite))
22
+ }
23
+ };
24
+ return xmlBuilder.build(xmlObject);
25
+ }
26
+ function buildTestSuiteObject(testsuite) {
27
+ const suiteObject = {
28
+ '@_name': testsuite.name,
29
+ '@_tests': testsuite.tests.toString()
30
+ };
31
+ if (testsuite.failures !== undefined) {
32
+ suiteObject['@_failures'] = testsuite.failures.toString();
33
+ }
34
+ if (testsuite.errors !== undefined) {
35
+ suiteObject['@_errors'] = testsuite.errors.toString();
36
+ }
37
+ if (testsuite.skipped !== undefined) {
38
+ suiteObject['@_skipped'] = testsuite.skipped.toString();
39
+ }
40
+ if (testsuite.time !== undefined) {
41
+ suiteObject['@_time'] = testsuite.time.toString();
42
+ }
43
+ if (testsuite.testCases.length > 0) {
44
+ suiteObject.testcase = testsuite.testCases.map(testcase => buildTestCaseObject(testcase));
45
+ }
46
+ return suiteObject;
47
+ }
48
+ function addBasicTestCaseProperties(caseObject, testcase) {
49
+ if (testcase.file) {
50
+ caseObject['@_file'] = testcase.file;
51
+ }
52
+ if (testcase.time !== undefined) {
53
+ caseObject['@_time'] = testcase.time.toString();
54
+ }
55
+ }
56
+ function addTestCaseResults(caseObject, testcase) {
57
+ if (testcase.failure) {
58
+ caseObject.failure = {
59
+ '#text': testcase.failure
60
+ };
61
+ }
62
+ if (testcase.error) {
63
+ caseObject.error = {
64
+ '#text': testcase.error
65
+ };
66
+ }
67
+ if (testcase.skipped) {
68
+ caseObject.skipped = {
69
+ '#text': testcase.skipped
70
+ };
71
+ }
72
+ }
73
+ function addTestCaseOutputs(caseObject, testcase) {
74
+ if (testcase.systemOut) {
75
+ caseObject['system-out'] = { '#text': testcase.systemOut };
76
+ }
77
+ if (testcase.systemErr) {
78
+ caseObject['system-err'] = { '#text': testcase.systemErr };
79
+ }
80
+ }
81
+ function buildTestCaseObject(testcase) {
82
+ const caseObject = {
83
+ '@_classname': testcase.classname,
84
+ '@_name': testcase.name
85
+ };
86
+ addBasicTestCaseProperties(caseObject, testcase);
87
+ addTestCaseResults(caseObject, testcase);
88
+ addTestCaseOutputs(caseObject, testcase);
89
+ return caseObject;
90
+ }
91
+ //# sourceMappingURL=build-junit-xml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-junit-xml.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/utils/build-junit-xml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { buildJUnitXML } from './build-junit-xml';
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildJUnitXML = void 0;
4
+ var build_junit_xml_1 = require("./build-junit-xml");
5
+ Object.defineProperty(exports, "buildJUnitXML", { enumerable: true, get: function () { return build_junit_xml_1.buildJUnitXML; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/utils/index.ts"],"names":[],"mappings":";;;AAAA,qDAAkD;AAAzC,gHAAA,aAAa,OAAA"}
@@ -1,2 +1,3 @@
1
1
  export * from './github';
2
+ export * from './gitlab';
2
3
  export * from './std';
@@ -2,5 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./github"), exports);
5
+ tslib_1.__exportStar(require("./gitlab"), exports);
5
6
  tslib_1.__exportStar(require("./std"), exports);
6
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/reporter/src/reporters/index.ts"],"names":[],"mappings":";;;AAAA,mDAAyB;AACzB,gDAAsB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/reporter/src/reporters/index.ts"],"names":[],"mappings":";;;AAAA,mDAAyB;AACzB,mDAAyB;AACzB,gDAAsB"}
@@ -0,0 +1,4 @@
1
+ import { TestFilePathResolver } from './TestFilePathResolver';
2
+ export declare class JestTestFilePathResolver implements TestFilePathResolver {
3
+ getTestFilePath(): string;
4
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JestTestFilePathResolver = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const tsyringe_1 = require("tsyringe");
6
+ const node_path_1 = require("node:path");
7
+ let JestTestFilePathResolver = class JestTestFilePathResolver {
8
+ getTestFilePath() {
9
+ var _a, _b;
10
+ // Check if running in Jest environment
11
+ const jestState = (_b = (_a = global.expect) === null || _a === void 0 ? void 0 : _a.getState) === null || _b === void 0 ? void 0 : _b.call(_a);
12
+ if (jestState) {
13
+ const testPath = jestState.testPath;
14
+ const rootDir = jestState.snapshotState._rootDir;
15
+ return (0, node_path_1.join)((0, node_path_1.basename)(rootDir), (0, node_path_1.relative)(rootDir, testPath));
16
+ }
17
+ // Relies on `TestContext` from Node.js built-in test runner appearing in the stack
18
+ const matchRes = String(new Error().stack).match(/\n\s+at (?:async )?TestContext.* \((.*):\d+:\d+\)\n/);
19
+ return (matchRes === null || matchRes === void 0 ? void 0 : matchRes[1])
20
+ ? (0, node_path_1.relative)(process.cwd(), matchRes[1] || '')
21
+ : 'unknown';
22
+ }
23
+ };
24
+ exports.JestTestFilePathResolver = JestTestFilePathResolver;
25
+ exports.JestTestFilePathResolver = JestTestFilePathResolver = tslib_1.__decorate([
26
+ (0, tsyringe_1.injectable)()
27
+ ], JestTestFilePathResolver);
28
+ //# sourceMappingURL=JestTestFilePathResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JestTestFilePathResolver.js","sourceRoot":"","sources":["../../../../../packages/reporter/src/utils/JestTestFilePathResolver.ts"],"names":[],"mappings":";;;;AACA,uCAAsC;AACtC,yCAAqD;AAG9C,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IAC5B,eAAe;;QACpB,uCAAuC;QACvC,MAAM,SAAS,GAAG,MAAA,MAAC,MAAc,CAAC,MAAM,0CAAE,QAAQ,kDAAI,CAAC;QACvD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;YACpC,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC;YAEjD,OAAO,IAAA,gBAAI,EAAC,IAAA,oBAAQ,EAAC,OAAO,CAAC,EAAE,IAAA,oBAAQ,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC9D,CAAC;QAED,mFAAmF;QACnF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,CAC9C,qDAAqD,CACtD,CAAC;QAEF,OAAO,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,CAAC,CAAC;YAClB,CAAC,CAAC,IAAA,oBAAQ,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5C,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;CACF,CAAA;AApBY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,qBAAU,GAAE;GACA,wBAAwB,CAoBpC"}
@@ -0,0 +1,4 @@
1
+ export interface TestFilePathResolver {
2
+ getTestFilePath(): string;
3
+ }
4
+ export declare const TEST_FILE_PATH_RESOLVER: unique symbol;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TEST_FILE_PATH_RESOLVER = void 0;
4
+ exports.TEST_FILE_PATH_RESOLVER = Symbol('TEST_FILE_PATH_RESOLVER');
5
+ //# sourceMappingURL=TestFilePathResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestFilePathResolver.js","sourceRoot":"","sources":["../../../../../packages/reporter/src/utils/TestFilePathResolver.ts"],"names":[],"mappings":";;;AAIa,QAAA,uBAAuB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC"}
@@ -1 +1,4 @@
1
+ import './register';
1
2
  export { IssuesGrouper } from './issues-grouper';
3
+ export { TEST_FILE_PATH_RESOLVER, TestFilePathResolver } from './TestFilePathResolver';
4
+ export { JestTestFilePathResolver } from './JestTestFilePathResolver';
@@ -1,6 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.IssuesGrouper = void 0;
3
+ exports.JestTestFilePathResolver = exports.TEST_FILE_PATH_RESOLVER = exports.IssuesGrouper = void 0;
4
+ require("./register");
4
5
  var issues_grouper_1 = require("./issues-grouper");
5
6
  Object.defineProperty(exports, "IssuesGrouper", { enumerable: true, get: function () { return issues_grouper_1.IssuesGrouper; } });
7
+ var TestFilePathResolver_1 = require("./TestFilePathResolver");
8
+ Object.defineProperty(exports, "TEST_FILE_PATH_RESOLVER", { enumerable: true, get: function () { return TestFilePathResolver_1.TEST_FILE_PATH_RESOLVER; } });
9
+ var JestTestFilePathResolver_1 = require("./JestTestFilePathResolver");
10
+ Object.defineProperty(exports, "JestTestFilePathResolver", { enumerable: true, get: function () { return JestTestFilePathResolver_1.JestTestFilePathResolver; } });
6
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/reporter/src/utils/index.ts"],"names":[],"mappings":";;;AAAA,mDAAiD;AAAxC,+GAAA,aAAa,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/reporter/src/utils/index.ts"],"names":[],"mappings":";;;AAAA,sBAAoB;AACpB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AACtB,+DAGgC;AAF9B,+HAAA,uBAAuB,OAAA;AAGzB,uEAAsE;AAA7D,oIAAA,wBAAwB,OAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const TestFilePathResolver_1 = require("./TestFilePathResolver");
4
+ const JestTestFilePathResolver_1 = require("./JestTestFilePathResolver");
5
+ const tsyringe_1 = require("tsyringe");
6
+ tsyringe_1.container.registerSingleton(TestFilePathResolver_1.TEST_FILE_PATH_RESOLVER, JestTestFilePathResolver_1.JestTestFilePathResolver);
7
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../../../../packages/reporter/src/utils/register.ts"],"names":[],"mappings":";;AAAA,iEAAiE;AACjE,yEAAsE;AACtE,uCAAqC;AAErC,oBAAS,CAAC,iBAAiB,CAAC,8CAAuB,EAAE,mDAAwB,CAAC,CAAC"}