@vyuhlabs/dxkit 1.5.1 → 1.6.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.
- package/CHANGELOG.md +264 -0
- package/README.md +265 -352
- package/THIRD_PARTY_NOTICES.md +40 -0
- package/dist/analyzers/developer/detailed.d.ts +26 -0
- package/dist/analyzers/developer/detailed.d.ts.map +1 -0
- package/dist/analyzers/developer/detailed.js +193 -0
- package/dist/analyzers/developer/detailed.js.map +1 -0
- package/dist/analyzers/developer/gather.d.ts +11 -0
- package/dist/analyzers/developer/gather.d.ts.map +1 -0
- package/dist/analyzers/developer/gather.js +167 -0
- package/dist/analyzers/developer/gather.js.map +1 -0
- package/dist/analyzers/developer/index.d.ts +8 -0
- package/dist/analyzers/developer/index.d.ts.map +1 -0
- package/dist/analyzers/developer/index.js +168 -0
- package/dist/analyzers/developer/index.js.map +1 -0
- package/dist/analyzers/developer/types.d.ts +49 -0
- package/dist/analyzers/developer/types.d.ts.map +1 -0
- package/dist/analyzers/developer/types.js +6 -0
- package/dist/analyzers/developer/types.js.map +1 -0
- package/dist/analyzers/docs/shallow.d.ts +9 -0
- package/dist/analyzers/docs/shallow.d.ts.map +1 -0
- package/dist/analyzers/docs/shallow.js +8 -0
- package/dist/analyzers/docs/shallow.js.map +1 -0
- package/dist/analyzers/dx/shallow.d.ts +9 -0
- package/dist/analyzers/dx/shallow.d.ts.map +1 -0
- package/dist/analyzers/dx/shallow.js +8 -0
- package/dist/analyzers/dx/shallow.js.map +1 -0
- package/dist/analyzers/evidence.d.ts +36 -0
- package/dist/analyzers/evidence.d.ts.map +1 -0
- package/dist/analyzers/evidence.js +3 -0
- package/dist/analyzers/evidence.js.map +1 -0
- package/dist/analyzers/health/actions.d.ts +10 -0
- package/dist/analyzers/health/actions.d.ts.map +1 -0
- package/dist/analyzers/health/actions.js +284 -0
- package/dist/analyzers/health/actions.js.map +1 -0
- package/dist/analyzers/health/detailed.d.ts +26 -0
- package/dist/analyzers/health/detailed.d.ts.map +1 -0
- package/dist/analyzers/health/detailed.js +147 -0
- package/dist/analyzers/health/detailed.js.map +1 -0
- package/dist/analyzers/health.d.ts +22 -0
- package/dist/analyzers/health.d.ts.map +1 -0
- package/dist/analyzers/health.js +270 -0
- package/dist/analyzers/health.js.map +1 -0
- package/dist/analyzers/index.d.ts +3 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +6 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/maintainability/shallow.d.ts +9 -0
- package/dist/analyzers/maintainability/shallow.d.ts.map +1 -0
- package/dist/analyzers/maintainability/shallow.js +8 -0
- package/dist/analyzers/maintainability/shallow.js.map +1 -0
- package/dist/analyzers/quality/actions.d.ts +5 -0
- package/dist/analyzers/quality/actions.d.ts.map +1 -0
- package/dist/analyzers/quality/actions.js +158 -0
- package/dist/analyzers/quality/actions.js.map +1 -0
- package/dist/analyzers/quality/detailed.d.ts +17 -0
- package/dist/analyzers/quality/detailed.d.ts.map +1 -0
- package/dist/analyzers/quality/detailed.js +122 -0
- package/dist/analyzers/quality/detailed.js.map +1 -0
- package/dist/analyzers/quality/gather.d.ts +38 -0
- package/dist/analyzers/quality/gather.d.ts.map +1 -0
- package/dist/analyzers/quality/gather.js +279 -0
- package/dist/analyzers/quality/gather.js.map +1 -0
- package/dist/analyzers/quality/index.d.ts +12 -0
- package/dist/analyzers/quality/index.d.ts.map +1 -0
- package/dist/analyzers/quality/index.js +281 -0
- package/dist/analyzers/quality/index.js.map +1 -0
- package/dist/analyzers/quality/shallow.d.ts +9 -0
- package/dist/analyzers/quality/shallow.d.ts.map +1 -0
- package/dist/analyzers/quality/shallow.js +8 -0
- package/dist/analyzers/quality/shallow.js.map +1 -0
- package/dist/analyzers/quality/types.d.ts +66 -0
- package/dist/analyzers/quality/types.d.ts.map +1 -0
- package/dist/analyzers/quality/types.js +3 -0
- package/dist/analyzers/quality/types.js.map +1 -0
- package/dist/analyzers/remediation.d.ts +42 -0
- package/dist/analyzers/remediation.d.ts.map +1 -0
- package/dist/analyzers/remediation.js +28 -0
- package/dist/analyzers/remediation.js.map +1 -0
- package/dist/analyzers/scoring.d.ts +32 -0
- package/dist/analyzers/scoring.d.ts.map +1 -0
- package/dist/analyzers/scoring.js +410 -0
- package/dist/analyzers/scoring.js.map +1 -0
- package/dist/analyzers/security/actions.d.ts +7 -0
- package/dist/analyzers/security/actions.d.ts.map +1 -0
- package/dist/analyzers/security/actions.js +104 -0
- package/dist/analyzers/security/actions.js.map +1 -0
- package/dist/analyzers/security/detailed.d.ts +14 -0
- package/dist/analyzers/security/detailed.d.ts.map +1 -0
- package/dist/analyzers/security/detailed.js +124 -0
- package/dist/analyzers/security/detailed.js.map +1 -0
- package/dist/analyzers/security/gather.d.ts +12 -0
- package/dist/analyzers/security/gather.d.ts.map +1 -0
- package/dist/analyzers/security/gather.js +195 -0
- package/dist/analyzers/security/gather.js.map +1 -0
- package/dist/analyzers/security/index.d.ts +8 -0
- package/dist/analyzers/security/index.d.ts.map +1 -0
- package/dist/analyzers/security/index.js +173 -0
- package/dist/analyzers/security/index.js.map +1 -0
- package/dist/analyzers/security/scoring.d.ts +29 -0
- package/dist/analyzers/security/scoring.d.ts.map +1 -0
- package/dist/analyzers/security/scoring.js +40 -0
- package/dist/analyzers/security/scoring.js.map +1 -0
- package/dist/analyzers/security/shallow.d.ts +10 -0
- package/dist/analyzers/security/shallow.d.ts.map +1 -0
- package/dist/analyzers/security/shallow.js +8 -0
- package/dist/analyzers/security/shallow.js.map +1 -0
- package/dist/analyzers/security/types.d.ts +43 -0
- package/dist/analyzers/security/types.d.ts.map +1 -0
- package/dist/analyzers/security/types.js +6 -0
- package/dist/analyzers/security/types.js.map +1 -0
- package/dist/analyzers/tests/actions.d.ts +6 -0
- package/dist/analyzers/tests/actions.d.ts.map +1 -0
- package/dist/analyzers/tests/actions.js +80 -0
- package/dist/analyzers/tests/actions.js.map +1 -0
- package/dist/analyzers/tests/detailed.d.ts +14 -0
- package/dist/analyzers/tests/detailed.d.ts.map +1 -0
- package/dist/analyzers/tests/detailed.js +121 -0
- package/dist/analyzers/tests/detailed.js.map +1 -0
- package/dist/analyzers/tests/gather.d.ts +5 -0
- package/dist/analyzers/tests/gather.d.ts.map +1 -0
- package/dist/analyzers/tests/gather.js +270 -0
- package/dist/analyzers/tests/gather.js.map +1 -0
- package/dist/analyzers/tests/import-graph.d.ts +48 -0
- package/dist/analyzers/tests/import-graph.d.ts.map +1 -0
- package/dist/analyzers/tests/import-graph.js +231 -0
- package/dist/analyzers/tests/import-graph.js.map +1 -0
- package/dist/analyzers/tests/index.d.ts +8 -0
- package/dist/analyzers/tests/index.d.ts.map +1 -0
- package/dist/analyzers/tests/index.js +247 -0
- package/dist/analyzers/tests/index.js.map +1 -0
- package/dist/analyzers/tests/scoring.d.ts +27 -0
- package/dist/analyzers/tests/scoring.d.ts.map +1 -0
- package/dist/analyzers/tests/scoring.js +38 -0
- package/dist/analyzers/tests/scoring.js.map +1 -0
- package/dist/analyzers/tests/shallow.d.ts +9 -0
- package/dist/analyzers/tests/shallow.d.ts.map +1 -0
- package/dist/analyzers/tests/shallow.js +8 -0
- package/dist/analyzers/tests/shallow.js.map +1 -0
- package/dist/analyzers/tests/types.d.ts +49 -0
- package/dist/analyzers/tests/types.d.ts.map +1 -0
- package/dist/analyzers/tests/types.js +6 -0
- package/dist/analyzers/tests/types.js.map +1 -0
- package/dist/analyzers/tools/cloc.d.ts +8 -0
- package/dist/analyzers/tools/cloc.d.ts.map +1 -0
- package/dist/analyzers/tools/cloc.js +49 -0
- package/dist/analyzers/tools/cloc.js.map +1 -0
- package/dist/analyzers/tools/coverage.d.ts +59 -0
- package/dist/analyzers/tools/coverage.d.ts.map +1 -0
- package/dist/analyzers/tools/coverage.js +280 -0
- package/dist/analyzers/tools/coverage.js.map +1 -0
- package/dist/analyzers/tools/cvss-v4-lookup.d.ts +10 -0
- package/dist/analyzers/tools/cvss-v4-lookup.d.ts.map +1 -0
- package/dist/analyzers/tools/cvss-v4-lookup.js +284 -0
- package/dist/analyzers/tools/cvss-v4-lookup.js.map +1 -0
- package/dist/analyzers/tools/cvss-v4.d.ts +24 -0
- package/dist/analyzers/tools/cvss-v4.d.ts.map +1 -0
- package/dist/analyzers/tools/cvss-v4.js +362 -0
- package/dist/analyzers/tools/cvss-v4.js.map +1 -0
- package/dist/analyzers/tools/default-exclusions.gitignore +56 -0
- package/dist/analyzers/tools/exclusions.d.ts +70 -0
- package/dist/analyzers/tools/exclusions.d.ts.map +1 -0
- package/dist/analyzers/tools/exclusions.js +250 -0
- package/dist/analyzers/tools/exclusions.js.map +1 -0
- package/dist/analyzers/tools/generic.d.ts +4 -0
- package/dist/analyzers/tools/generic.d.ts.map +1 -0
- package/dist/analyzers/tools/generic.js +198 -0
- package/dist/analyzers/tools/generic.js.map +1 -0
- package/dist/analyzers/tools/gitleaks.d.ts +8 -0
- package/dist/analyzers/tools/gitleaks.d.ts.map +1 -0
- package/dist/analyzers/tools/gitleaks.js +58 -0
- package/dist/analyzers/tools/gitleaks.js.map +1 -0
- package/dist/analyzers/tools/graphify.d.ts +4 -0
- package/dist/analyzers/tools/graphify.d.ts.map +1 -0
- package/dist/analyzers/tools/graphify.js +222 -0
- package/dist/analyzers/tools/graphify.js.map +1 -0
- package/dist/analyzers/tools/osv.d.ts +51 -0
- package/dist/analyzers/tools/osv.d.ts.map +1 -0
- package/dist/analyzers/tools/osv.js +188 -0
- package/dist/analyzers/tools/osv.js.map +1 -0
- package/dist/analyzers/tools/parallel.d.ts +8 -0
- package/dist/analyzers/tools/parallel.d.ts.map +1 -0
- package/dist/analyzers/tools/parallel.js +195 -0
- package/dist/analyzers/tools/parallel.js.map +1 -0
- package/dist/analyzers/tools/runner.d.ts +13 -0
- package/dist/analyzers/tools/runner.d.ts.map +1 -0
- package/dist/analyzers/tools/runner.js +109 -0
- package/dist/analyzers/tools/runner.js.map +1 -0
- package/dist/analyzers/tools/suppressions.d.ts +55 -0
- package/dist/analyzers/tools/suppressions.d.ts.map +1 -0
- package/dist/analyzers/tools/suppressions.js +203 -0
- package/dist/analyzers/tools/suppressions.js.map +1 -0
- package/dist/analyzers/tools/timing.d.ts +9 -0
- package/dist/analyzers/tools/timing.d.ts.map +1 -0
- package/dist/analyzers/tools/timing.js +29 -0
- package/dist/analyzers/tools/timing.js.map +1 -0
- package/dist/analyzers/tools/tool-registry.d.ts +86 -0
- package/dist/analyzers/tools/tool-registry.d.ts.map +1 -0
- package/dist/analyzers/tools/tool-registry.js +705 -0
- package/dist/analyzers/tools/tool-registry.js.map +1 -0
- package/dist/analyzers/types.d.ts +125 -0
- package/dist/analyzers/types.d.ts.map +1 -0
- package/dist/analyzers/types.js +11 -0
- package/dist/analyzers/types.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +405 -0
- package/dist/cli.js.map +1 -1
- package/dist/detect.d.ts.map +1 -1
- package/dist/detect.js +24 -15
- package/dist/detect.js.map +1 -1
- package/dist/languages/csharp.d.ts +5 -0
- package/dist/languages/csharp.d.ts.map +1 -0
- package/dist/languages/csharp.js +265 -0
- package/dist/languages/csharp.js.map +1 -0
- package/dist/languages/go.d.ts +11 -0
- package/dist/languages/go.d.ts.map +1 -0
- package/dist/languages/go.js +321 -0
- package/dist/languages/go.js.map +1 -0
- package/dist/languages/index.d.ts +6 -0
- package/dist/languages/index.d.ts.map +1 -0
- package/dist/languages/index.js +18 -0
- package/dist/languages/index.js.map +1 -0
- package/dist/languages/python.d.ts +3 -0
- package/dist/languages/python.d.ts.map +1 -0
- package/dist/languages/python.js +284 -0
- package/dist/languages/python.js.map +1 -0
- package/dist/languages/rust.d.ts +17 -0
- package/dist/languages/rust.d.ts.map +1 -0
- package/dist/languages/rust.js +333 -0
- package/dist/languages/rust.js.map +1 -0
- package/dist/languages/types.d.ts +38 -0
- package/dist/languages/types.d.ts.map +1 -0
- package/dist/languages/types.js +3 -0
- package/dist/languages/types.js.map +1 -0
- package/dist/languages/typescript.d.ts +15 -0
- package/dist/languages/typescript.d.ts.map +1 -0
- package/dist/languages/typescript.js +353 -0
- package/dist/languages/typescript.js.map +1 -0
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +25 -12
- package/dist/logger.js.map +1 -1
- package/dist/project-yaml.d.ts.map +1 -1
- package/dist/project-yaml.js +1 -0
- package/dist/project-yaml.js.map +1 -1
- package/dist/tools-cli.d.ts +2 -0
- package/dist/tools-cli.d.ts.map +1 -0
- package/dist/tools-cli.js +231 -0
- package/dist/tools-cli.js.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -2
- package/templates/.claude/commands/dev-report.md +34 -4
- package/templates/.claude/commands/health.md +45 -2
- package/templates/.claude/commands/quality.md.template +38 -15
- package/templates/.claude/commands/test-gaps.md +36 -2
- package/templates/.claude/commands/vulnerabilities.md +36 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shallow.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tests/shallow.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGzD,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,aAAa,GAAG,cAAc,CAEpE"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scoreTestsDimension = scoreTestsDimension;
|
|
4
|
+
const scoring_1 = require("../scoring");
|
|
5
|
+
function scoreTestsDimension(m) {
|
|
6
|
+
return (0, scoring_1.scoreTest)(m);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=shallow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shallow.js","sourceRoot":"","sources":["../../../src/analyzers/tests/shallow.ts"],"names":[],"mappings":";;AASA,kDAEC;AAJD,wCAAuC;AAEvC,SAAgB,mBAAmB,CAAC,CAAgB;IAClD,OAAO,IAAA,mBAAS,EAAC,CAAC,CAAC,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test gap analyzer types.
|
|
3
|
+
*/
|
|
4
|
+
export type RiskTier = 'critical' | 'high' | 'medium' | 'low';
|
|
5
|
+
export interface TestFile {
|
|
6
|
+
path: string;
|
|
7
|
+
status: 'active' | 'commented-out' | 'empty' | 'schema-only';
|
|
8
|
+
framework: string | null;
|
|
9
|
+
}
|
|
10
|
+
export interface SourceFile {
|
|
11
|
+
path: string;
|
|
12
|
+
lines: number;
|
|
13
|
+
type: 'controller' | 'service' | 'interceptor' | 'model' | 'repository' | 'other';
|
|
14
|
+
risk: RiskTier;
|
|
15
|
+
hasMatchingTest: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** Where the `effectiveCoverage` number came from. */
|
|
18
|
+
export type CoverageSource = 'filename-match' | 'import-graph' | 'istanbul-summary' | 'istanbul-final' | 'coverage-py' | 'go' | 'cobertura' | 'lcov';
|
|
19
|
+
export interface TestGapsReport {
|
|
20
|
+
repo: string;
|
|
21
|
+
analyzedAt: string;
|
|
22
|
+
commitSha: string;
|
|
23
|
+
branch: string;
|
|
24
|
+
summary: {
|
|
25
|
+
testFiles: number;
|
|
26
|
+
activeTestFiles: number;
|
|
27
|
+
commentedOutFiles: number;
|
|
28
|
+
/**
|
|
29
|
+
* Headline coverage 0-100. When `coverageSource` is `filename-match`, this
|
|
30
|
+
* is the share of source files with a name-matched test. Otherwise it's
|
|
31
|
+
* the line-coverage percentage read from the artifact.
|
|
32
|
+
*/
|
|
33
|
+
effectiveCoverage: number;
|
|
34
|
+
/** Which signal produced `effectiveCoverage`. */
|
|
35
|
+
coverageSource: CoverageSource;
|
|
36
|
+
/** Project-relative path of the artifact, when one was used. */
|
|
37
|
+
coverageSourceFile?: string;
|
|
38
|
+
sourceFiles: number;
|
|
39
|
+
untestedCritical: number;
|
|
40
|
+
untestedHigh: number;
|
|
41
|
+
untestedMedium: number;
|
|
42
|
+
untestedLow: number;
|
|
43
|
+
};
|
|
44
|
+
testFiles: TestFile[];
|
|
45
|
+
gaps: SourceFile[];
|
|
46
|
+
toolsUsed: string[];
|
|
47
|
+
toolsUnavailable: string[];
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tests/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE9D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,eAAe,GAAG,OAAO,GAAG,aAAa,CAAC;IAC7D,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,YAAY,GAAG,OAAO,CAAC;IAClF,IAAI,EAAE,QAAQ,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,sDAAsD;AACtD,MAAM,MAAM,cAAc,GACtB,gBAAgB,GAChB,cAAc,GACd,kBAAkB,GAClB,gBAAgB,GAChB,aAAa,GACb,IAAI,GACJ,WAAW,GACX,MAAM,CAAC;AAEX,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,iBAAiB,EAAE,MAAM,CAAC;QAC1B;;;;WAIG;QACH,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iDAAiD;QACjD,cAAc,EAAE,cAAc,CAAC;QAC/B,gEAAgE;QAChE,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/analyzers/tests/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cloc integration -- exact line counts per language.
|
|
3
|
+
* Layer 2 (optional): available via `npx cloc` or system install.
|
|
4
|
+
*/
|
|
5
|
+
import { HealthMetrics } from '../types';
|
|
6
|
+
/** Gather metrics from cloc --json. */
|
|
7
|
+
export declare function gatherClocMetrics(cwd: string): Partial<HealthMetrics>;
|
|
8
|
+
//# sourceMappingURL=cloc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloc.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/cloc.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAYzC,uCAAuC;AACvC,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAkBrE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.gatherClocMetrics = gatherClocMetrics;
|
|
4
|
+
const runner_1 = require("./runner");
|
|
5
|
+
const exclusions_1 = require("./exclusions");
|
|
6
|
+
const SKIP_KEYS = new Set(['header', 'SUM']);
|
|
7
|
+
/** Gather metrics from cloc --json. */
|
|
8
|
+
function gatherClocMetrics(cwd) {
|
|
9
|
+
// --timeout 0 disables per-file timeout (suppresses warning that breaks JSON parse)
|
|
10
|
+
// cloc uses basename matching for --exclude-dir, so use dir names without slashes
|
|
11
|
+
const excludeDirs = (0, exclusions_1.getClocExcludeDirs)(cwd);
|
|
12
|
+
const flags = `--json --timeout 0 --exclude-dir=${excludeDirs}`;
|
|
13
|
+
// Try system cloc first (faster), then npx as fallback
|
|
14
|
+
const result = (0, runner_1.runJSON)(`cloc . ${flags} 2>/dev/null`, cwd, 180000);
|
|
15
|
+
if (!result || !result.SUM) {
|
|
16
|
+
const fallback = (0, runner_1.runJSON)(`npx cloc . ${flags} 2>/dev/null`, cwd, 180000);
|
|
17
|
+
if (!fallback || !fallback.SUM) {
|
|
18
|
+
return { toolsUnavailable: ['cloc'] };
|
|
19
|
+
}
|
|
20
|
+
return parseClocResult(fallback);
|
|
21
|
+
}
|
|
22
|
+
return parseClocResult(result);
|
|
23
|
+
}
|
|
24
|
+
function parseClocResult(result) {
|
|
25
|
+
const clocLanguages = [];
|
|
26
|
+
for (const [key, value] of Object.entries(result)) {
|
|
27
|
+
if (SKIP_KEYS.has(key))
|
|
28
|
+
continue;
|
|
29
|
+
const lang = value;
|
|
30
|
+
if (typeof lang.nFiles !== 'number')
|
|
31
|
+
continue;
|
|
32
|
+
clocLanguages.push({
|
|
33
|
+
language: key,
|
|
34
|
+
files: lang.nFiles,
|
|
35
|
+
code: lang.code,
|
|
36
|
+
comment: lang.comment,
|
|
37
|
+
blank: lang.blank,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
// Sort by code lines descending
|
|
41
|
+
clocLanguages.sort((a, b) => b.code - a.code);
|
|
42
|
+
return {
|
|
43
|
+
sourceFiles: result.SUM.nFiles,
|
|
44
|
+
totalLines: result.SUM.code + result.SUM.comment + result.SUM.blank,
|
|
45
|
+
clocLanguages,
|
|
46
|
+
toolsUsed: ['cloc'],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=cloc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloc.js","sourceRoot":"","sources":["../../../src/analyzers/tools/cloc.ts"],"names":[],"mappings":";;AAiBA,8CAkBC;AA9BD,qCAAmC;AACnC,6CAAkD;AAQlD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;AAE7C,uCAAuC;AACvC,SAAgB,iBAAiB,CAAC,GAAW;IAC3C,oFAAoF;IACpF,kFAAkF;IAClF,MAAM,WAAW,GAAG,IAAA,+BAAkB,EAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,oCAAoC,WAAW,EAAE,CAAC;IAEhE,uDAAuD;IACvD,MAAM,MAAM,GAAG,IAAA,gBAAO,EAAa,UAAU,KAAK,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAE/E,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAA,gBAAO,EAAa,cAAc,KAAK,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACrF,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YAC/B,OAAO,EAAE,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;QACxC,CAAC;QACD,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB;IACzC,MAAM,aAAa,GAAmC,EAAE,CAAC;IAEzD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QACjC,MAAM,IAAI,GAAG,KAAyE,CAAC;QACvF,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;YAAE,SAAS;QAC9C,aAAa,CAAC,IAAI,CAAC;YACjB,QAAQ,EAAE,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,MAAM;YAClB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;IACL,CAAC;IAED,gCAAgC;IAChC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAE9C,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM;QAC9B,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK;QACnE,aAAa;QACb,SAAS,EAAE,CAAC,MAAM,CAAC;KACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Coverage artifact import.
|
|
3
|
+
*
|
|
4
|
+
* Detects and parses coverage reports produced by the project's test runner
|
|
5
|
+
* so dxkit can report line-level truth instead of fabricating coverage from
|
|
6
|
+
* filename matches.
|
|
7
|
+
*
|
|
8
|
+
* Supported formats (first match wins, in order):
|
|
9
|
+
* 1. Istanbul summary — `coverage/coverage-summary.json` (nyc, c8, vitest)
|
|
10
|
+
* 2. Istanbul detailed — `coverage/coverage-final.json`
|
|
11
|
+
* 3. coverage.py JSON — `coverage.json` (Python)
|
|
12
|
+
* 4. Go coverprofile — `coverage.out` / `cover.out`
|
|
13
|
+
*
|
|
14
|
+
* Returns a normalized `Coverage` object or `null` when no artifact exists
|
|
15
|
+
* or the file is unparseable. Callers (tests analyzer) should treat a null
|
|
16
|
+
* return as "fall back to filename matching."
|
|
17
|
+
*/
|
|
18
|
+
export type CoverageSource = 'istanbul-summary' | 'istanbul-final' | 'coverage-py' | 'go' | 'cobertura' | 'lcov';
|
|
19
|
+
export interface FileCoverage {
|
|
20
|
+
/** Project-relative path (normalized to forward slashes). */
|
|
21
|
+
path: string;
|
|
22
|
+
/** Covered lines or statements. */
|
|
23
|
+
covered: number;
|
|
24
|
+
/** Total lines or statements considered. */
|
|
25
|
+
total: number;
|
|
26
|
+
/** covered / total * 100, rounded to one decimal place. */
|
|
27
|
+
pct: number;
|
|
28
|
+
}
|
|
29
|
+
export interface Coverage {
|
|
30
|
+
/** Which artifact we read. */
|
|
31
|
+
source: CoverageSource;
|
|
32
|
+
/** Project-relative path of the artifact. */
|
|
33
|
+
sourceFile: string;
|
|
34
|
+
/** Overall line coverage 0-100, rounded to one decimal. */
|
|
35
|
+
linePercent: number;
|
|
36
|
+
/** Per-file coverage, keyed by project-relative path. */
|
|
37
|
+
files: Map<string, FileCoverage>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Locate and parse a coverage artifact for the given repo root.
|
|
41
|
+
* Returns null when nothing is found or parsing fails.
|
|
42
|
+
*/
|
|
43
|
+
export declare function loadCoverage(cwd: string): Coverage | null;
|
|
44
|
+
/** Istanbul coverage-summary.json: `{ "total": {...}, "/abs/path": {...} }`. */
|
|
45
|
+
export declare function parseIstanbulSummary(raw: string, sourceFile: string, cwd: string): Coverage;
|
|
46
|
+
/** Istanbul coverage-final.json: `{ "/abs/path": { s: { "0": 1, "1": 0, ... }, statementMap: {...} } }`. */
|
|
47
|
+
export declare function parseIstanbulFinal(raw: string, sourceFile: string, cwd: string): Coverage;
|
|
48
|
+
/** coverage.py JSON: `{ "totals": {...}, "files": { "path": { summary: {...} } } }`. */
|
|
49
|
+
export declare function parseCoveragePy(raw: string, sourceFile: string, cwd: string): Coverage;
|
|
50
|
+
/**
|
|
51
|
+
* Go coverprofile:
|
|
52
|
+
* mode: set
|
|
53
|
+
* pkg/path/file.go:5.2,10.1 3 1
|
|
54
|
+
*
|
|
55
|
+
* Each line: file:startLine.col,endLine.col numStatements count.
|
|
56
|
+
* A block is covered iff count > 0.
|
|
57
|
+
*/
|
|
58
|
+
export declare function parseGoCoverProfile(raw: string, sourceFile: string, cwd: string): Coverage;
|
|
59
|
+
//# sourceMappingURL=coverage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,MAAM,MAAM,cAAc,GACtB,kBAAkB,GAClB,gBAAgB,GAChB,aAAa,GACb,IAAI,GACJ,WAAW,GACX,MAAM,CAAC;AAEX,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,QAAQ;IACvB,8BAA8B;IAC9B,MAAM,EAAE,cAAc,CAAC;IACvB,6CAA6C;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAClC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAkCzD;AAID,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CA6B3F;AAMD,4GAA4G;AAC5G,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CA6BzF;AAOD,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CAsCtF;AAiBD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CAwC1F"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Coverage artifact import.
|
|
4
|
+
*
|
|
5
|
+
* Detects and parses coverage reports produced by the project's test runner
|
|
6
|
+
* so dxkit can report line-level truth instead of fabricating coverage from
|
|
7
|
+
* filename matches.
|
|
8
|
+
*
|
|
9
|
+
* Supported formats (first match wins, in order):
|
|
10
|
+
* 1. Istanbul summary — `coverage/coverage-summary.json` (nyc, c8, vitest)
|
|
11
|
+
* 2. Istanbul detailed — `coverage/coverage-final.json`
|
|
12
|
+
* 3. coverage.py JSON — `coverage.json` (Python)
|
|
13
|
+
* 4. Go coverprofile — `coverage.out` / `cover.out`
|
|
14
|
+
*
|
|
15
|
+
* Returns a normalized `Coverage` object or `null` when no artifact exists
|
|
16
|
+
* or the file is unparseable. Callers (tests analyzer) should treat a null
|
|
17
|
+
* return as "fall back to filename matching."
|
|
18
|
+
*/
|
|
19
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
22
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
23
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
24
|
+
}
|
|
25
|
+
Object.defineProperty(o, k2, desc);
|
|
26
|
+
}) : (function(o, m, k, k2) {
|
|
27
|
+
if (k2 === undefined) k2 = k;
|
|
28
|
+
o[k2] = m[k];
|
|
29
|
+
}));
|
|
30
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
31
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
32
|
+
}) : function(o, v) {
|
|
33
|
+
o["default"] = v;
|
|
34
|
+
});
|
|
35
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
36
|
+
var ownKeys = function(o) {
|
|
37
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
38
|
+
var ar = [];
|
|
39
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
40
|
+
return ar;
|
|
41
|
+
};
|
|
42
|
+
return ownKeys(o);
|
|
43
|
+
};
|
|
44
|
+
return function (mod) {
|
|
45
|
+
if (mod && mod.__esModule) return mod;
|
|
46
|
+
var result = {};
|
|
47
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
48
|
+
__setModuleDefault(result, mod);
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
})();
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
exports.loadCoverage = loadCoverage;
|
|
54
|
+
exports.parseIstanbulSummary = parseIstanbulSummary;
|
|
55
|
+
exports.parseIstanbulFinal = parseIstanbulFinal;
|
|
56
|
+
exports.parseCoveragePy = parseCoveragePy;
|
|
57
|
+
exports.parseGoCoverProfile = parseGoCoverProfile;
|
|
58
|
+
const fs = __importStar(require("fs"));
|
|
59
|
+
const path = __importStar(require("path"));
|
|
60
|
+
/**
|
|
61
|
+
* Locate and parse a coverage artifact for the given repo root.
|
|
62
|
+
* Returns null when nothing is found or parsing fails.
|
|
63
|
+
*/
|
|
64
|
+
function loadCoverage(cwd) {
|
|
65
|
+
const candidates = [
|
|
66
|
+
{ source: 'istanbul-summary', file: 'coverage/coverage-summary.json' },
|
|
67
|
+
{ source: 'istanbul-final', file: 'coverage/coverage-final.json' },
|
|
68
|
+
{ source: 'coverage-py', file: 'coverage.json' },
|
|
69
|
+
{ source: 'go', file: 'coverage.out' },
|
|
70
|
+
{ source: 'go', file: 'cover.out' },
|
|
71
|
+
];
|
|
72
|
+
for (const c of candidates) {
|
|
73
|
+
const abs = path.join(cwd, c.file);
|
|
74
|
+
let raw;
|
|
75
|
+
try {
|
|
76
|
+
raw = fs.readFileSync(abs, 'utf-8');
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
switch (c.source) {
|
|
83
|
+
case 'istanbul-summary':
|
|
84
|
+
return parseIstanbulSummary(raw, c.file, cwd);
|
|
85
|
+
case 'istanbul-final':
|
|
86
|
+
return parseIstanbulFinal(raw, c.file, cwd);
|
|
87
|
+
case 'coverage-py':
|
|
88
|
+
return parseCoveragePy(raw, c.file, cwd);
|
|
89
|
+
case 'go':
|
|
90
|
+
return parseGoCoverProfile(raw, c.file, cwd);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Try the next candidate on parse failure.
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
// ─── Parsers ────────────────────────────────────────────────────────────────
|
|
101
|
+
/** Istanbul coverage-summary.json: `{ "total": {...}, "/abs/path": {...} }`. */
|
|
102
|
+
function parseIstanbulSummary(raw, sourceFile, cwd) {
|
|
103
|
+
const data = JSON.parse(raw);
|
|
104
|
+
const files = new Map();
|
|
105
|
+
let totalCovered = 0;
|
|
106
|
+
let totalLines = 0;
|
|
107
|
+
for (const [key, entry] of Object.entries(data)) {
|
|
108
|
+
if (key === 'total')
|
|
109
|
+
continue;
|
|
110
|
+
const lines = entry?.lines;
|
|
111
|
+
if (!lines || typeof lines.covered !== 'number' || typeof lines.total !== 'number')
|
|
112
|
+
continue;
|
|
113
|
+
const rel = toRelative(key, cwd);
|
|
114
|
+
const fc = {
|
|
115
|
+
path: rel,
|
|
116
|
+
covered: lines.covered,
|
|
117
|
+
total: lines.total,
|
|
118
|
+
pct: round1(lines.total > 0 ? (lines.covered / lines.total) * 100 : 0),
|
|
119
|
+
};
|
|
120
|
+
files.set(rel, fc);
|
|
121
|
+
totalCovered += lines.covered;
|
|
122
|
+
totalLines += lines.total;
|
|
123
|
+
}
|
|
124
|
+
const total = data.total?.lines;
|
|
125
|
+
const linePercent = total && typeof total.pct === 'number'
|
|
126
|
+
? round1(total.pct)
|
|
127
|
+
: round1(totalLines > 0 ? (totalCovered / totalLines) * 100 : 0);
|
|
128
|
+
return { source: 'istanbul-summary', sourceFile, linePercent, files };
|
|
129
|
+
}
|
|
130
|
+
/** Istanbul coverage-final.json: `{ "/abs/path": { s: { "0": 1, "1": 0, ... }, statementMap: {...} } }`. */
|
|
131
|
+
function parseIstanbulFinal(raw, sourceFile, cwd) {
|
|
132
|
+
const data = JSON.parse(raw);
|
|
133
|
+
const files = new Map();
|
|
134
|
+
let totalCovered = 0;
|
|
135
|
+
let totalStatements = 0;
|
|
136
|
+
for (const [key, entry] of Object.entries(data)) {
|
|
137
|
+
const s = entry?.s;
|
|
138
|
+
if (!s || typeof s !== 'object')
|
|
139
|
+
continue;
|
|
140
|
+
const counts = Object.values(s);
|
|
141
|
+
const total = counts.length;
|
|
142
|
+
const covered = counts.filter((n) => typeof n === 'number' && n > 0).length;
|
|
143
|
+
const rel = toRelative(entry.path || key, cwd);
|
|
144
|
+
files.set(rel, {
|
|
145
|
+
path: rel,
|
|
146
|
+
covered,
|
|
147
|
+
total,
|
|
148
|
+
pct: round1(total > 0 ? (covered / total) * 100 : 0),
|
|
149
|
+
});
|
|
150
|
+
totalCovered += covered;
|
|
151
|
+
totalStatements += total;
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
source: 'istanbul-final',
|
|
155
|
+
sourceFile,
|
|
156
|
+
linePercent: round1(totalStatements > 0 ? (totalCovered / totalStatements) * 100 : 0),
|
|
157
|
+
files,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/** coverage.py JSON: `{ "totals": {...}, "files": { "path": { summary: {...} } } }`. */
|
|
161
|
+
function parseCoveragePy(raw, sourceFile, cwd) {
|
|
162
|
+
const data = JSON.parse(raw);
|
|
163
|
+
const files = new Map();
|
|
164
|
+
let totalCovered = 0;
|
|
165
|
+
let totalStatements = 0;
|
|
166
|
+
for (const [key, entry] of Object.entries(data.files ?? {})) {
|
|
167
|
+
const summary = entry?.summary;
|
|
168
|
+
if (!summary)
|
|
169
|
+
continue;
|
|
170
|
+
const total = typeof summary.num_statements === 'number' ? summary.num_statements : 0;
|
|
171
|
+
const missing = typeof summary.missing_lines === 'number' ? summary.missing_lines : 0;
|
|
172
|
+
const covered = typeof summary.covered_lines === 'number'
|
|
173
|
+
? summary.covered_lines
|
|
174
|
+
: Math.max(0, total - missing);
|
|
175
|
+
const rel = toRelative(key, cwd);
|
|
176
|
+
files.set(rel, {
|
|
177
|
+
path: rel,
|
|
178
|
+
covered,
|
|
179
|
+
total,
|
|
180
|
+
pct: round1(typeof summary.percent_covered === 'number'
|
|
181
|
+
? summary.percent_covered
|
|
182
|
+
: total > 0
|
|
183
|
+
? (covered / total) * 100
|
|
184
|
+
: 0),
|
|
185
|
+
});
|
|
186
|
+
totalCovered += covered;
|
|
187
|
+
totalStatements += total;
|
|
188
|
+
}
|
|
189
|
+
const linePercent = typeof data.totals?.percent_covered === 'number'
|
|
190
|
+
? round1(data.totals.percent_covered)
|
|
191
|
+
: round1(totalStatements > 0 ? (totalCovered / totalStatements) * 100 : 0);
|
|
192
|
+
return { source: 'coverage-py', sourceFile, linePercent, files };
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Go coverprofile:
|
|
196
|
+
* mode: set
|
|
197
|
+
* pkg/path/file.go:5.2,10.1 3 1
|
|
198
|
+
*
|
|
199
|
+
* Each line: file:startLine.col,endLine.col numStatements count.
|
|
200
|
+
* A block is covered iff count > 0.
|
|
201
|
+
*/
|
|
202
|
+
function parseGoCoverProfile(raw, sourceFile, cwd) {
|
|
203
|
+
const perFile = new Map();
|
|
204
|
+
let totalCovered = 0;
|
|
205
|
+
let totalStatements = 0;
|
|
206
|
+
for (const line of raw.split('\n')) {
|
|
207
|
+
if (!line || line.startsWith('mode:'))
|
|
208
|
+
continue;
|
|
209
|
+
// file:startLine.col,endLine.col numStatements count
|
|
210
|
+
const m = line.match(/^(.+):\d+\.\d+,\d+\.\d+\s+(\d+)\s+(\d+)$/);
|
|
211
|
+
if (!m)
|
|
212
|
+
continue;
|
|
213
|
+
const file = m[1];
|
|
214
|
+
const stmts = parseInt(m[2], 10);
|
|
215
|
+
const count = parseInt(m[3], 10);
|
|
216
|
+
const bucket = perFile.get(file) ?? { covered: 0, total: 0 };
|
|
217
|
+
bucket.total += stmts;
|
|
218
|
+
if (count > 0)
|
|
219
|
+
bucket.covered += stmts;
|
|
220
|
+
perFile.set(file, bucket);
|
|
221
|
+
totalStatements += stmts;
|
|
222
|
+
if (count > 0)
|
|
223
|
+
totalCovered += stmts;
|
|
224
|
+
}
|
|
225
|
+
const files = new Map();
|
|
226
|
+
for (const [key, { covered, total }] of perFile) {
|
|
227
|
+
// Go coverprofile uses module-relative paths (e.g. github.com/user/repo/pkg/foo.go).
|
|
228
|
+
// Strip the module prefix if it resolves to a real file in cwd.
|
|
229
|
+
const rel = resolveGoPath(key, cwd);
|
|
230
|
+
files.set(rel, {
|
|
231
|
+
path: rel,
|
|
232
|
+
covered,
|
|
233
|
+
total,
|
|
234
|
+
pct: round1(total > 0 ? (covered / total) * 100 : 0),
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
source: 'go',
|
|
239
|
+
sourceFile,
|
|
240
|
+
linePercent: round1(totalStatements > 0 ? (totalCovered / totalStatements) * 100 : 0),
|
|
241
|
+
files,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
245
|
+
function round1(n) {
|
|
246
|
+
return Math.round(n * 10) / 10;
|
|
247
|
+
}
|
|
248
|
+
/** Turn an absolute or prefixed coverage path into a project-relative path. */
|
|
249
|
+
function toRelative(p, cwd) {
|
|
250
|
+
let out = p.replace(/\\/g, '/');
|
|
251
|
+
const cwdNorm = cwd.replace(/\\/g, '/');
|
|
252
|
+
if (out.startsWith(cwdNorm + '/')) {
|
|
253
|
+
out = out.slice(cwdNorm.length + 1);
|
|
254
|
+
}
|
|
255
|
+
else if (out === cwdNorm) {
|
|
256
|
+
out = '';
|
|
257
|
+
}
|
|
258
|
+
if (out.startsWith('./'))
|
|
259
|
+
out = out.slice(2);
|
|
260
|
+
return out;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Go coverprofile paths look like `github.com/user/repo/pkg/foo.go`. If that
|
|
264
|
+
* file doesn't exist at cwd, try stripping leading segments until we find one
|
|
265
|
+
* that does. Fall back to the original string if nothing resolves.
|
|
266
|
+
*/
|
|
267
|
+
function resolveGoPath(p, cwd) {
|
|
268
|
+
const norm = p.replace(/\\/g, '/');
|
|
269
|
+
// Already relative and exists?
|
|
270
|
+
if (fs.existsSync(path.join(cwd, norm)))
|
|
271
|
+
return norm;
|
|
272
|
+
const parts = norm.split('/');
|
|
273
|
+
for (let i = 1; i < parts.length; i++) {
|
|
274
|
+
const candidate = parts.slice(i).join('/');
|
|
275
|
+
if (fs.existsSync(path.join(cwd, candidate)))
|
|
276
|
+
return candidate;
|
|
277
|
+
}
|
|
278
|
+
return norm;
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../../src/analyzers/tools/coverage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CVSS v4.0 MacroVector → base score lookup table.
|
|
3
|
+
* 270 entries, one per valid macrovector.
|
|
4
|
+
*
|
|
5
|
+
* Source: https://github.com/FIRSTdotorg/cvss-v4-calculator/blob/main/cvss_lookup.js
|
|
6
|
+
* Copyright FIRST, Red Hat, and contributors. SPDX-License-Identifier: BSD-2-Clause.
|
|
7
|
+
* See THIRD_PARTY_NOTICES.md for attribution.
|
|
8
|
+
*/
|
|
9
|
+
export declare const CVSS_V4_LOOKUP: Record<string, number>;
|
|
10
|
+
//# sourceMappingURL=cvss-v4-lookup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cvss-v4-lookup.d.ts","sourceRoot":"","sources":["../../../src/analyzers/tools/cvss-v4-lookup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA+QjD,CAAC"}
|