@sectester/reporter 0.46.0 → 0.48.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 (40) hide show
  1. package/package.json +5 -4
  2. package/src/__fixtures__/junit-reports.d.ts +14 -0
  3. package/src/__fixtures__/junit-reports.js +71 -0
  4. package/src/__fixtures__/junit-reports.js.map +1 -0
  5. package/src/index.d.ts +1 -1
  6. package/src/index.js +2 -2
  7. package/src/index.js.map +1 -1
  8. package/src/reporters/gitlab/{GitLabCodeQualityReporter.d.ts → GitLabReporter.d.ts} +6 -3
  9. package/src/reporters/gitlab/GitLabReporter.js +62 -0
  10. package/src/reporters/gitlab/GitLabReporter.js.map +1 -0
  11. package/src/reporters/gitlab/api/GitLabCIArtifacts.d.ts +2 -1
  12. package/src/reporters/gitlab/api/GitLabCIArtifacts.js.map +1 -1
  13. package/src/reporters/gitlab/api/GitLabCodeQualityFileWriter.d.ts +3 -1
  14. package/src/reporters/gitlab/api/GitLabCodeQualityFileWriter.js +20 -0
  15. package/src/reporters/gitlab/api/GitLabCodeQualityFileWriter.js.map +1 -1
  16. package/src/reporters/gitlab/api/GitLabConfig.d.ts +3 -0
  17. package/src/reporters/gitlab/api/GitLabConfig.js.map +1 -1
  18. package/src/reporters/gitlab/api/register.js +3 -1
  19. package/src/reporters/gitlab/api/register.js.map +1 -1
  20. package/src/reporters/gitlab/builders/JUnitReportBuilder.d.ts +10 -0
  21. package/src/reporters/gitlab/builders/JUnitReportBuilder.js +43 -0
  22. package/src/reporters/gitlab/builders/JUnitReportBuilder.js.map +1 -0
  23. package/src/reporters/gitlab/builders/index.d.ts +1 -0
  24. package/src/reporters/gitlab/builders/index.js +3 -1
  25. package/src/reporters/gitlab/builders/index.js.map +1 -1
  26. package/src/reporters/gitlab/index.d.ts +1 -1
  27. package/src/reporters/gitlab/index.js +3 -3
  28. package/src/reporters/gitlab/index.js.map +1 -1
  29. package/src/reporters/gitlab/types/TestReport.d.ts +24 -0
  30. package/src/reporters/gitlab/types/TestReport.js +3 -0
  31. package/src/reporters/gitlab/types/TestReport.js.map +1 -0
  32. package/src/reporters/gitlab/types/index.d.ts +2 -1
  33. package/src/reporters/gitlab/utils/build-junit-xml.d.ts +2 -0
  34. package/src/reporters/gitlab/utils/build-junit-xml.js +91 -0
  35. package/src/reporters/gitlab/utils/build-junit-xml.js.map +1 -0
  36. package/src/reporters/gitlab/utils/index.d.ts +1 -0
  37. package/src/reporters/gitlab/utils/index.js +6 -0
  38. package/src/reporters/gitlab/utils/index.js.map +1 -0
  39. package/src/reporters/gitlab/GitLabCodeQualityReporter.js +0 -36
  40. package/src/reporters/gitlab/GitLabCodeQualityReporter.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sectester/reporter",
3
- "version": "0.46.0",
3
+ "version": "0.48.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"
@@ -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, GitLabCodeQualityReporter, 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.GitLabCodeQualityReporter = 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,6 +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, "GitLabCodeQualityReporter", { enumerable: true, get: function () { return reporters_1.GitLabCodeQualityReporter; } });
11
+ Object.defineProperty(exports, "GitLabReporter", { enumerable: true, get: function () { return reporters_1.GitLabReporter; } });
12
12
  Object.defineProperty(exports, "StdReporter", { enumerable: true, get: function () { return reporters_1.StdReporter; } });
13
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,yCAIqB;AAHnB,mHAAA,sBAAsB,OAAA;AACtB,sHAAA,yBAAyB,OAAA;AACzB,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,15 @@
1
1
  import { Reporter } from '../../lib';
2
- import type { GitLabCIArtifacts } from './api';
2
+ import type { GitLabCIArtifacts, GitLabConfig } from './api';
3
3
  import { TestFilePathResolver } from '../../utils';
4
4
  import type { Scan } from '@sectester/scan';
