api-tests-coverage 1.0.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/README.md +703 -0
- package/config.yaml.example +227 -0
- package/dist/action/src/index.d.ts +2 -0
- package/dist/action/src/index.d.ts.map +1 -0
- package/dist/action/src/index.js +349 -0
- package/dist/action/src/prComment.d.ts +34 -0
- package/dist/action/src/prComment.d.ts.map +1 -0
- package/dist/action/src/prComment.js +146 -0
- package/dist/src/ast/astAnalysisOrchestrator.d.ts +36 -0
- package/dist/src/ast/astAnalysisOrchestrator.d.ts.map +1 -0
- package/dist/src/ast/astAnalysisOrchestrator.js +123 -0
- package/dist/src/ast/astTypes.d.ts +105 -0
- package/dist/src/ast/astTypes.d.ts.map +1 -0
- package/dist/src/ast/astTypes.js +9 -0
- package/dist/src/ast/languageAnalyzer.d.ts +46 -0
- package/dist/src/ast/languageAnalyzer.d.ts.map +1 -0
- package/dist/src/ast/languageAnalyzer.js +9 -0
- package/dist/src/ast/languageCapabilities.d.ts +24 -0
- package/dist/src/ast/languageCapabilities.d.ts.map +1 -0
- package/dist/src/ast/languageCapabilities.js +92 -0
- package/dist/src/ast/parseFile.d.ts +16 -0
- package/dist/src/ast/parseFile.d.ts.map +1 -0
- package/dist/src/ast/parseFile.js +65 -0
- package/dist/src/ast/parserRegistry.d.ts +39 -0
- package/dist/src/ast/parserRegistry.d.ts.map +1 -0
- package/dist/src/ast/parserRegistry.js +66 -0
- package/dist/src/buildSummary.d.ts +26 -0
- package/dist/src/buildSummary.d.ts.map +1 -0
- package/dist/src/buildSummary.js +193 -0
- package/dist/src/businessCoverage.d.ts +68 -0
- package/dist/src/businessCoverage.d.ts.map +1 -0
- package/dist/src/businessCoverage.js +290 -0
- package/dist/src/compatibilityCoverage.d.ts +83 -0
- package/dist/src/compatibilityCoverage.d.ts.map +1 -0
- package/dist/src/compatibilityCoverage.js +501 -0
- package/dist/src/config/defaultConfig.d.ts +9 -0
- package/dist/src/config/defaultConfig.d.ts.map +1 -0
- package/dist/src/config/defaultConfig.js +97 -0
- package/dist/src/config/index.d.ts +12 -0
- package/dist/src/config/index.d.ts.map +1 -0
- package/dist/src/config/index.js +37 -0
- package/dist/src/config/loadConfig.d.ts +29 -0
- package/dist/src/config/loadConfig.d.ts.map +1 -0
- package/dist/src/config/loadConfig.js +135 -0
- package/dist/src/config/mergeConfig.d.ts +15 -0
- package/dist/src/config/mergeConfig.d.ts.map +1 -0
- package/dist/src/config/mergeConfig.js +57 -0
- package/dist/src/config/schema.d.ts +15 -0
- package/dist/src/config/schema.d.ts.map +1 -0
- package/dist/src/config/schema.js +30 -0
- package/dist/src/config/types.d.ts +175 -0
- package/dist/src/config/types.d.ts.map +1 -0
- package/dist/src/config/types.js +9 -0
- package/dist/src/config/validateConfig.d.ts +22 -0
- package/dist/src/config/validateConfig.d.ts.map +1 -0
- package/dist/src/config/validateConfig.js +171 -0
- package/dist/src/config.d.ts +168 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +204 -0
- package/dist/src/coverage/deep-analysis/callGraph.d.ts +67 -0
- package/dist/src/coverage/deep-analysis/callGraph.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/callGraph.js +275 -0
- package/dist/src/coverage/deep-analysis/deepEndpointResolver.d.ts +23 -0
- package/dist/src/coverage/deep-analysis/deepEndpointResolver.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/deepEndpointResolver.js +394 -0
- package/dist/src/coverage/deep-analysis/index.d.ts +17 -0
- package/dist/src/coverage/deep-analysis/index.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/index.js +63 -0
- package/dist/src/coverage/deep-analysis/resolveAssertions.d.ts +60 -0
- package/dist/src/coverage/deep-analysis/resolveAssertions.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/resolveAssertions.js +121 -0
- package/dist/src/coverage/deep-analysis/resolveConstants.d.ts +36 -0
- package/dist/src/coverage/deep-analysis/resolveConstants.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/resolveConstants.js +92 -0
- package/dist/src/coverage/deep-analysis/resolveEnums.d.ts +55 -0
- package/dist/src/coverage/deep-analysis/resolveEnums.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/resolveEnums.js +152 -0
- package/dist/src/coverage/deep-analysis/resolveMethodChains.d.ts +70 -0
- package/dist/src/coverage/deep-analysis/resolveMethodChains.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/resolveMethodChains.js +152 -0
- package/dist/src/coverage/deep-analysis/resolvePaths.d.ts +80 -0
- package/dist/src/coverage/deep-analysis/resolvePaths.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/resolvePaths.js +216 -0
- package/dist/src/coverage/deep-analysis/resolveRequestWrappers.d.ts +71 -0
- package/dist/src/coverage/deep-analysis/resolveRequestWrappers.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/resolveRequestWrappers.js +226 -0
- package/dist/src/coverage/deep-analysis/symbolTable.d.ts +58 -0
- package/dist/src/coverage/deep-analysis/symbolTable.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/symbolTable.js +230 -0
- package/dist/src/coverage/deep-analysis/types.d.ts +122 -0
- package/dist/src/coverage/deep-analysis/types.d.ts.map +1 -0
- package/dist/src/coverage/deep-analysis/types.js +21 -0
- package/dist/src/discovery/fileClassifier.d.ts +50 -0
- package/dist/src/discovery/fileClassifier.d.ts.map +1 -0
- package/dist/src/discovery/fileClassifier.js +238 -0
- package/dist/src/discovery/projectDiscovery.d.ts +66 -0
- package/dist/src/discovery/projectDiscovery.d.ts.map +1 -0
- package/dist/src/discovery/projectDiscovery.js +287 -0
- package/dist/src/endpointCoverage.d.ts +70 -0
- package/dist/src/endpointCoverage.d.ts.map +1 -0
- package/dist/src/endpointCoverage.js +381 -0
- package/dist/src/errorCoverage.d.ts +93 -0
- package/dist/src/errorCoverage.d.ts.map +1 -0
- package/dist/src/errorCoverage.js +698 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +1441 -0
- package/dist/src/inference/businessRuleInference.d.ts +63 -0
- package/dist/src/inference/businessRuleInference.d.ts.map +1 -0
- package/dist/src/inference/businessRuleInference.js +268 -0
- package/dist/src/inference/integrationFlowInference.d.ts +56 -0
- package/dist/src/inference/integrationFlowInference.d.ts.map +1 -0
- package/dist/src/inference/integrationFlowInference.js +266 -0
- package/dist/src/integrationCoverage.d.ts +72 -0
- package/dist/src/integrationCoverage.d.ts.map +1 -0
- package/dist/src/integrationCoverage.js +317 -0
- package/dist/src/intelligence/index.d.ts +20 -0
- package/dist/src/intelligence/index.d.ts.map +1 -0
- package/dist/src/intelligence/index.js +105 -0
- package/dist/src/intelligence/linkageEngine.d.ts +20 -0
- package/dist/src/intelligence/linkageEngine.d.ts.map +1 -0
- package/dist/src/intelligence/linkageEngine.js +522 -0
- package/dist/src/intelligence/markdownReporter.d.ts +12 -0
- package/dist/src/intelligence/markdownReporter.d.ts.map +1 -0
- package/dist/src/intelligence/markdownReporter.js +265 -0
- package/dist/src/intelligence/riskScoring.d.ts +53 -0
- package/dist/src/intelligence/riskScoring.d.ts.map +1 -0
- package/dist/src/intelligence/riskScoring.js +181 -0
- package/dist/src/intelligence/types.d.ts +121 -0
- package/dist/src/intelligence/types.d.ts.map +1 -0
- package/dist/src/intelligence/types.js +8 -0
- package/dist/src/languageDetection.d.ts +100 -0
- package/dist/src/languageDetection.d.ts.map +1 -0
- package/dist/src/languageDetection.js +349 -0
- package/dist/src/languages/java/index.d.ts +16 -0
- package/dist/src/languages/java/index.d.ts.map +1 -0
- package/dist/src/languages/java/index.js +103 -0
- package/dist/src/languages/java/parser.d.ts +7 -0
- package/dist/src/languages/java/parser.d.ts.map +1 -0
- package/dist/src/languages/java/parser.js +50 -0
- package/dist/src/languages/java/semanticBuilder.d.ts +21 -0
- package/dist/src/languages/java/semanticBuilder.d.ts.map +1 -0
- package/dist/src/languages/java/semanticBuilder.js +358 -0
- package/dist/src/languages/javascript/annotationExtractor.d.ts +20 -0
- package/dist/src/languages/javascript/annotationExtractor.d.ts.map +1 -0
- package/dist/src/languages/javascript/annotationExtractor.js +94 -0
- package/dist/src/languages/javascript/assertionResolver.d.ts +18 -0
- package/dist/src/languages/javascript/assertionResolver.d.ts.map +1 -0
- package/dist/src/languages/javascript/assertionResolver.js +150 -0
- package/dist/src/languages/javascript/callResolver.d.ts +23 -0
- package/dist/src/languages/javascript/callResolver.d.ts.map +1 -0
- package/dist/src/languages/javascript/callResolver.js +236 -0
- package/dist/src/languages/javascript/httpInteractionExtractor.d.ts +23 -0
- package/dist/src/languages/javascript/httpInteractionExtractor.d.ts.map +1 -0
- package/dist/src/languages/javascript/httpInteractionExtractor.js +205 -0
- package/dist/src/languages/javascript/index.d.ts +20 -0
- package/dist/src/languages/javascript/index.d.ts.map +1 -0
- package/dist/src/languages/javascript/index.js +136 -0
- package/dist/src/languages/javascript/parser.d.ts +14 -0
- package/dist/src/languages/javascript/parser.d.ts.map +1 -0
- package/dist/src/languages/javascript/parser.js +38 -0
- package/dist/src/languages/javascript/symbolResolver.d.ts +31 -0
- package/dist/src/languages/javascript/symbolResolver.d.ts.map +1 -0
- package/dist/src/languages/javascript/symbolResolver.js +183 -0
- package/dist/src/languages/kotlin/index.d.ts +16 -0
- package/dist/src/languages/kotlin/index.d.ts.map +1 -0
- package/dist/src/languages/kotlin/index.js +151 -0
- package/dist/src/languages/kotlin/parser.d.ts +11 -0
- package/dist/src/languages/kotlin/parser.d.ts.map +1 -0
- package/dist/src/languages/kotlin/parser.js +74 -0
- package/dist/src/languages/python/index.d.ts +15 -0
- package/dist/src/languages/python/index.d.ts.map +1 -0
- package/dist/src/languages/python/index.js +293 -0
- package/dist/src/languages/ruby/index.d.ts +15 -0
- package/dist/src/languages/ruby/index.d.ts.map +1 -0
- package/dist/src/languages/ruby/index.js +274 -0
- package/dist/src/languages/shared/treeSitterUtils.d.ts +43 -0
- package/dist/src/languages/shared/treeSitterUtils.d.ts.map +1 -0
- package/dist/src/languages/shared/treeSitterUtils.js +100 -0
- package/dist/src/languages/typescript/index.d.ts +14 -0
- package/dist/src/languages/typescript/index.d.ts.map +1 -0
- package/dist/src/languages/typescript/index.js +25 -0
- package/dist/src/lib/index.d.ts +228 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +486 -0
- package/dist/src/mcp/client/index.d.ts +37 -0
- package/dist/src/mcp/client/index.d.ts.map +1 -0
- package/dist/src/mcp/client/index.js +235 -0
- package/dist/src/mcp/config.d.ts +50 -0
- package/dist/src/mcp/config.d.ts.map +1 -0
- package/dist/src/mcp/config.js +125 -0
- package/dist/src/mcp/events.d.ts +24 -0
- package/dist/src/mcp/events.d.ts.map +1 -0
- package/dist/src/mcp/events.js +48 -0
- package/dist/src/mcp/fallback/index.d.ts +50 -0
- package/dist/src/mcp/fallback/index.d.ts.map +1 -0
- package/dist/src/mcp/fallback/index.js +216 -0
- package/dist/src/mcp/index.d.ts +67 -0
- package/dist/src/mcp/index.d.ts.map +1 -0
- package/dist/src/mcp/index.js +212 -0
- package/dist/src/mcp/normalizer.d.ts +21 -0
- package/dist/src/mcp/normalizer.d.ts.map +1 -0
- package/dist/src/mcp/normalizer.js +99 -0
- package/dist/src/mcp/prompts/index.d.ts +86 -0
- package/dist/src/mcp/prompts/index.d.ts.map +1 -0
- package/dist/src/mcp/prompts/index.js +304 -0
- package/dist/src/mcp/templates/index.d.ts +35 -0
- package/dist/src/mcp/templates/index.d.ts.map +1 -0
- package/dist/src/mcp/templates/index.js +143 -0
- package/dist/src/mcp/testing/mock-server/index.d.ts +47 -0
- package/dist/src/mcp/testing/mock-server/index.d.ts.map +1 -0
- package/dist/src/mcp/testing/mock-server/index.js +157 -0
- package/dist/src/mcp/types.d.ts +127 -0
- package/dist/src/mcp/types.d.ts.map +1 -0
- package/dist/src/mcp/types.js +8 -0
- package/dist/src/observability.d.ts +138 -0
- package/dist/src/observability.d.ts.map +1 -0
- package/dist/src/observability.js +519 -0
- package/dist/src/parameterCoverage.d.ts +75 -0
- package/dist/src/parameterCoverage.d.ts.map +1 -0
- package/dist/src/parameterCoverage.js +629 -0
- package/dist/src/perfResilienceCoverage.d.ts +155 -0
- package/dist/src/perfResilienceCoverage.d.ts.map +1 -0
- package/dist/src/perfResilienceCoverage.js +670 -0
- package/dist/src/pluginLoader.d.ts +51 -0
- package/dist/src/pluginLoader.d.ts.map +1 -0
- package/dist/src/pluginLoader.js +72 -0
- package/dist/src/publishing.d.ts +63 -0
- package/dist/src/publishing.d.ts.map +1 -0
- package/dist/src/publishing.js +379 -0
- package/dist/src/qualityGate.d.ts +58 -0
- package/dist/src/qualityGate.d.ts.map +1 -0
- package/dist/src/qualityGate.js +118 -0
- package/dist/src/reporting.d.ts +41 -0
- package/dist/src/reporting.d.ts.map +1 -0
- package/dist/src/reporting.js +278 -0
- package/dist/src/screenshots.d.ts +71 -0
- package/dist/src/screenshots.d.ts.map +1 -0
- package/dist/src/screenshots.js +141 -0
- package/dist/src/security/gate/index.d.ts +11 -0
- package/dist/src/security/gate/index.d.ts.map +1 -0
- package/dist/src/security/gate/index.js +65 -0
- package/dist/src/security/index.d.ts +30 -0
- package/dist/src/security/index.d.ts.map +1 -0
- package/dist/src/security/index.js +342 -0
- package/dist/src/security/normalizers/semgrep.d.ts +10 -0
- package/dist/src/security/normalizers/semgrep.d.ts.map +1 -0
- package/dist/src/security/normalizers/semgrep.js +104 -0
- package/dist/src/security/normalizers/trivy.d.ts +10 -0
- package/dist/src/security/normalizers/trivy.d.ts.map +1 -0
- package/dist/src/security/normalizers/trivy.js +78 -0
- package/dist/src/security/normalizers/zap.d.ts +10 -0
- package/dist/src/security/normalizers/zap.d.ts.map +1 -0
- package/dist/src/security/normalizers/zap.js +104 -0
- package/dist/src/security/scanners/semgrep.d.ts +6 -0
- package/dist/src/security/scanners/semgrep.d.ts.map +1 -0
- package/dist/src/security/scanners/semgrep.js +125 -0
- package/dist/src/security/scanners/trivy.d.ts +6 -0
- package/dist/src/security/scanners/trivy.d.ts.map +1 -0
- package/dist/src/security/scanners/trivy.js +115 -0
- package/dist/src/security/scanners/zap.d.ts +6 -0
- package/dist/src/security/scanners/zap.d.ts.map +1 -0
- package/dist/src/security/scanners/zap.js +135 -0
- package/dist/src/security/types.d.ts +146 -0
- package/dist/src/security/types.d.ts.map +1 -0
- package/dist/src/security/types.js +6 -0
- package/dist/src/securityCoverage.d.ts +116 -0
- package/dist/src/securityCoverage.d.ts.map +1 -0
- package/dist/src/securityCoverage.js +725 -0
- package/dist/src/summary/buildSummary.d.ts +28 -0
- package/dist/src/summary/buildSummary.d.ts.map +1 -0
- package/dist/src/summary/buildSummary.js +257 -0
- package/dist/src/summary/evaluateMetrics.d.ts +31 -0
- package/dist/src/summary/evaluateMetrics.d.ts.map +1 -0
- package/dist/src/summary/evaluateMetrics.js +118 -0
- package/dist/src/summary/index.d.ts +10 -0
- package/dist/src/summary/index.d.ts.map +1 -0
- package/dist/src/summary/index.js +22 -0
- package/dist/src/summary/markdownRenderer.d.ts +139 -0
- package/dist/src/summary/markdownRenderer.d.ts.map +1 -0
- package/dist/src/summary/markdownRenderer.js +459 -0
- package/dist/src/summary/prSummary.d.ts +24 -0
- package/dist/src/summary/prSummary.d.ts.map +1 -0
- package/dist/src/summary/prSummary.js +233 -0
- package/dist/src/summary/summaryTypes.d.ts +35 -0
- package/dist/src/summary/summaryTypes.d.ts.map +1 -0
- package/dist/src/summary/summaryTypes.js +27 -0
- package/package.json +84 -0
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* api-test-coverage-analyzer – Public Library API
|
|
4
|
+
*
|
|
5
|
+
* Import individual analyze* functions in your own scripts:
|
|
6
|
+
*
|
|
7
|
+
* const { analyzeEndpoints } = require('api-test-coverage-analyzer');
|
|
8
|
+
* const results = await analyzeEndpoints({ spec: 'openapi.yaml', tests: 'tests/**\/*.ts' });
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
exports.printCiSummary = exports.generatePrComment = exports.writeStepSummary = exports.generateStepSummary = exports.evaluateQualityGate = exports.checkThresholds = exports.parseFormats = exports.generatePrSummary = exports.generateBuildSummary = exports.renderRiskPrioritizationMd = exports.renderMissingTestsMd = exports.renderCoverageIntelligenceMd = exports.writeIntelligenceReports = exports.buildRecommendationFromFinding = exports.runLinkageEngine = exports.scoreToPriority = exports.scoreToRiskBand = exports.computeRiskScore = exports.runIntelligenceEngine = exports.recordIntelligenceMetrics = exports.recordSecurityScanMetrics = exports.normalizeZapOutput = exports.normalizeTrivyOutput = exports.normalizeSemgrepOutput = exports.evaluateSecurityGate = exports.generateSecurityScanReports = exports.buildSecurityScanSummary = exports.runSecurityScan = void 0;
|
|
45
|
+
exports.analyzeEndpoints = analyzeEndpoints;
|
|
46
|
+
exports.analyzeParameters = analyzeParameters;
|
|
47
|
+
exports.analyzeBusinessRules = analyzeBusinessRules;
|
|
48
|
+
exports.analyzeIntegrationFlows = analyzeIntegrationFlows;
|
|
49
|
+
exports.analyzeErrorHandling = analyzeErrorHandling;
|
|
50
|
+
exports.analyzeSecurityControls = analyzeSecurityControls;
|
|
51
|
+
exports.analyzePerfResilience = analyzePerfResilience;
|
|
52
|
+
exports.runSecurityAnalysis = runSecurityAnalysis;
|
|
53
|
+
exports.analyzeCompatibility = analyzeCompatibility;
|
|
54
|
+
exports.runAnalysisAndEnforceQualityGate = runAnalysisAndEnforceQualityGate;
|
|
55
|
+
var index_1 = require("../security/index");
|
|
56
|
+
Object.defineProperty(exports, "runSecurityScan", { enumerable: true, get: function () { return index_1.runSecurityScan; } });
|
|
57
|
+
Object.defineProperty(exports, "buildSecurityScanSummary", { enumerable: true, get: function () { return index_1.buildSecurityScanSummary; } });
|
|
58
|
+
Object.defineProperty(exports, "generateSecurityScanReports", { enumerable: true, get: function () { return index_1.generateSecurityScanReports; } });
|
|
59
|
+
Object.defineProperty(exports, "evaluateSecurityGate", { enumerable: true, get: function () { return index_1.evaluateSecurityGate; } });
|
|
60
|
+
Object.defineProperty(exports, "normalizeSemgrepOutput", { enumerable: true, get: function () { return index_1.normalizeSemgrepOutput; } });
|
|
61
|
+
Object.defineProperty(exports, "normalizeTrivyOutput", { enumerable: true, get: function () { return index_1.normalizeTrivyOutput; } });
|
|
62
|
+
Object.defineProperty(exports, "normalizeZapOutput", { enumerable: true, get: function () { return index_1.normalizeZapOutput; } });
|
|
63
|
+
var observability_1 = require("../observability");
|
|
64
|
+
Object.defineProperty(exports, "recordSecurityScanMetrics", { enumerable: true, get: function () { return observability_1.recordSecurityScanMetrics; } });
|
|
65
|
+
Object.defineProperty(exports, "recordIntelligenceMetrics", { enumerable: true, get: function () { return observability_1.recordIntelligenceMetrics; } });
|
|
66
|
+
var index_2 = require("../intelligence/index");
|
|
67
|
+
Object.defineProperty(exports, "runIntelligenceEngine", { enumerable: true, get: function () { return index_2.runIntelligenceEngine; } });
|
|
68
|
+
Object.defineProperty(exports, "computeRiskScore", { enumerable: true, get: function () { return index_2.computeRiskScore; } });
|
|
69
|
+
Object.defineProperty(exports, "scoreToRiskBand", { enumerable: true, get: function () { return index_2.scoreToRiskBand; } });
|
|
70
|
+
Object.defineProperty(exports, "scoreToPriority", { enumerable: true, get: function () { return index_2.scoreToPriority; } });
|
|
71
|
+
Object.defineProperty(exports, "runLinkageEngine", { enumerable: true, get: function () { return index_2.runLinkageEngine; } });
|
|
72
|
+
Object.defineProperty(exports, "buildRecommendationFromFinding", { enumerable: true, get: function () { return index_2.buildRecommendationFromFinding; } });
|
|
73
|
+
Object.defineProperty(exports, "writeIntelligenceReports", { enumerable: true, get: function () { return index_2.writeIntelligenceReports; } });
|
|
74
|
+
Object.defineProperty(exports, "renderCoverageIntelligenceMd", { enumerable: true, get: function () { return index_2.renderCoverageIntelligenceMd; } });
|
|
75
|
+
Object.defineProperty(exports, "renderMissingTestsMd", { enumerable: true, get: function () { return index_2.renderMissingTestsMd; } });
|
|
76
|
+
Object.defineProperty(exports, "renderRiskPrioritizationMd", { enumerable: true, get: function () { return index_2.renderRiskPrioritizationMd; } });
|
|
77
|
+
// Re-export summary engine
|
|
78
|
+
var index_3 = require("../summary/index");
|
|
79
|
+
Object.defineProperty(exports, "generateBuildSummary", { enumerable: true, get: function () { return index_3.generateBuildSummary; } });
|
|
80
|
+
Object.defineProperty(exports, "generatePrSummary", { enumerable: true, get: function () { return index_3.generatePrSummary; } });
|
|
81
|
+
const path = __importStar(require("path"));
|
|
82
|
+
const index_4 = require("../security/index");
|
|
83
|
+
const endpointCoverage_1 = require("../endpointCoverage");
|
|
84
|
+
const parameterCoverage_1 = require("../parameterCoverage");
|
|
85
|
+
const businessCoverage_1 = require("../businessCoverage");
|
|
86
|
+
const integrationCoverage_1 = require("../integrationCoverage");
|
|
87
|
+
const errorCoverage_1 = require("../errorCoverage");
|
|
88
|
+
const securityCoverage_1 = require("../securityCoverage");
|
|
89
|
+
const perfResilienceCoverage_1 = require("../perfResilienceCoverage");
|
|
90
|
+
const compatibilityCoverage_1 = require("../compatibilityCoverage");
|
|
91
|
+
const reporting_1 = require("../reporting");
|
|
92
|
+
Object.defineProperty(exports, "parseFormats", { enumerable: true, get: function () { return reporting_1.parseFormats; } });
|
|
93
|
+
Object.defineProperty(exports, "checkThresholds", { enumerable: true, get: function () { return reporting_1.checkThresholds; } });
|
|
94
|
+
const languageDetection_1 = require("../languageDetection");
|
|
95
|
+
const qualityGate_1 = require("../qualityGate");
|
|
96
|
+
Object.defineProperty(exports, "evaluateQualityGate", { enumerable: true, get: function () { return qualityGate_1.evaluateQualityGate; } });
|
|
97
|
+
const publishing_1 = require("../publishing");
|
|
98
|
+
const buildSummary_1 = require("../buildSummary");
|
|
99
|
+
Object.defineProperty(exports, "generateStepSummary", { enumerable: true, get: function () { return buildSummary_1.generateStepSummary; } });
|
|
100
|
+
Object.defineProperty(exports, "writeStepSummary", { enumerable: true, get: function () { return buildSummary_1.writeStepSummary; } });
|
|
101
|
+
Object.defineProperty(exports, "generatePrComment", { enumerable: true, get: function () { return buildSummary_1.generatePrComment; } });
|
|
102
|
+
Object.defineProperty(exports, "printCiSummary", { enumerable: true, get: function () { return buildSummary_1.printCiSummary; } });
|
|
103
|
+
const index_5 = require("../summary/index");
|
|
104
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
105
|
+
function resolveTestsGlob(tests) {
|
|
106
|
+
return Array.isArray(tests) ? tests[0] : tests;
|
|
107
|
+
}
|
|
108
|
+
function resolveReportsDir(opts) {
|
|
109
|
+
var _a;
|
|
110
|
+
return path.resolve((_a = opts.reportsDir) !== null && _a !== void 0 ? _a : 'reports');
|
|
111
|
+
}
|
|
112
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
113
|
+
/**
|
|
114
|
+
* Analyse which API endpoints are covered by integration tests.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* const { analyzeEndpoints } = require('api-test-coverage-analyzer');
|
|
118
|
+
* const result = await analyzeEndpoints({ spec: 'openapi.yaml', tests: 'tests/**\/*.ts' });
|
|
119
|
+
*/
|
|
120
|
+
async function analyzeEndpoints(options) {
|
|
121
|
+
var _a;
|
|
122
|
+
const specPath = path.resolve(options.spec);
|
|
123
|
+
const testsGlob = resolveTestsGlob(options.tests);
|
|
124
|
+
const reportsDir = resolveReportsDir(options);
|
|
125
|
+
const formats = (0, reporting_1.parseFormats)((_a = options.format) !== null && _a !== void 0 ? _a : 'json,html');
|
|
126
|
+
const languages = options.language
|
|
127
|
+
? (0, languageDetection_1.parseLanguageOption)(Array.isArray(options.language) ? options.language.join(',') : options.language)
|
|
128
|
+
: ['auto'];
|
|
129
|
+
const endpoints = await (0, endpointCoverage_1.parseOpenApiSpec)(specPath);
|
|
130
|
+
const coverageMap = await (0, endpointCoverage_1.analyzeTestCoverage)(endpoints, testsGlob, languages);
|
|
131
|
+
const report = (0, endpointCoverage_1.buildCoverageReport)(coverageMap);
|
|
132
|
+
(0, endpointCoverage_1.generateReports)(report, reportsDir);
|
|
133
|
+
const result = {
|
|
134
|
+
type: 'endpoint',
|
|
135
|
+
totalItems: report.total,
|
|
136
|
+
coveredItems: report.covered,
|
|
137
|
+
coveragePercent: report.percentage,
|
|
138
|
+
details: report,
|
|
139
|
+
};
|
|
140
|
+
const thresholds = {};
|
|
141
|
+
if (options.thresholdEndpoint !== undefined && options.thresholdEndpoint > 0) {
|
|
142
|
+
thresholds['endpoint'] = options.thresholdEndpoint;
|
|
143
|
+
}
|
|
144
|
+
(0, reporting_1.generateMultiFormatReports)([result], formats, reportsDir, thresholds);
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Analyse how thoroughly each API parameter is tested.
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* const { analyzeParameters } = require('api-test-coverage-analyzer');
|
|
152
|
+
* const result = await analyzeParameters({ spec: 'openapi.yaml', tests: 'tests/**\/*.ts' });
|
|
153
|
+
*/
|
|
154
|
+
async function analyzeParameters(options) {
|
|
155
|
+
var _a;
|
|
156
|
+
const specPath = path.resolve(options.spec);
|
|
157
|
+
const testsGlob = resolveTestsGlob(options.tests);
|
|
158
|
+
const reportsDir = resolveReportsDir(options);
|
|
159
|
+
const formats = (0, reporting_1.parseFormats)((_a = options.format) !== null && _a !== void 0 ? _a : 'json,html');
|
|
160
|
+
const parameters = await (0, parameterCoverage_1.parseParameters)(specPath);
|
|
161
|
+
const coverages = await (0, parameterCoverage_1.analyzeParameterCoverage)(parameters, testsGlob);
|
|
162
|
+
const report = (0, parameterCoverage_1.buildParameterCoverageReport)(coverages);
|
|
163
|
+
(0, parameterCoverage_1.generateParameterReports)(report, reportsDir);
|
|
164
|
+
const result = {
|
|
165
|
+
type: 'parameter',
|
|
166
|
+
totalItems: report.totalParameters,
|
|
167
|
+
coveredItems: coverages.filter((c) => c.ratio > 0).length,
|
|
168
|
+
coveragePercent: report.averageCoverage,
|
|
169
|
+
details: report,
|
|
170
|
+
};
|
|
171
|
+
const thresholds = {};
|
|
172
|
+
if (options.thresholdParameter !== undefined && options.thresholdParameter > 0) {
|
|
173
|
+
thresholds['parameter'] = options.thresholdParameter;
|
|
174
|
+
}
|
|
175
|
+
(0, reporting_1.generateMultiFormatReports)([result], formats, reportsDir, thresholds);
|
|
176
|
+
return result;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Analyse how well tests cover defined business rules.
|
|
180
|
+
*
|
|
181
|
+
* @example
|
|
182
|
+
* const { analyzeBusinessRules } = require('api-test-coverage-analyzer');
|
|
183
|
+
* const result = await analyzeBusinessRules({ rules: 'business-rules.yaml', tests: 'tests/**\/*.ts' });
|
|
184
|
+
*/
|
|
185
|
+
async function analyzeBusinessRules(options) {
|
|
186
|
+
var _a;
|
|
187
|
+
const rulesPath = path.resolve(options.rules);
|
|
188
|
+
const testsGlob = resolveTestsGlob(options.tests);
|
|
189
|
+
const reportsDir = resolveReportsDir(options);
|
|
190
|
+
const formats = (0, reporting_1.parseFormats)((_a = options.format) !== null && _a !== void 0 ? _a : 'json,html');
|
|
191
|
+
const rules = (0, businessCoverage_1.parseBusinessRules)(rulesPath);
|
|
192
|
+
const coverages = await (0, businessCoverage_1.analyzeBusinessCoverage)(rules, testsGlob);
|
|
193
|
+
const report = (0, businessCoverage_1.buildBusinessCoverageReport)(coverages);
|
|
194
|
+
(0, businessCoverage_1.generateBusinessReports)(report, reportsDir);
|
|
195
|
+
const result = {
|
|
196
|
+
type: 'business',
|
|
197
|
+
totalItems: report.total,
|
|
198
|
+
coveredItems: report.covered,
|
|
199
|
+
coveragePercent: report.percentage,
|
|
200
|
+
details: report,
|
|
201
|
+
};
|
|
202
|
+
const thresholds = {};
|
|
203
|
+
if (options.thresholdBusiness !== undefined && options.thresholdBusiness > 0) {
|
|
204
|
+
thresholds['business'] = options.thresholdBusiness;
|
|
205
|
+
}
|
|
206
|
+
(0, reporting_1.generateMultiFormatReports)([result], formats, reportsDir, thresholds);
|
|
207
|
+
return result;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Analyse how well integration tests exercise defined end-to-end flows.
|
|
211
|
+
*
|
|
212
|
+
* @example
|
|
213
|
+
* const { analyzeIntegrationFlows } = require('api-test-coverage-analyzer');
|
|
214
|
+
* const result = await analyzeIntegrationFlows({ flows: 'integration-flows.yaml', tests: 'tests/**\/*.ts' });
|
|
215
|
+
*/
|
|
216
|
+
async function analyzeIntegrationFlows(options) {
|
|
217
|
+
var _a;
|
|
218
|
+
const flowsPath = path.resolve(options.flows);
|
|
219
|
+
const testsGlob = resolveTestsGlob(options.tests);
|
|
220
|
+
const reportsDir = resolveReportsDir(options);
|
|
221
|
+
const formats = (0, reporting_1.parseFormats)((_a = options.format) !== null && _a !== void 0 ? _a : 'json,html');
|
|
222
|
+
const flows = (0, integrationCoverage_1.parseIntegrationFlows)(flowsPath);
|
|
223
|
+
const coverages = await (0, integrationCoverage_1.analyzeIntegrationCoverage)(flows, testsGlob);
|
|
224
|
+
const report = (0, integrationCoverage_1.buildIntegrationCoverageReport)(coverages);
|
|
225
|
+
(0, integrationCoverage_1.generateIntegrationReports)(report, reportsDir);
|
|
226
|
+
const result = {
|
|
227
|
+
type: 'integration',
|
|
228
|
+
totalItems: report.total,
|
|
229
|
+
coveredItems: report.complete,
|
|
230
|
+
coveragePercent: report.percentage,
|
|
231
|
+
details: report,
|
|
232
|
+
};
|
|
233
|
+
const thresholds = {};
|
|
234
|
+
if (options.thresholdIntegration !== undefined && options.thresholdIntegration > 0) {
|
|
235
|
+
thresholds['integration'] = options.thresholdIntegration;
|
|
236
|
+
}
|
|
237
|
+
(0, reporting_1.generateMultiFormatReports)([result], formats, reportsDir, thresholds);
|
|
238
|
+
return result;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Analyse how thoroughly tests cover error handling and negative scenarios.
|
|
242
|
+
*
|
|
243
|
+
* @example
|
|
244
|
+
* const { analyzeErrorCoverage } = require('api-test-coverage-analyzer');
|
|
245
|
+
* const result = await analyzeErrorCoverage({ spec: 'openapi.yaml', tests: 'tests/**\/*.ts' });
|
|
246
|
+
*/
|
|
247
|
+
async function analyzeErrorHandling(options) {
|
|
248
|
+
var _a;
|
|
249
|
+
const specPath = path.resolve(options.spec);
|
|
250
|
+
const testsGlob = resolveTestsGlob(options.tests);
|
|
251
|
+
const reportsDir = resolveReportsDir(options);
|
|
252
|
+
const formats = (0, reporting_1.parseFormats)((_a = options.format) !== null && _a !== void 0 ? _a : 'json,html');
|
|
253
|
+
const scenarios = await (0, errorCoverage_1.parseErrorScenarios)(specPath);
|
|
254
|
+
const coverages = await (0, errorCoverage_1.analyzeErrorCoverage)(scenarios, testsGlob);
|
|
255
|
+
const report = (0, errorCoverage_1.buildErrorCoverageReport)(coverages);
|
|
256
|
+
(0, errorCoverage_1.generateErrorReports)(report, reportsDir);
|
|
257
|
+
const result = {
|
|
258
|
+
type: 'error',
|
|
259
|
+
totalItems: report.total,
|
|
260
|
+
coveredItems: report.covered,
|
|
261
|
+
coveragePercent: report.percentage,
|
|
262
|
+
details: report,
|
|
263
|
+
};
|
|
264
|
+
const thresholds = {};
|
|
265
|
+
if (options.thresholdError !== undefined && options.thresholdError > 0) {
|
|
266
|
+
thresholds['error'] = options.thresholdError;
|
|
267
|
+
}
|
|
268
|
+
(0, reporting_1.generateMultiFormatReports)([result], formats, reportsDir, thresholds);
|
|
269
|
+
return result;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Analyse how comprehensively tests cover security controls defined in the API spec.
|
|
273
|
+
*
|
|
274
|
+
* @example
|
|
275
|
+
* const { analyzeSecurityCoverage } = require('api-test-coverage-analyzer');
|
|
276
|
+
* const result = await analyzeSecurityCoverage({ spec: 'openapi-security.yaml', tests: 'tests/**\/*.ts' });
|
|
277
|
+
*/
|
|
278
|
+
async function analyzeSecurityControls(options) {
|
|
279
|
+
var _a;
|
|
280
|
+
const specPath = path.resolve(options.spec);
|
|
281
|
+
const testsGlob = resolveTestsGlob(options.tests);
|
|
282
|
+
const scanReportPath = options.scanReport ? path.resolve(options.scanReport) : undefined;
|
|
283
|
+
const reportsDir = resolveReportsDir(options);
|
|
284
|
+
const formats = (0, reporting_1.parseFormats)((_a = options.format) !== null && _a !== void 0 ? _a : 'json,html');
|
|
285
|
+
const controls = await (0, securityCoverage_1.parseSecurityControls)(specPath);
|
|
286
|
+
const coverages = await (0, securityCoverage_1.analyzeSecurityCoverage)(controls, testsGlob, scanReportPath);
|
|
287
|
+
const report = (0, securityCoverage_1.buildSecurityCoverageReport)(coverages, scanReportPath ? coverages.filter((c) => c.coveredByScanReport).length : 0);
|
|
288
|
+
(0, securityCoverage_1.generateSecurityReports)(report, reportsDir);
|
|
289
|
+
const result = {
|
|
290
|
+
type: 'security',
|
|
291
|
+
totalItems: report.total,
|
|
292
|
+
coveredItems: report.covered,
|
|
293
|
+
coveragePercent: report.percentage,
|
|
294
|
+
details: report,
|
|
295
|
+
};
|
|
296
|
+
const thresholds = {};
|
|
297
|
+
if (options.thresholdSecurity !== undefined && options.thresholdSecurity > 0) {
|
|
298
|
+
thresholds['security'] = options.thresholdSecurity;
|
|
299
|
+
}
|
|
300
|
+
(0, reporting_1.generateMultiFormatReports)([result], formats, reportsDir, thresholds);
|
|
301
|
+
return result;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Analyse performance and resilience coverage.
|
|
305
|
+
*
|
|
306
|
+
* @example
|
|
307
|
+
* const { analyzePerfResilience } = require('api-test-coverage-analyzer');
|
|
308
|
+
* const results = await analyzePerfResilience({ spec: 'openapi.yaml', tests: 'tests/**\/*.ts' });
|
|
309
|
+
*/
|
|
310
|
+
async function analyzePerfResilience(options) {
|
|
311
|
+
var _a, _b, _c;
|
|
312
|
+
const specPath = path.resolve(options.spec);
|
|
313
|
+
const testsGlob = resolveTestsGlob(options.tests);
|
|
314
|
+
const reportsDir = resolveReportsDir(options);
|
|
315
|
+
const formats = (0, reporting_1.parseFormats)((_a = options.format) !== null && _a !== void 0 ? _a : 'json,html');
|
|
316
|
+
const perfThresholds = {
|
|
317
|
+
responseMs: (_b = options.thresholdResponseMs) !== null && _b !== void 0 ? _b : 500,
|
|
318
|
+
errorRate: (_c = options.thresholdErrorRate) !== null && _c !== void 0 ? _c : 0.05,
|
|
319
|
+
};
|
|
320
|
+
const endpoints = await (0, perfResilienceCoverage_1.parseEndpointsFromSpec)(specPath);
|
|
321
|
+
const loadResultPaths = options.loadResults
|
|
322
|
+
? options.loadResults.split(',').map((p) => path.resolve(p.trim()))
|
|
323
|
+
: [];
|
|
324
|
+
const metricsMap = loadResultPaths.length > 0 ? (0, perfResilienceCoverage_1.parseLoadTestResults)(loadResultPaths) : new Map();
|
|
325
|
+
const performanceCoverages = (0, perfResilienceCoverage_1.analyzePerformanceCoverage)(endpoints, metricsMap, perfThresholds);
|
|
326
|
+
const scenarios = (0, perfResilienceCoverage_1.buildResilienceScenarios)(endpoints);
|
|
327
|
+
const resilienceCoverages = await (0, perfResilienceCoverage_1.analyzeResilienceCoverage)(scenarios, testsGlob);
|
|
328
|
+
const report = (0, perfResilienceCoverage_1.buildPerfResilienceReport)(performanceCoverages, resilienceCoverages);
|
|
329
|
+
(0, perfResilienceCoverage_1.generatePerfResilienceReports)(report, reportsDir);
|
|
330
|
+
const perfResult = {
|
|
331
|
+
type: 'performance',
|
|
332
|
+
totalItems: report.totalEndpoints,
|
|
333
|
+
coveredItems: report.endpointsWithLoadData,
|
|
334
|
+
coveragePercent: report.performanceCoveragePercent,
|
|
335
|
+
details: report,
|
|
336
|
+
};
|
|
337
|
+
const resilienceResult = {
|
|
338
|
+
type: 'resilience',
|
|
339
|
+
totalItems: report.totalResilienceScenarios,
|
|
340
|
+
coveredItems: report.coveredResilienceScenarios,
|
|
341
|
+
coveragePercent: report.resilienceCoveragePercent,
|
|
342
|
+
details: report,
|
|
343
|
+
};
|
|
344
|
+
const thresholds = {};
|
|
345
|
+
if (options.thresholdPerformance !== undefined && options.thresholdPerformance > 0) {
|
|
346
|
+
thresholds['performance'] = options.thresholdPerformance;
|
|
347
|
+
}
|
|
348
|
+
if (options.thresholdResilience !== undefined && options.thresholdResilience > 0) {
|
|
349
|
+
thresholds['resilience'] = options.thresholdResilience;
|
|
350
|
+
}
|
|
351
|
+
(0, reporting_1.generateMultiFormatReports)([perfResult, resilienceResult], formats, reportsDir, thresholds);
|
|
352
|
+
return [perfResult, resilienceResult];
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Run the integrated security scanning workflow.
|
|
356
|
+
* Executes configured scanners (Semgrep, Trivy, ZAP), normalizes findings,
|
|
357
|
+
* evaluates the security gate, and generates reports.
|
|
358
|
+
*
|
|
359
|
+
* @example
|
|
360
|
+
* const { runSecurityAnalysis } = require('api-test-coverage-analyzer');
|
|
361
|
+
* const summary = await runSecurityAnalysis({
|
|
362
|
+
* config: {
|
|
363
|
+
* enabled: true,
|
|
364
|
+
* workspace: '.',
|
|
365
|
+
* scanners: { trivy: { enabled: true, mode: 'import', reportPath: 'trivy.json' } },
|
|
366
|
+
* gate: { failOnCritical: true, maxSecrets: 0 }
|
|
367
|
+
* }
|
|
368
|
+
* });
|
|
369
|
+
*/
|
|
370
|
+
async function runSecurityAnalysis(options) {
|
|
371
|
+
var _a;
|
|
372
|
+
const reportsDir = path.resolve((_a = options.reportsDir) !== null && _a !== void 0 ? _a : 'reports');
|
|
373
|
+
return (0, index_4.runSecurityScan)(options.config, reportsDir);
|
|
374
|
+
}
|
|
375
|
+
/**
|
|
376
|
+
* Compare two API spec versions and verify consumer contracts.
|
|
377
|
+
*
|
|
378
|
+
* @example
|
|
379
|
+
* const { analyzeCompatibility } = require('api-test-coverage-analyzer');
|
|
380
|
+
* const results = await analyzeCompatibility({ oldSpec: 'v1.yaml', newSpec: 'v2.yaml' });
|
|
381
|
+
*/
|
|
382
|
+
async function analyzeCompatibility(options) {
|
|
383
|
+
const oldSpecPath = path.resolve(options.oldSpec);
|
|
384
|
+
const newSpecPath = path.resolve(options.newSpec);
|
|
385
|
+
const reportsDir = resolveReportsDir(options);
|
|
386
|
+
const oldApi = await (0, compatibilityCoverage_1.loadSpec)(oldSpecPath);
|
|
387
|
+
const newApi = await (0, compatibilityCoverage_1.loadSpec)(newSpecPath);
|
|
388
|
+
const changes = (0, compatibilityCoverage_1.compareSpecs)(oldApi, newApi);
|
|
389
|
+
const breakingChanges = changes.filter((c) => c.breaking);
|
|
390
|
+
const contracts = options.contracts ? await (0, compatibilityCoverage_1.parseContractFiles)(options.contracts) : [];
|
|
391
|
+
const verificationResults = (0, compatibilityCoverage_1.verifyContracts)(contracts, newApi);
|
|
392
|
+
const report = (0, compatibilityCoverage_1.buildCompatibilityReport)(oldApi, newApi, changes, verificationResults, oldSpecPath, newSpecPath);
|
|
393
|
+
(0, compatibilityCoverage_1.generateCompatibilityReports)(report, reportsDir);
|
|
394
|
+
const formats = (0, reporting_1.parseFormats)('json,html');
|
|
395
|
+
const uniqueAffectedEndpoints = new Set(breakingChanges.filter((c) => c.changeType !== 'added').map((c) => `${c.method}:${c.path}`)).size;
|
|
396
|
+
const endpointsUnaffectedByBreakingChanges = report.totalOldEndpoints - uniqueAffectedEndpoints;
|
|
397
|
+
const compatResult = {
|
|
398
|
+
type: 'compatibility',
|
|
399
|
+
totalItems: report.totalOldEndpoints,
|
|
400
|
+
coveredItems: endpointsUnaffectedByBreakingChanges,
|
|
401
|
+
coveragePercent: report.compatibilityPercent,
|
|
402
|
+
details: report,
|
|
403
|
+
};
|
|
404
|
+
const contractResult = {
|
|
405
|
+
type: 'contract-coverage',
|
|
406
|
+
totalItems: report.totalNewEndpoints,
|
|
407
|
+
coveredItems: report.contractCoveredEndpoints,
|
|
408
|
+
coveragePercent: report.contractCoveragePercent,
|
|
409
|
+
details: report,
|
|
410
|
+
};
|
|
411
|
+
const thresholds = {};
|
|
412
|
+
if (options.thresholdCompat !== undefined && options.thresholdCompat > 0) {
|
|
413
|
+
thresholds['compatibility'] = options.thresholdCompat;
|
|
414
|
+
thresholds['contract-coverage'] = options.thresholdCompat;
|
|
415
|
+
}
|
|
416
|
+
(0, reporting_1.generateMultiFormatReports)([compatResult, contractResult], formats, reportsDir, thresholds);
|
|
417
|
+
return [compatResult, contractResult];
|
|
418
|
+
}
|
|
419
|
+
/**
|
|
420
|
+
* Evaluate a quality gate against pre-computed coverage results, generate a
|
|
421
|
+
* publishable build bundle, write the GitHub Actions step summary (if requested),
|
|
422
|
+
* and return the exit code.
|
|
423
|
+
*
|
|
424
|
+
* This is the **canonical entry-point** for consuming teams. They should not
|
|
425
|
+
* need to implement any threshold comparison or exit-code logic themselves.
|
|
426
|
+
*
|
|
427
|
+
* @example
|
|
428
|
+
* const { runAnalysisAndEnforceQualityGate } = require('api-test-coverage-analyzer');
|
|
429
|
+
* const { qualityGate, exitCode } = await runAnalysisAndEnforceQualityGate({
|
|
430
|
+
* results,
|
|
431
|
+
* config: { thresholds: { global: 100 } },
|
|
432
|
+
* });
|
|
433
|
+
* process.exitCode = exitCode;
|
|
434
|
+
*/
|
|
435
|
+
async function runAnalysisAndEnforceQualityGate(options) {
|
|
436
|
+
var _a, _b, _c, _d, _e;
|
|
437
|
+
const { results, config, branch, reportsDir, writeGitHubSummary, pagesUrl } = options;
|
|
438
|
+
// 1. Evaluate quality gate
|
|
439
|
+
const gateConfig = {
|
|
440
|
+
thresholds: config.thresholds,
|
|
441
|
+
thresholdsByBranch: config.thresholdsByBranch,
|
|
442
|
+
qualityGate: config.qualityGate,
|
|
443
|
+
};
|
|
444
|
+
const qualityGate = (0, qualityGate_1.evaluateQualityGate)(results, gateConfig, branch);
|
|
445
|
+
// 2. Generate the publishable build bundle (always – even on failure)
|
|
446
|
+
let reports = null;
|
|
447
|
+
const publishingConfig = (_a = config.publishing) !== null && _a !== void 0 ? _a : {};
|
|
448
|
+
if (publishingConfig.enabled !== false) {
|
|
449
|
+
const thresholds = {
|
|
450
|
+
...((_b = config.thresholds) !== null && _b !== void 0 ? _b : {}),
|
|
451
|
+
};
|
|
452
|
+
reports = (0, publishing_1.generateBuildBundle)(results, qualityGate, publishingConfig, thresholds);
|
|
453
|
+
// Copy report files into the bundle
|
|
454
|
+
if (reportsDir) {
|
|
455
|
+
const artifactsCfg = (_c = publishingConfig.artifacts) !== null && _c !== void 0 ? _c : {};
|
|
456
|
+
(0, publishing_1.copyReportFilesToBundle)(reportsDir, reports.bundleDir, reports.siteDir, artifactsCfg);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
// 3. Print CI summary
|
|
460
|
+
(0, buildSummary_1.printCiSummary)(results, qualityGate);
|
|
461
|
+
// 4. Write GitHub Actions step summary if requested
|
|
462
|
+
if (writeGitHubSummary && reports) {
|
|
463
|
+
const summary = (0, buildSummary_1.generateStepSummary)(results, qualityGate, reports.metadata, pagesUrl);
|
|
464
|
+
(0, buildSummary_1.writeStepSummary)(summary);
|
|
465
|
+
}
|
|
466
|
+
// 5. Generate built-in summary files (always – even on failure)
|
|
467
|
+
const summaryConfig = config.summary;
|
|
468
|
+
const summaryEnabled = (summaryConfig === null || summaryConfig === void 0 ? void 0 : summaryConfig.enabled) !== false;
|
|
469
|
+
if (summaryEnabled && reportsDir) {
|
|
470
|
+
const thresholds = { ...((_d = config.thresholds) !== null && _d !== void 0 ? _d : {}) };
|
|
471
|
+
const summaryInput = {
|
|
472
|
+
results,
|
|
473
|
+
qualityGate,
|
|
474
|
+
thresholds,
|
|
475
|
+
summaryConfig,
|
|
476
|
+
branch,
|
|
477
|
+
pagesUrl,
|
|
478
|
+
};
|
|
479
|
+
await (0, index_5.generateBuildSummary)(summaryInput, reportsDir);
|
|
480
|
+
await (0, index_5.generatePrSummary)(summaryInput, reportsDir);
|
|
481
|
+
}
|
|
482
|
+
// 6. Compute exit code
|
|
483
|
+
const failBuild = ((_e = config.qualityGate) === null || _e === void 0 ? void 0 : _e.failBuildOnThresholdMiss) !== false;
|
|
484
|
+
const exitCode = failBuild && !qualityGate.passed ? 1 : 0;
|
|
485
|
+
return { reports, qualityGate, exitCode };
|
|
486
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP integration – client.
|
|
3
|
+
*
|
|
4
|
+
* Manages transport connections, sends prompts, and returns raw MCP responses.
|
|
5
|
+
* Supports stdio (child-process) and HTTP transports.
|
|
6
|
+
*
|
|
7
|
+
* Security:
|
|
8
|
+
* - Server URLs validated against allowlist before connection.
|
|
9
|
+
* - Transports validated against allowlist.
|
|
10
|
+
* - Payload size validated before sending.
|
|
11
|
+
* - Secrets redacted from all outgoing payloads.
|
|
12
|
+
* - Hard timeout enforced per request.
|
|
13
|
+
*/
|
|
14
|
+
import * as childProcess from 'child_process';
|
|
15
|
+
import type { McpConfig, McpPromptRequest, McpRawResponse } from '../types';
|
|
16
|
+
/** Spawn function type – injectable for testing */
|
|
17
|
+
export type SpawnFn = typeof childProcess.spawn;
|
|
18
|
+
export declare class McpClient {
|
|
19
|
+
private readonly globalConfig;
|
|
20
|
+
private readonly spawnFn;
|
|
21
|
+
/**
|
|
22
|
+
* @param globalConfig MCP configuration block
|
|
23
|
+
* @param spawnFn Optional spawn override (useful in unit tests to avoid
|
|
24
|
+
* spawning real child processes)
|
|
25
|
+
*/
|
|
26
|
+
constructor(globalConfig: McpConfig, spawnFn?: SpawnFn);
|
|
27
|
+
/**
|
|
28
|
+
* Send a prompt to the named MCP server and return the raw response.
|
|
29
|
+
*
|
|
30
|
+
* @param serverName Key in config.servers (e.g. "coverageSummary")
|
|
31
|
+
* @param request Prompt request to send
|
|
32
|
+
*/
|
|
33
|
+
send(serverName: string, request: McpPromptRequest): Promise<McpRawResponse>;
|
|
34
|
+
private sendHttp;
|
|
35
|
+
private sendStdio;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/mcp/client/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,YAAY,MAAM,eAAe,CAAC;AAE9C,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAY5E,mDAAmD;AACnD,MAAM,MAAM,OAAO,GAAG,OAAO,YAAY,CAAC,KAAK,CAAC;AAIhD,qBAAa,SAAS;IASlB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAR/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAElC;;;;OAIG;gBAEgB,YAAY,EAAE,SAAS,EACxC,OAAO,CAAC,EAAE,OAAO;IAKnB;;;;;OAKG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IAiDlF,OAAO,CAAC,QAAQ;IA6EhB,OAAO,CAAC,SAAS;CAwDlB"}
|