5
- export declare class GitLabCodeQualityReporter implements Reporter {
5
+ export declare class GitLabReporter implements Reporter {
6
6
  private readonly gitlabCIArtifacts;
7
+ private readonly config;
7
8
  private readonly testFilePathResolver;
8
- constructor(gitlabCIArtifacts: GitLabCIArtifacts, testFilePathResolver: TestFilePathResolver);
9
+ constructor(gitlabCIArtifacts: GitLabCIArtifacts, config: GitLabConfig, testFilePathResolver: TestFilePathResolver);
9
10
  report(scan: Scan): Promise<void>;
10
11
  private generateCodeQualityReport;
12
+ private generateTestReport;
11
13
  private createCodeQualityReportBuilder;
14
+ private createJUnitReportBuilder;
12
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"}
@@ -1,5 +1,6 @@
1
- import type { CodeQualityReport } from '../types';
1
+ import type { CodeQualityReport, TestReport } from '../types';
2
2
  export interface GitLabCIArtifacts {
3
3
  writeCodeQualityReport(report: CodeQualityReport): Promise<void>;
4
+ writeTestReport(report: TestReport): Promise<void>;
4
5
  }
5
6
  export declare const GITLAB_CI_ARTIFACTS: unique symbol;
@@ -1 +1 @@
1
- {"version":3,"file":"GitLabCIArtifacts.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/api/GitLabCIArtifacts.ts"],"names":[],"mappings":";;;AAMa,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC"}
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"}
@@ -1,8 +1,10 @@
1
- import type { CodeQualityReport } from '../types';
1
+ import type { CodeQualityReport, TestReport } from '../types';
2
2
  import type { GitLabCIArtifacts } from './GitLabCIArtifacts';
3
3
  import type { GitLabConfig } from './GitLabConfig';
4
4
  export declare class GitLabCIArtifactsFileWriter implements GitLabCIArtifacts {
5
5
  private readonly config;
6
6
  constructor(config: GitLabConfig);
7
7
  writeCodeQualityReport(report: CodeQualityReport): Promise<void>;
8
+ writeTestReport(report: TestReport): Promise<void>;
9
+ private generateUniqueFileName;
8
10
  }
@@ -3,8 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.GitLabCIArtifactsFileWriter = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const GitLabConfig_1 = require("./GitLabConfig");
6
+ const utils_1 = require("../utils");
6
7
  const tsyringe_1 = require("tsyringe");
7
8
  const promises_1 = require("node:fs/promises");
9
+ const node_crypto_1 = require("node:crypto");
10
+ const node_path_1 = require("node:path");
8
11
  let GitLabCIArtifactsFileWriter = class GitLabCIArtifactsFileWriter {
9
12
  constructor(config) {
10
13
  this.config = config;
@@ -19,6 +22,23 @@ let GitLabCIArtifactsFileWriter = class GitLabCIArtifactsFileWriter {
19
22
  const filename = this.config.codeQualityReportFilename;
20
23
  await (0, promises_1.writeFile)(filename, reportJson, 'utf-8');
21
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
+ }
22
42
  };
23
43
  exports.GitLabCIArtifactsFileWriter = GitLabCIArtifactsFileWriter;
24
44
  exports.GitLabCIArtifactsFileWriter = GitLabCIArtifactsFileWriter = tslib_1.__decorate([
@@ -1 +1 @@
1
- {"version":3,"file":"GitLabCodeQualityFileWriter.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/api/GitLabCodeQualityFileWriter.ts"],"names":[],"mappings":";;;;AAGA,iDAA+C;AAC/C,uCAA8C;AAC9C,+CAA6C;AAGtC,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;CACF,CAAA;AAfY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,qBAAU,GAAE;IAEE,mBAAA,IAAA,iBAAM,EAAC,4BAAa,CAAC,CAAA;;GADvB,2BAA2B,CAevC"}
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"}
@@ -1,4 +1,7 @@
1
+ export type GitLabReportFormat = 'code-quality' | 'test' | 'both';
1
2
  export interface GitLabConfig {
2
3
  codeQualityReportFilename: string;
4
+ testReportFilename: string;
5
+ reportFormat?: GitLabReportFormat;
3
6
  }
4
7
  export declare const GITLAB_CONFIG: unique symbol;
@@ -1 +1 @@
1
- {"version":3,"file":"GitLabConfig.js","sourceRoot":"","sources":["../../../../../../../packages/reporter/src/reporters/gitlab/api/GitLabConfig.ts"],"names":[],"mappings":";;;AAIa,QAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC"}
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"}
@@ -8,7 +8,9 @@ const tsyringe_1 = require("tsyringe");
8
8
  tsyringe_1.container.register(GitLabConfig_1.GITLAB_CONFIG, {
9
9
  useValue: {
10
10
  codeQualityReportFilename: process.env.GITLAB_CODE_QUALITY_REPORT_FILENAME ||
11
- 'gl-code-quality-report.json'
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'
12
14
  }
13
15
  });
14
16
  tsyringe_1.container.register(GitLabCIArtifacts_1.GITLAB_CI_ARTIFACTS, {
@@ -1 +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;KAChC;CACF,CAAC,CAAC;AAEH,oBAAS,CAAC,QAAQ,CAAC,uCAAmB,EAAE;IACtC,QAAQ,EAAE,yDAA2B;CACtC,CAAC,CAAC"}
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,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"}
@@ -1 +1,2 @@
1
1
  export { CodeQualityReportBuilder } from './CodeQualityReportBuilder';
2
+ export { JUnitReportBuilder } from './JUnitReportBuilder';
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CodeQualityReportBuilder = void 0;
3
+ exports.JUnitReportBuilder = exports.CodeQualityReportBuilder = void 0;
4
4
  var CodeQualityReportBuilder_1 = require("./CodeQualityReportBuilder");
5
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; } });
6
8
  //# sourceMappingURL=index.js.map
@@ -1 +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"}
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"}
@@ -1,2 +1,2 @@
1
1
  import './api/register';
2
- export { GitLabCodeQualityReporter } from './GitLabCodeQualityReporter';
2
+ export { GitLabReporter } from './GitLabReporter';
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GitLabCodeQualityReporter = void 0;
3
+ exports.GitLabReporter = void 0;
4
4
  require("./api/register");
5
- var GitLabCodeQualityReporter_1 = require("./GitLabCodeQualityReporter");
6
- Object.defineProperty(exports, "GitLabCodeQualityReporter", { enumerable: true, get: function () { return GitLabCodeQualityReporter_1.GitLabCodeQualityReporter; } });
5
+ var GitLabReporter_1 = require("./GitLabReporter");
6
+ Object.defineProperty(exports, "GitLabReporter", { enumerable: true, get: function () { return GitLabReporter_1.GitLabReporter; } });
7
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/reporter/src/reporters/gitlab/index.ts"],"names":[],"mappings":";;;AAAA,0BAAwB;AACxB,yEAAwE;AAA/D,sIAAA,yBAAyB,OAAA"}
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,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":""}
@@ -1,2 +1,3 @@
1
- export { GitLabConfig } from '../api/GitLabConfig';
1
+ export { GitLabConfig, GitLabReportFormat } from '../api/GitLabConfig';
2
2
  export { CodeQualityReport, CodeQualityIssue, CodeQualitySeverity } from './CodeQualityReport';
3
+ export { TestReport, JUnitTestSuites, JUnitTestSuite, JUnitTestCase } from './TestReport';
@@ -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,36 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GitLabCodeQualityReporter = 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 GitLabCodeQualityReporter = class GitLabCodeQualityReporter {
10
- constructor(gitlabCIArtifacts, testFilePathResolver) {
11
- this.gitlabCIArtifacts = gitlabCIArtifacts;
12
- this.testFilePathResolver = testFilePathResolver;
13
- }
14
- async report(scan) {
15
- const issues = await scan.issues();
16
- if (issues.length > 0) {
17
- await this.generateCodeQualityReport(issues);
18
- }
19
- }
20
- async generateCodeQualityReport(issues) {
21
- const testFilePath = this.testFilePathResolver.getTestFilePath();
22
- const codeQualityReport = this.createCodeQualityReportBuilder(issues, testFilePath).build();
23
- await this.gitlabCIArtifacts.writeCodeQualityReport(codeQualityReport);
24
- }
25
- createCodeQualityReportBuilder(issues, testFilePath) {
26
- return new builders_1.CodeQualityReportBuilder(issues, testFilePath);
27
- }
28
- };
29
- exports.GitLabCodeQualityReporter = GitLabCodeQualityReporter;
30
- exports.GitLabCodeQualityReporter = GitLabCodeQualityReporter = tslib_1.__decorate([
31
- (0, tsyringe_1.injectable)(),
32
- tslib_1.__param(0, (0, tsyringe_1.inject)(api_1.GITLAB_CI_ARTIFACTS)),
33
- tslib_1.__param(1, (0, tsyringe_1.inject)(utils_1.TEST_FILE_PATH_RESOLVER)),
34
- tslib_1.__metadata("design:paramtypes", [Object, Object])
35
- ], GitLabCodeQualityReporter);
36
- //# sourceMappingURL=GitLabCodeQualityReporter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"GitLabCodeQualityReporter.js","sourceRoot":"","sources":["../../../../../../packages/reporter/src/reporters/gitlab/GitLabCodeQualityReporter.ts"],"names":[],"mappings":";;;;AACA,+BAA4C;AAE5C,yCAAsD;AACtD,uCAA4E;AAC5E,uCAA8C;AAIvC,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IACpC,YAEmB,iBAAoC,EAEpC,oBAA0C;QAF1C,sBAAiB,GAAjB,iBAAiB,CAAmB;QAEpC,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,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QAC/C,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,8BAA8B,CACpC,MAAe,EACf,YAAoB;QAEpB,OAAO,IAAI,mCAAwB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC5D,CAAC;CACF,CAAA;AA/BY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,qBAAU,GAAE;IAGR,mBAAA,IAAA,iBAAM,EAAC,yBAAmB,CAAC,CAAA;IAE3B,mBAAA,IAAA,iBAAM,EAAC,+BAAuB,CAAC,CAAA;;GAJvB,yBAAyB,CA+BrC"}