api-tests-coverage 1.0.22 → 1.0.24

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 (175) hide show
  1. package/README.md +39 -0
  2. package/config.yaml.example +35 -0
  3. package/dist/dashboard/dist/assets/_basePickBy-BamgEusj.js +1 -0
  4. package/dist/dashboard/dist/assets/_basePickBy-D4Hl8chy.js +1 -0
  5. package/dist/dashboard/dist/assets/_baseUniq-BBhq12Ja.js +1 -0
  6. package/dist/dashboard/dist/assets/_baseUniq-BSUUnV_V.js +1 -0
  7. package/dist/dashboard/dist/assets/arc-Dh-qL1ea.js +1 -0
  8. package/dist/dashboard/dist/assets/arc-DhDluTY5.js +1 -0
  9. package/dist/dashboard/dist/assets/architectureDiagram-VXUJARFQ-BxQ_anmt.js +36 -0
  10. package/dist/dashboard/dist/assets/architectureDiagram-VXUJARFQ-DGlUU7dC.js +36 -0
  11. package/dist/dashboard/dist/assets/blockDiagram-VD42YOAC-CgXi3kEZ.js +122 -0
  12. package/dist/dashboard/dist/assets/blockDiagram-VD42YOAC-Krm3lc7z.js +122 -0
  13. package/dist/dashboard/dist/assets/c4Diagram-YG6GDRKO-Cfd4OeWg.js +10 -0
  14. package/dist/dashboard/dist/assets/c4Diagram-YG6GDRKO-Cr3xB15y.js +10 -0
  15. package/dist/dashboard/dist/assets/channel-DYAie-7m.js +1 -0
  16. package/dist/dashboard/dist/assets/channel-a4t2URTe.js +1 -0
  17. package/dist/dashboard/dist/assets/chunk-4BX2VUAB-BaW3__pI.js +1 -0
  18. package/dist/dashboard/dist/assets/chunk-4BX2VUAB-ljBQ5lHA.js +1 -0
  19. package/dist/dashboard/dist/assets/chunk-55IACEB6-Cikrdc3Q.js +1 -0
  20. package/dist/dashboard/dist/assets/chunk-55IACEB6-DyYevfEQ.js +1 -0
  21. package/dist/dashboard/dist/assets/chunk-B4BG7PRW-C2bwZFec.js +165 -0
  22. package/dist/dashboard/dist/assets/chunk-B4BG7PRW-dtHgbkmj.js +165 -0
  23. package/dist/dashboard/dist/assets/chunk-DI55MBZ5-Cv3hm2Ke.js +220 -0
  24. package/dist/dashboard/dist/assets/chunk-DI55MBZ5-DO0T2xne.js +220 -0
  25. package/dist/dashboard/dist/assets/chunk-FMBD7UC4-CCYA4j_f.js +15 -0
  26. package/dist/dashboard/dist/assets/chunk-FMBD7UC4-Ds1_OqKH.js +15 -0
  27. package/dist/dashboard/dist/assets/chunk-QN33PNHL-B6zkzIAo.js +1 -0
  28. package/dist/dashboard/dist/assets/chunk-QN33PNHL-Cdhqs7xo.js +1 -0
  29. package/dist/dashboard/dist/assets/chunk-QZHKN3VN-BzHw38Ki.js +1 -0
  30. package/dist/dashboard/dist/assets/chunk-QZHKN3VN-C7xuA6tl.js +1 -0
  31. package/dist/dashboard/dist/assets/chunk-TZMSLE5B-D_ea_wdP.js +1 -0
  32. package/dist/dashboard/dist/assets/chunk-TZMSLE5B-dkJ0rsgF.js +1 -0
  33. package/dist/dashboard/dist/assets/classDiagram-2ON5EDUG-B6SxXE6T.js +1 -0
  34. package/dist/dashboard/dist/assets/classDiagram-2ON5EDUG-DiIv5Pho.js +1 -0
  35. package/dist/dashboard/dist/assets/classDiagram-v2-WZHVMYZB-B6SxXE6T.js +1 -0
  36. package/dist/dashboard/dist/assets/classDiagram-v2-WZHVMYZB-DiIv5Pho.js +1 -0
  37. package/dist/dashboard/dist/assets/clone-B4LorrSy.js +1 -0
  38. package/dist/dashboard/dist/assets/clone-kcKg1tUH.js +1 -0
  39. package/dist/dashboard/dist/assets/cose-bilkent-S5V4N54A-DasyAK5c.js +1 -0
  40. package/dist/dashboard/dist/assets/cose-bilkent-S5V4N54A-jzGbyPIS.js +1 -0
  41. package/dist/dashboard/dist/assets/dagre-6UL2VRFP-D7rgvBx1.js +4 -0
  42. package/dist/dashboard/dist/assets/dagre-6UL2VRFP-m-5bs635.js +4 -0
  43. package/dist/dashboard/dist/assets/diagram-PSM6KHXK-2rYklqon.js +24 -0
  44. package/dist/dashboard/dist/assets/diagram-PSM6KHXK-CYFwwEdy.js +24 -0
  45. package/dist/dashboard/dist/assets/diagram-QEK2KX5R-CGrvALqm.js +43 -0
  46. package/dist/dashboard/dist/assets/diagram-QEK2KX5R-m4Fda1GA.js +43 -0
  47. package/dist/dashboard/dist/assets/diagram-S2PKOQOG-BDVk4AKU.js +24 -0
  48. package/dist/dashboard/dist/assets/diagram-S2PKOQOG-DA3c-QP4.js +24 -0
  49. package/dist/dashboard/dist/assets/erDiagram-Q2GNP2WA-3-jAbxQ6.js +60 -0
  50. package/dist/dashboard/dist/assets/erDiagram-Q2GNP2WA-BsYH8cLH.js +60 -0
  51. package/dist/dashboard/dist/assets/flowDiagram-NV44I4VS-Cfv1hkQB.js +162 -0
  52. package/dist/dashboard/dist/assets/flowDiagram-NV44I4VS-Da_JhBCy.js +162 -0
  53. package/dist/dashboard/dist/assets/ganttDiagram-JELNMOA3-B7GZPGck.js +267 -0
  54. package/dist/dashboard/dist/assets/ganttDiagram-JELNMOA3-D8FTswNn.js +267 -0
  55. package/dist/dashboard/dist/assets/gitGraphDiagram-V2S2FVAM-BFJR-ITH.js +65 -0
  56. package/dist/dashboard/dist/assets/gitGraphDiagram-V2S2FVAM-K8X-_4av.js +65 -0
  57. package/dist/dashboard/dist/assets/graph-CIvnjOQQ.js +1 -0
  58. package/dist/dashboard/dist/assets/graph-CfuGK9GG.js +1 -0
  59. package/dist/dashboard/dist/assets/index-BWX0sSZn.css +1 -0
  60. package/dist/dashboard/dist/assets/index-CbAFWEor.js +777 -0
  61. package/dist/dashboard/dist/assets/index-DS-KIxwV.js +777 -0
  62. package/dist/dashboard/dist/assets/infoDiagram-HS3SLOUP-CaIaIUhT.js +2 -0
  63. package/dist/dashboard/dist/assets/infoDiagram-HS3SLOUP-OcK0Lxgi.js +2 -0
  64. package/dist/dashboard/dist/assets/journeyDiagram-XKPGCS4Q-D6dwPswq.js +139 -0
  65. package/dist/dashboard/dist/assets/journeyDiagram-XKPGCS4Q-DTJukVOY.js +139 -0
  66. package/dist/dashboard/dist/assets/kanban-definition-3W4ZIXB7-CERyhhrH.js +89 -0
  67. package/dist/dashboard/dist/assets/kanban-definition-3W4ZIXB7-Di65fNuD.js +89 -0
  68. package/dist/dashboard/dist/assets/layout-DAt24RVX.js +1 -0
  69. package/dist/dashboard/dist/assets/layout-v7cCi3Fl.js +1 -0
  70. package/dist/dashboard/dist/assets/mindmap-definition-VGOIOE7T-BvNtTz8N.js +68 -0
  71. package/dist/dashboard/dist/assets/mindmap-definition-VGOIOE7T-DxI8MXCF.js +68 -0
  72. package/dist/dashboard/dist/assets/pieDiagram-ADFJNKIX-BafKx3_Y.js +30 -0
  73. package/dist/dashboard/dist/assets/pieDiagram-ADFJNKIX-Cjg80C_b.js +30 -0
  74. package/dist/dashboard/dist/assets/quadrantDiagram-AYHSOK5B-BcZsArkk.js +7 -0
  75. package/dist/dashboard/dist/assets/quadrantDiagram-AYHSOK5B-YtFFUYGD.js +7 -0
  76. package/dist/dashboard/dist/assets/requirementDiagram-UZGBJVZJ-CqFAO2t6.js +64 -0
  77. package/dist/dashboard/dist/assets/requirementDiagram-UZGBJVZJ-DLV2LTE5.js +64 -0
  78. package/dist/dashboard/dist/assets/sankeyDiagram-TZEHDZUN-C6_Urrii.js +10 -0
  79. package/dist/dashboard/dist/assets/sankeyDiagram-TZEHDZUN-CqSaCg-3.js +10 -0
  80. package/dist/dashboard/dist/assets/sequenceDiagram-WL72ISMW-6IXD1uqW.js +145 -0
  81. package/dist/dashboard/dist/assets/sequenceDiagram-WL72ISMW-D33UwAtz.js +145 -0
  82. package/dist/dashboard/dist/assets/stateDiagram-FKZM4ZOC-DSp83t9D.js +1 -0
  83. package/dist/dashboard/dist/assets/stateDiagram-FKZM4ZOC-DvSVQAfp.js +1 -0
  84. package/dist/dashboard/dist/assets/stateDiagram-v2-4FDKWEC3-BMFdt0QQ.js +1 -0
  85. package/dist/dashboard/dist/assets/stateDiagram-v2-4FDKWEC3-OTWrEpQO.js +1 -0
  86. package/dist/dashboard/dist/assets/timeline-definition-IT6M3QCI-Cll7Nvth.js +61 -0
  87. package/dist/dashboard/dist/assets/timeline-definition-IT6M3QCI-D5Bb3Jj7.js +61 -0
  88. package/dist/dashboard/dist/assets/treemap-GDKQZRPO-CKbkkwye.js +162 -0
  89. package/dist/dashboard/dist/assets/treemap-GDKQZRPO-DtqX8zNC.js +162 -0
  90. package/dist/dashboard/dist/assets/xychartDiagram-PRI3JC2R-C_Tlzchx.js +7 -0
  91. package/dist/dashboard/dist/assets/xychartDiagram-PRI3JC2R-zxwS9i0A.js +7 -0
  92. package/dist/dashboard/dist/index.html +2 -2
  93. package/dist/dashboard/dist/reports/coverage-summary.json +75 -1
  94. package/dist/dashboard/dist/reports/security-full.json +157 -0
  95. package/dist/src/compatibilityCoverage.d.ts +34 -15
  96. package/dist/src/compatibilityCoverage.d.ts.map +1 -1
  97. package/dist/src/compatibilityCoverage.js +387 -85
  98. package/dist/src/config/defaultConfig.d.ts.map +1 -1
  99. package/dist/src/config/defaultConfig.js +62 -0
  100. package/dist/src/config/schema.d.ts.map +1 -1
  101. package/dist/src/config/schema.js +1 -1
  102. package/dist/src/config/types.d.ts +81 -1
  103. package/dist/src/config/types.d.ts.map +1 -1
  104. package/dist/src/config/validateConfig.d.ts.map +1 -1
  105. package/dist/src/config/validateConfig.js +126 -0
  106. package/dist/src/contracts/compatibilityMatrix.d.ts +20 -0
  107. package/dist/src/contracts/compatibilityMatrix.d.ts.map +1 -0
  108. package/dist/src/contracts/compatibilityMatrix.js +198 -0
  109. package/dist/src/contracts/pactBrokerClient.d.ts +10 -0
  110. package/dist/src/contracts/pactBrokerClient.d.ts.map +1 -0
  111. package/dist/src/contracts/pactBrokerClient.js +117 -0
  112. package/dist/src/contracts/schemaEvolutionChecker.d.ts +17 -0
  113. package/dist/src/contracts/schemaEvolutionChecker.d.ts.map +1 -0
  114. package/dist/src/contracts/schemaEvolutionChecker.js +95 -0
  115. package/dist/src/contracts/springCloudContractParser.d.ts +10 -0
  116. package/dist/src/contracts/springCloudContractParser.d.ts.map +1 -0
  117. package/dist/src/contracts/springCloudContractParser.js +144 -0
  118. package/dist/src/discovery/fileClassifier.d.ts.map +1 -1
  119. package/dist/src/discovery/fileClassifier.js +25 -0
  120. package/dist/src/discovery/projectDiscovery.d.ts +2 -0
  121. package/dist/src/discovery/projectDiscovery.d.ts.map +1 -1
  122. package/dist/src/discovery/projectDiscovery.js +25 -25
  123. package/dist/src/index.js +233 -16
  124. package/dist/src/inference/routeInference.d.ts +10 -2
  125. package/dist/src/inference/routeInference.d.ts.map +1 -1
  126. package/dist/src/inference/routeInference.js +363 -62
  127. package/dist/src/languageDetection.d.ts.map +1 -1
  128. package/dist/src/languageDetection.js +21 -4
  129. package/dist/src/lib/index.d.ts +3 -0
  130. package/dist/src/lib/index.d.ts.map +1 -1
  131. package/dist/src/lib/index.js +3 -1
  132. package/dist/src/pipeline/stages/tia/parameterizedTestExpander.js +152 -79
  133. package/dist/src/pipeline/stages/tia/testEndpointMapper.d.ts +5 -1
  134. package/dist/src/pipeline/stages/tia/testEndpointMapper.d.ts.map +1 -1
  135. package/dist/src/pipeline/stages/tia/testEndpointMapper.js +356 -42
  136. package/dist/src/pipeline/stages/tia/testLayerClassifier.d.ts.map +1 -1
  137. package/dist/src/pipeline/stages/tia/testLayerClassifier.js +20 -5
  138. package/dist/src/pipeline/stages/tia/tiaStage.d.ts.map +1 -1
  139. package/dist/src/pipeline/stages/tia/tiaStage.js +3 -1
  140. package/dist/src/pipeline/stages/tia/types.d.ts +11 -2
  141. package/dist/src/pipeline/stages/tia/types.d.ts.map +1 -1
  142. package/dist/src/projectDefaults.d.ts +6 -0
  143. package/dist/src/projectDefaults.d.ts.map +1 -0
  144. package/dist/src/projectDefaults.js +43 -0
  145. package/dist/src/security/hub.d.ts +81 -0
  146. package/dist/src/security/hub.d.ts.map +1 -0
  147. package/dist/src/security/hub.js +420 -0
  148. package/dist/src/security/index.d.ts +1 -0
  149. package/dist/src/security/index.d.ts.map +1 -1
  150. package/dist/src/security/index.js +8 -2
  151. package/dist/src/security/normalizers/gitleaks.d.ts +7 -0
  152. package/dist/src/security/normalizers/gitleaks.d.ts.map +1 -0
  153. package/dist/src/security/normalizers/gitleaks.js +32 -0
  154. package/dist/src/security/scanners/gitleaks.d.ts +3 -0
  155. package/dist/src/security/scanners/gitleaks.d.ts.map +1 -0
  156. package/dist/src/security/scanners/gitleaks.js +105 -0
  157. package/dist/src/security/scanners/semgrep.d.ts.map +1 -1
  158. package/dist/src/security/scanners/semgrep.js +24 -2
  159. package/dist/src/security/scanners/trivy.d.ts.map +1 -1
  160. package/dist/src/security/scanners/trivy.js +24 -2
  161. package/dist/src/security/scanners/zap.d.ts.map +1 -1
  162. package/dist/src/security/scanners/zap.js +27 -2
  163. package/dist/src/security/types.d.ts +15 -1
  164. package/dist/src/security/types.d.ts.map +1 -1
  165. package/dist/src/streaming/schema/index.d.ts +23 -0
  166. package/dist/src/streaming/schema/index.d.ts.map +1 -0
  167. package/dist/src/streaming/schema/index.js +196 -0
  168. package/dist/src/summary/markdownRenderer.d.ts.map +1 -1
  169. package/dist/src/summary/markdownRenderer.js +15 -1
  170. package/dist/src/summary/summaryTypes.d.ts.map +1 -1
  171. package/dist/src/summary/summaryTypes.js +1 -0
  172. package/dist/src/unitAnalysis.d.ts +145 -0
  173. package/dist/src/unitAnalysis.d.ts.map +1 -0
  174. package/dist/src/unitAnalysis.js +1392 -0
  175. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"defaultConfig.d.ts","sourceRoot":"","sources":["../../../src/config/defaultConfig.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAO9C,eAAO,MAAM,cAAc,EAAE,cA+F5B,CAAC"}
1
+ {"version":3,"file":"defaultConfig.d.ts","sourceRoot":"","sources":["../../../src/config/defaultConfig.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAY9C,eAAO,MAAM,cAAc,EAAE,cA+J5B,CAAC"}
@@ -8,10 +8,19 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.DEFAULT_CONFIG = void 0;
10
10
  const schema_1 = require("./schema");
11
+ const projectDefaults_1 = require("../projectDefaults");
11
12
  exports.DEFAULT_CONFIG = {
12
13
  version: 1,
13
14
  project: {
14
15
  name: undefined,
16
+ structure: 'mono',
17
+ testModules: [],
18
+ generatedSourceDirs: [...projectDefaults_1.DEFAULT_GENERATED_SOURCE_DIRS],
19
+ openApiFirst: {
20
+ enabled: true,
21
+ generatedInterfaceSuffixes: [...projectDefaults_1.DEFAULT_OPENAPI_INTERFACE_SUFFIXES],
22
+ excludeFromEndpoints: [...projectDefaults_1.DEFAULT_OPENAPI_EXCLUDE_SUFFIXES],
23
+ },
15
24
  },
16
25
  analysis: {
17
26
  defaultMode: 'full',
@@ -94,4 +103,57 @@ exports.DEFAULT_CONFIG = {
94
103
  collapsedByDefault: true,
95
104
  },
96
105
  },
106
+ contracts: {
107
+ pactBroker: {
108
+ enabled: false,
109
+ url: '${PACT_BROKER_URL}',
110
+ token: '${PACT_BROKER_TOKEN}',
111
+ providerName: 'payment-service',
112
+ publishResults: true,
113
+ },
114
+ schemaRegistry: {
115
+ enabled: false,
116
+ url: '${SCHEMA_REGISTRY_URL}',
117
+ apiKey: '${SCHEMA_REGISTRY_API_KEY}',
118
+ },
119
+ },
120
+ security: {
121
+ pipeline: {
122
+ trivyReport: 'reports/trivy.json',
123
+ semgrepReport: 'reports/semgrep.json',
124
+ gitleaksReport: 'reports/gitleaks.json',
125
+ zapReport: 'reports/zap.json',
126
+ },
127
+ autoLoadReports: true,
128
+ },
129
+ unitAnalysis: {
130
+ enabled: true,
131
+ codeCoverage: {
132
+ enabled: true,
133
+ autoDiscover: true,
134
+ thresholds: {
135
+ line: 80,
136
+ branch: 70,
137
+ method: 80,
138
+ },
139
+ },
140
+ mutationTesting: {
141
+ enabled: false,
142
+ tool: 'auto',
143
+ threshold: 70,
144
+ scope: 'changed-files',
145
+ },
146
+ smellDetection: {
147
+ enabled: true,
148
+ failOn: 'CRITICAL',
149
+ },
150
+ slowTestThreshold: {
151
+ unit: 200,
152
+ integration: 5000,
153
+ },
154
+ independenceCheck: {
155
+ enabled: true,
156
+ minScore: 80,
157
+ },
158
+ },
97
159
  };
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,oBAAoB,EAAE,YAAY,EAS9C,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,mBAAmB,EAAgC,CAAC;AAE1F,eAAO,MAAM,wBAAwB,EAAE,gBAAgB,EAKtD,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,YAAY,EAAiD,CAAC;AAEjG,eAAO,MAAM,wBAAwB,EAAE,eAAe,EAAuB,CAAC;AAE9E,eAAO,MAAM,oBAAoB,6BAA8B,CAAC;AAEhE,eAAO,MAAM,kBAAkB,cAAe,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/config/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,oBAAoB,EAAE,YAAY,EAS9C,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,mBAAmB,EAA4C,CAAC;AAEtG,eAAO,MAAM,wBAAwB,EAAE,gBAAgB,EAKtD,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,YAAY,EAAiD,CAAC;AAEjG,eAAO,MAAM,wBAAwB,EAAE,eAAe,EAAuB,CAAC;AAE9E,eAAO,MAAM,oBAAoB,6BAA8B,CAAC;AAEhE,eAAO,MAAM,kBAAkB,cAAe,CAAC"}
@@ -17,7 +17,7 @@ exports.VALID_COVERAGE_TYPES = [
17
17
  'performance',
18
18
  'compatibility',
19
19
  ];
20
- exports.VALID_SECURITY_SCANNERS = ['semgrep', 'trivy', 'zap'];
20
+ exports.VALID_SECURITY_SCANNERS = ['semgrep', 'trivy', 'zap', 'gitleaks'];
21
21
  exports.VALID_INTELLIGENCE_TYPES = [
22
22
  'ai-summary',
23
23
  'risk-prioritization',
@@ -10,6 +10,18 @@ export type { McpConfig } from '../mcp/types';
10
10
  export interface ProjectConfig {
11
11
  /** Display name used in summaries and reports */
12
12
  name?: string;
13
+ /** High-level repository structure hint */
14
+ structure?: 'mono' | 'multi-module' | 'monorepo';
15
+ /** Additional test modules to scan in multi-module projects */
16
+ testModules?: string[];
17
+ /** Generated source directories that should be included in source discovery */
18
+ generatedSourceDirs?: string[];
19
+ /** OpenAPI-first interface/controller resolution settings */
20
+ openApiFirst?: {
21
+ enabled?: boolean;
22
+ generatedInterfaceSuffixes?: string[];
23
+ excludeFromEndpoints?: string[];
24
+ };
13
25
  }
14
26
  export interface AstLanguageConfig {
15
27
  /** When false, skip AST analysis for this language and use regex fallback */
@@ -66,7 +78,17 @@ export interface AnalysisConfig {
66
78
  inferIntegrationFlows?: boolean;
67
79
  }
68
80
  export type CoverageType = 'endpoint' | 'parameter' | 'business' | 'integration' | 'error' | 'security' | 'performance' | 'compatibility';
69
- export type SecurityScannerType = 'semgrep' | 'trivy' | 'zap';
81
+ export type SecurityScannerType = 'semgrep' | 'trivy' | 'zap' | 'gitleaks';
82
+ export interface SecurityPipelineConfig {
83
+ trivyReport?: string;
84
+ semgrepReport?: string;
85
+ gitleaksReport?: string;
86
+ zapReport?: string;
87
+ }
88
+ export interface SecurityConfig {
89
+ pipeline?: SecurityPipelineConfig;
90
+ autoLoadReports?: boolean;
91
+ }
70
92
  export type IntelligenceType = 'ai-summary' | 'risk-prioritization' | 'recommendations' | 'scanner-interpretation';
71
93
  export type ReportFormat = 'json' | 'html' | 'csv' | 'junit' | 'markdown';
72
94
  /**
@@ -159,6 +181,61 @@ export interface AiSummaryConfig {
159
181
  export interface DashboardConfig {
160
182
  aiSummary?: AiSummaryConfig;
161
183
  }
184
+ export interface PactBrokerSettings {
185
+ enabled?: boolean;
186
+ url?: string;
187
+ token?: string;
188
+ providerName?: string;
189
+ publishResults?: boolean;
190
+ }
191
+ export interface SchemaRegistrySettings {
192
+ enabled?: boolean;
193
+ url?: string;
194
+ apiKey?: string;
195
+ }
196
+ export interface ContractsConfig {
197
+ pactBroker?: PactBrokerSettings;
198
+ schemaRegistry?: SchemaRegistrySettings;
199
+ }
200
+ export type UnitMutationTool = 'auto' | 'pitest' | 'stryker' | 'mutmut' | 'go-mutesting' | 'dotnet-stryker';
201
+ export type UnitMutationScope = 'all' | 'changed-files' | 'module';
202
+ export type UnitSmellFailOn = 'CRITICAL' | 'HIGH' | 'none';
203
+ export interface UnitCodeCoverageThresholds {
204
+ line?: number;
205
+ branch?: number;
206
+ method?: number;
207
+ }
208
+ export interface UnitCodeCoverageConfig {
209
+ enabled?: boolean;
210
+ autoDiscover?: boolean;
211
+ thresholds?: UnitCodeCoverageThresholds;
212
+ }
213
+ export interface UnitMutationTestingConfig {
214
+ enabled?: boolean;
215
+ tool?: UnitMutationTool;
216
+ threshold?: number;
217
+ scope?: UnitMutationScope;
218
+ }
219
+ export interface UnitSmellDetectionConfig {
220
+ enabled?: boolean;
221
+ failOn?: UnitSmellFailOn;
222
+ }
223
+ export interface UnitSlowTestThresholdConfig {
224
+ unit?: number;
225
+ integration?: number;
226
+ }
227
+ export interface UnitIndependenceCheckConfig {
228
+ enabled?: boolean;
229
+ minScore?: number;
230
+ }
231
+ export interface UnitAnalysisConfig {
232
+ enabled?: boolean;
233
+ codeCoverage?: UnitCodeCoverageConfig;
234
+ mutationTesting?: UnitMutationTestingConfig;
235
+ smellDetection?: UnitSmellDetectionConfig;
236
+ slowTestThreshold?: UnitSlowTestThresholdConfig;
237
+ independenceCheck?: UnitIndependenceCheckConfig;
238
+ }
162
239
  export interface AnalyzerConfig {
163
240
  /** Config schema version; must be 1 for this release */
164
241
  version: number;
@@ -171,5 +248,8 @@ export interface AnalyzerConfig {
171
248
  reports: ReportsConfig;
172
249
  publishing: PublishingConfig;
173
250
  dashboard: DashboardConfig;
251
+ contracts: ContractsConfig;
252
+ security: SecurityConfig;
253
+ unitAnalysis: UnitAnalysisConfig;
174
254
  }
175
255
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validateConfig.d.ts","sourceRoot":"","sources":["../../../src/config/validateConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAyC9C;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAmLxF"}
1
+ {"version":3,"file":"validateConfig.d.ts","sourceRoot":"","sources":["../../../src/config/validateConfig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA4C9C;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CA2ZxF"}
@@ -24,6 +24,9 @@ const KNOWN_TOP_LEVEL_KEYS = new Set([
24
24
  'reports',
25
25
  'publishing',
26
26
  'dashboard',
27
+ 'contracts',
28
+ 'security',
29
+ 'unitAnalysis',
27
30
  ]);
28
31
  // ─── Error helpers ────────────────────────────────────────────────────────────
29
32
  function configError(field, received, expected, example) {
@@ -57,6 +60,32 @@ function validateConfig(raw, strictMode = false) {
57
60
  }
58
61
  }
59
62
  // ── analysis ───────────────────────────────────────────────────────────────
63
+ if ('project' in obj && obj['project'] !== null && obj['project'] !== undefined) {
64
+ const project = obj['project'];
65
+ if ('structure' in project &&
66
+ !['mono', 'multi-module', 'monorepo'].includes(project['structure'])) {
67
+ throw configError('project.structure', project['structure'], 'one of: mono, multi-module, monorepo', 'project:\n structure: multi-module');
68
+ }
69
+ for (const listKey of ['testModules', 'generatedSourceDirs']) {
70
+ const value = project[listKey];
71
+ if (value !== undefined && (!Array.isArray(value) || value.some((item) => typeof item !== 'string'))) {
72
+ throw configError(`project.${listKey}`, value, 'an array of strings', `project:\n ${listKey}:\n - sample-module`);
73
+ }
74
+ }
75
+ if ('openApiFirst' in project && project['openApiFirst'] !== null && project['openApiFirst'] !== undefined) {
76
+ const openApiFirst = project['openApiFirst'];
77
+ if ('enabled' in openApiFirst && typeof openApiFirst['enabled'] !== 'boolean') {
78
+ throw configError('project.openApiFirst.enabled', openApiFirst['enabled'], 'a boolean', 'project:\n openApiFirst:\n enabled: true');
79
+ }
80
+ for (const listKey of ['generatedInterfaceSuffixes', 'excludeFromEndpoints']) {
81
+ const value = openApiFirst[listKey];
82
+ if (value !== undefined && (!Array.isArray(value) || value.some((item) => typeof item !== 'string'))) {
83
+ throw configError(`project.openApiFirst.${listKey}`, value, 'an array of strings', `project:\n openApiFirst:\n ${listKey}:\n - Api`);
84
+ }
85
+ }
86
+ }
87
+ }
88
+ // ── analysis ───────────────────────────────────────────────────────────────
60
89
  if ('analysis' in obj && obj['analysis'] !== null && obj['analysis'] !== undefined) {
61
90
  const analysis = obj['analysis'];
62
91
  if ('defaultMode' in analysis) {
@@ -130,6 +159,16 @@ function validateConfig(raw, strictMode = false) {
130
159
  }
131
160
  }
132
161
  }
162
+ // ── contracts ──────────────────────────────────────────────────────────────
163
+ if ('contracts' in obj && obj['contracts'] !== null && obj['contracts'] !== undefined) {
164
+ const contracts = obj['contracts'];
165
+ for (const sectionName of ['pactBroker', 'schemaRegistry']) {
166
+ const section = contracts[sectionName];
167
+ if (section !== undefined && section !== null && typeof section !== 'object') {
168
+ throw configError(`contracts.${sectionName}`, section, 'a mapping/object', `contracts:\n ${sectionName}:\n enabled: false`);
169
+ }
170
+ }
171
+ }
133
172
  // ── mcp server validation ──────────────────────────────────────────────────
134
173
  if ('mcp' in obj && obj['mcp'] !== null && obj['mcp'] !== undefined) {
135
174
  const mcp = obj['mcp'];
@@ -155,6 +194,93 @@ function validateConfig(raw, strictMode = false) {
155
194
  }
156
195
  }
157
196
  }
197
+ // ── security pipeline ──────────────────────────────────────────────────────
198
+ if ('security' in obj && obj['security'] !== null && obj['security'] !== undefined) {
199
+ const security = obj['security'];
200
+ if ('autoLoadReports' in security && typeof security['autoLoadReports'] !== 'boolean') {
201
+ throw configError('security.autoLoadReports', security['autoLoadReports'], 'a boolean', 'security:\n autoLoadReports: true');
202
+ }
203
+ if ('pipeline' in security && security['pipeline'] !== null && security['pipeline'] !== undefined) {
204
+ const pipeline = security['pipeline'];
205
+ for (const [key, value] of Object.entries(pipeline)) {
206
+ if (value !== undefined && value !== null && typeof value !== 'string') {
207
+ throw configError(`security.pipeline.${key}`, value, 'a string file path', `security:\n pipeline:\n ${key}: reports/${key.replace('Report', '')}.json`);
208
+ }
209
+ }
210
+ }
211
+ }
212
+ // ── unitAnalysis ───────────────────────────────────────────────────────────
213
+ if ('unitAnalysis' in obj && obj['unitAnalysis'] !== null && obj['unitAnalysis'] !== undefined) {
214
+ const unitAnalysis = obj['unitAnalysis'];
215
+ for (const booleanKey of ['enabled']) {
216
+ if (booleanKey in unitAnalysis && typeof unitAnalysis[booleanKey] !== 'boolean') {
217
+ throw configError(`unitAnalysis.${booleanKey}`, unitAnalysis[booleanKey], 'a boolean', `unitAnalysis:\n ${booleanKey}: true`);
218
+ }
219
+ }
220
+ if ('codeCoverage' in unitAnalysis && unitAnalysis['codeCoverage'] !== null && unitAnalysis['codeCoverage'] !== undefined) {
221
+ const codeCoverage = unitAnalysis['codeCoverage'];
222
+ for (const booleanKey of ['enabled', 'autoDiscover']) {
223
+ if (booleanKey in codeCoverage && typeof codeCoverage[booleanKey] !== 'boolean') {
224
+ throw configError(`unitAnalysis.codeCoverage.${booleanKey}`, codeCoverage[booleanKey], 'a boolean', `unitAnalysis:\n codeCoverage:\n ${booleanKey}: true`);
225
+ }
226
+ }
227
+ if ('thresholds' in codeCoverage && codeCoverage['thresholds'] !== null && codeCoverage['thresholds'] !== undefined) {
228
+ const thresholds = codeCoverage['thresholds'];
229
+ for (const [key, value] of Object.entries(thresholds)) {
230
+ if (typeof value !== 'number' || value < 0 || value > 100) {
231
+ throw configError(`unitAnalysis.codeCoverage.thresholds.${key}`, value, 'a number between 0 and 100 (inclusive)', `unitAnalysis:\n codeCoverage:\n thresholds:\n ${key}: 80`);
232
+ }
233
+ }
234
+ }
235
+ }
236
+ if ('mutationTesting' in unitAnalysis && unitAnalysis['mutationTesting'] !== null && unitAnalysis['mutationTesting'] !== undefined) {
237
+ const mutationTesting = unitAnalysis['mutationTesting'];
238
+ if ('enabled' in mutationTesting && typeof mutationTesting['enabled'] !== 'boolean') {
239
+ throw configError('unitAnalysis.mutationTesting.enabled', mutationTesting['enabled'], 'a boolean', 'unitAnalysis:\n mutationTesting:\n enabled: false');
240
+ }
241
+ if ('tool' in mutationTesting && !['auto', 'pitest', 'stryker', 'mutmut', 'go-mutesting', 'dotnet-stryker'].includes(String(mutationTesting['tool']))) {
242
+ throw configError('unitAnalysis.mutationTesting.tool', mutationTesting['tool'], 'one of: auto, pitest, stryker, mutmut, go-mutesting, dotnet-stryker', 'unitAnalysis:\n mutationTesting:\n tool: auto');
243
+ }
244
+ if ('scope' in mutationTesting && !['all', 'changed-files', 'module'].includes(String(mutationTesting['scope']))) {
245
+ throw configError('unitAnalysis.mutationTesting.scope', mutationTesting['scope'], 'one of: all, changed-files, module', 'unitAnalysis:\n mutationTesting:\n scope: changed-files');
246
+ }
247
+ if ('threshold' in mutationTesting) {
248
+ const threshold = mutationTesting['threshold'];
249
+ if (typeof threshold !== 'number' || threshold < 0 || threshold > 100) {
250
+ throw configError('unitAnalysis.mutationTesting.threshold', threshold, 'a number between 0 and 100 (inclusive)', 'unitAnalysis:\n mutationTesting:\n threshold: 70');
251
+ }
252
+ }
253
+ }
254
+ if ('smellDetection' in unitAnalysis && unitAnalysis['smellDetection'] !== null && unitAnalysis['smellDetection'] !== undefined) {
255
+ const smellDetection = unitAnalysis['smellDetection'];
256
+ if ('enabled' in smellDetection && typeof smellDetection['enabled'] !== 'boolean') {
257
+ throw configError('unitAnalysis.smellDetection.enabled', smellDetection['enabled'], 'a boolean', 'unitAnalysis:\n smellDetection:\n enabled: true');
258
+ }
259
+ if ('failOn' in smellDetection && !['CRITICAL', 'HIGH', 'none'].includes(String(smellDetection['failOn']))) {
260
+ throw configError('unitAnalysis.smellDetection.failOn', smellDetection['failOn'], 'one of: CRITICAL, HIGH, none', 'unitAnalysis:\n smellDetection:\n failOn: CRITICAL');
261
+ }
262
+ }
263
+ if ('slowTestThreshold' in unitAnalysis && unitAnalysis['slowTestThreshold'] !== null && unitAnalysis['slowTestThreshold'] !== undefined) {
264
+ const slowThreshold = unitAnalysis['slowTestThreshold'];
265
+ for (const [key, value] of Object.entries(slowThreshold)) {
266
+ if (typeof value !== 'number' || value < 0) {
267
+ throw configError(`unitAnalysis.slowTestThreshold.${key}`, value, 'a non-negative number of milliseconds', `unitAnalysis:\n slowTestThreshold:\n ${key}: 200`);
268
+ }
269
+ }
270
+ }
271
+ if ('independenceCheck' in unitAnalysis && unitAnalysis['independenceCheck'] !== null && unitAnalysis['independenceCheck'] !== undefined) {
272
+ const independenceCheck = unitAnalysis['independenceCheck'];
273
+ if ('enabled' in independenceCheck && typeof independenceCheck['enabled'] !== 'boolean') {
274
+ throw configError('unitAnalysis.independenceCheck.enabled', independenceCheck['enabled'], 'a boolean', 'unitAnalysis:\n independenceCheck:\n enabled: true');
275
+ }
276
+ if ('minScore' in independenceCheck) {
277
+ const minScore = independenceCheck['minScore'];
278
+ if (typeof minScore !== 'number' || minScore < 0 || minScore > 100) {
279
+ throw configError('unitAnalysis.independenceCheck.minScore', minScore, 'a number between 0 and 100 (inclusive)', 'unitAnalysis:\n independenceCheck:\n minScore: 80');
280
+ }
281
+ }
282
+ }
283
+ }
158
284
  // ── unknown top-level keys ─────────────────────────────────────────────────
159
285
  for (const key of Object.keys(obj)) {
160
286
  if (!KNOWN_TOP_LEVEL_KEYS.has(key)) {
@@ -0,0 +1,20 @@
1
+ import type { ConsumerContract, EndpointChange } from '../compatibilityCoverage';
2
+ import type { SpringCloudContract } from './springCloudContractParser';
3
+ export type ConsumerImpact = 'BREAKING' | 'DANGEROUS' | 'SAFE' | 'NOT_USED' | 'UNKNOWN';
4
+ export interface CompatibilityMatrix {
5
+ providerName: string;
6
+ consumers: string[];
7
+ changes: EndpointChange[];
8
+ matrix: Array<{
9
+ consumerName: string;
10
+ change: EndpointChange;
11
+ impact: ConsumerImpact;
12
+ evidence: string;
13
+ }>;
14
+ breakingConsumers: string[];
15
+ safeToDeployFor: string[];
16
+ canDeploy: boolean;
17
+ }
18
+ export declare function buildCompatibilityMatrix(changes: EndpointChange[], contracts: ConsumerContract[], springContracts: SpringCloudContract[], providerName?: string): CompatibilityMatrix;
19
+ export declare function writeCompatibilityMatrixReports(matrix: CompatibilityMatrix, reportsDir: string): void;
20
+ //# sourceMappingURL=compatibilityMatrix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibilityMatrix.d.ts","sourceRoot":"","sources":["../../../src/contracts/compatibilityMatrix.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAGvE,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAExF,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,EAAE,KAAK,CAAC;QACZ,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,cAAc,CAAC;QACvB,MAAM,EAAE,cAAc,CAAC;QACvB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;CACpB;AAsFD,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,cAAc,EAAE,EACzB,SAAS,EAAE,gBAAgB,EAAE,EAC7B,eAAe,EAAE,mBAAmB,EAAE,EACtC,YAAY,SAA+C,GAC1D,mBAAmB,CAyCrB;AAWD,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAwDrG"}
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.buildCompatibilityMatrix = buildCompatibilityMatrix;
37
+ exports.writeCompatibilityMatrixReports = writeCompatibilityMatrixReports;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const springCloudContractParser_1 = require("./springCloudContractParser");
41
+ function normaliseContractPath(contractPath) {
42
+ return contractPath.replace(/:([^/]+)/g, '{$1}');
43
+ }
44
+ function endpointKey(method, routePath) {
45
+ return `${method.toLowerCase()}:${normaliseContractPath(routePath)}`;
46
+ }
47
+ function pathMatches(contractPath, specPath) {
48
+ const normalised = normaliseContractPath(contractPath);
49
+ if (normalised === specPath)
50
+ return true;
51
+ const regexStr = '^' + specPath.replace(/\{[^}]+\}/g, '[^/]+') + '$';
52
+ return new RegExp(regexStr).test(contractPath);
53
+ }
54
+ function usesChange(usage, change) {
55
+ return [...usage.endpoints].some((entry) => {
56
+ const [method, routePath] = entry.split(':', 2);
57
+ return method === change.method.toLowerCase() && pathMatches(routePath, change.path);
58
+ });
59
+ }
60
+ function mapSeverityToImpact(change) {
61
+ switch (change.severity) {
62
+ case 'BREAKING':
63
+ return 'BREAKING';
64
+ case 'DANGEROUS':
65
+ return 'DANGEROUS';
66
+ case 'SAFE':
67
+ case 'INFO':
68
+ return 'SAFE';
69
+ default:
70
+ return 'UNKNOWN';
71
+ }
72
+ }
73
+ function createUsageMap(contracts, springContracts, changes) {
74
+ var _a;
75
+ const usageMap = new Map();
76
+ const ensureUsage = (name) => {
77
+ const existing = usageMap.get(name);
78
+ if (existing)
79
+ return existing;
80
+ const created = { name, evidence: [], endpoints: new Set(), hasContractData: false };
81
+ usageMap.set(name, created);
82
+ return created;
83
+ };
84
+ for (const contract of contracts) {
85
+ const usage = ensureUsage(contract.consumer);
86
+ usage.hasContractData = true;
87
+ usage.evidence.push(path.basename(contract.filePath));
88
+ for (const interaction of contract.interactions) {
89
+ usage.endpoints.add(endpointKey(interaction.method, interaction.path));
90
+ }
91
+ }
92
+ for (const springContract of springContracts) {
93
+ const consumer = (0, springCloudContractParser_1.inferSpringConsumerName)(springContract.filePath);
94
+ const usage = ensureUsage(consumer);
95
+ usage.hasContractData = true;
96
+ usage.evidence.push(path.basename(springContract.filePath));
97
+ usage.endpoints.add(endpointKey(springContract.interaction.method, springContract.interaction.path));
98
+ }
99
+ for (const change of changes) {
100
+ for (const consumer of (_a = change.affectedConsumers) !== null && _a !== void 0 ? _a : []) {
101
+ ensureUsage(consumer);
102
+ }
103
+ }
104
+ return usageMap;
105
+ }
106
+ function buildCompatibilityMatrix(changes, contracts, springContracts, providerName) {
107
+ var _a, _b;
108
+ if (providerName === void 0) { providerName = (_b = (_a = contracts[0]) === null || _a === void 0 ? void 0 : _a.provider) !== null && _b !== void 0 ? _b : 'unknown-provider'; }
109
+ const usageMap = createUsageMap(contracts, springContracts, changes);
110
+ const consumers = [...usageMap.keys()].sort((a, b) => a.localeCompare(b));
111
+ const matrix = consumers.flatMap((consumerName) => {
112
+ const usage = usageMap.get(consumerName);
113
+ return changes.map((change) => {
114
+ const used = usesChange(usage, change);
115
+ const impact = !usage.hasContractData
116
+ ? 'UNKNOWN'
117
+ : used
118
+ ? mapSeverityToImpact(change)
119
+ : 'NOT_USED';
120
+ const evidence = !usage.hasContractData
121
+ ? 'No contract data available for this consumer.'
122
+ : used
123
+ ? `Matched contract evidence: ${usage.evidence.join(', ')}`
124
+ : 'No matching interaction for this endpoint in consumer contracts.';
125
+ return { consumerName, change, impact, evidence };
126
+ });
127
+ });
128
+ const breakingConsumers = consumers.filter((consumerName) => matrix.some((entry) => entry.consumerName === consumerName && entry.impact === 'BREAKING'));
129
+ const safeToDeployFor = consumers.filter((consumerName) => matrix
130
+ .filter((entry) => entry.consumerName === consumerName)
131
+ .every((entry) => entry.impact === 'SAFE' || entry.impact === 'NOT_USED'));
132
+ const canDeploy = matrix.every((entry) => entry.impact !== 'BREAKING' && entry.impact !== 'UNKNOWN');
133
+ return {
134
+ providerName,
135
+ consumers,
136
+ changes,
137
+ matrix,
138
+ breakingConsumers,
139
+ safeToDeployFor,
140
+ canDeploy,
141
+ };
142
+ }
143
+ function escapeHtml(value) {
144
+ return value
145
+ .replace(/&/g, '&amp;')
146
+ .replace(/</g, '&lt;')
147
+ .replace(/>/g, '&gt;')
148
+ .replace(/"/g, '&quot;')
149
+ .replace(/'/g, '&#39;');
150
+ }
151
+ function writeCompatibilityMatrixReports(matrix, reportsDir) {
152
+ if (!fs.existsSync(reportsDir)) {
153
+ fs.mkdirSync(reportsDir, { recursive: true });
154
+ }
155
+ fs.writeFileSync(path.join(reportsDir, 'compatibility-matrix.json'), JSON.stringify(matrix, null, 2), 'utf-8');
156
+ const headers = matrix.changes
157
+ .map((change) => `<th>${escapeHtml(change.method.toUpperCase())} ${escapeHtml(change.path)}</th>`)
158
+ .join('');
159
+ const rows = matrix.consumers
160
+ .map((consumer) => {
161
+ const cells = matrix.changes
162
+ .map((change) => {
163
+ var _a, _b;
164
+ const entry = matrix.matrix.find((item) => item.consumerName === consumer && item.change.method === change.method && item.change.path === change.path && item.change.changeType === change.changeType);
165
+ const impact = (_a = entry === null || entry === void 0 ? void 0 : entry.impact) !== null && _a !== void 0 ? _a : 'UNKNOWN';
166
+ return `<td title="${escapeHtml((_b = entry === null || entry === void 0 ? void 0 : entry.evidence) !== null && _b !== void 0 ? _b : '')}">${escapeHtml(impact)}</td>`;
167
+ })
168
+ .join('');
169
+ return `<tr><th>${escapeHtml(consumer)}</th>${cells}</tr>`;
170
+ })
171
+ .join('\n');
172
+ const html = `<!DOCTYPE html>
173
+ <html lang="en">
174
+ <head>
175
+ <meta charset="UTF-8" />
176
+ <title>Compatibility Matrix</title>
177
+ <style>
178
+ body { font-family: sans-serif; padding: 24px; }
179
+ table { border-collapse: collapse; width: 100%; }
180
+ th, td { border: 1px solid #d1d5db; padding: 8px; text-align: left; }
181
+ th { background: #f3f4f6; }
182
+ </style>
183
+ </head>
184
+ <body>
185
+ <h1>Compatibility Matrix</h1>
186
+ <p>Can Deploy: ${matrix.canDeploy ? 'YES' : 'NO'}</p>
187
+ <table>
188
+ <thead>
189
+ <tr><th>Consumer</th>${headers}</tr>
190
+ </thead>
191
+ <tbody>
192
+ ${rows}
193
+ </tbody>
194
+ </table>
195
+ </body>
196
+ </html>`;
197
+ fs.writeFileSync(path.join(reportsDir, 'compatibility-matrix.html'), html, 'utf-8');
198
+ }
@@ -0,0 +1,10 @@
1
+ import type { ConsumerContract, ContractVerificationResult } from '../compatibilityCoverage';
2
+ export interface PactBrokerConfig {
3
+ url: string;
4
+ token?: string;
5
+ providerName: string;
6
+ publishResults?: boolean;
7
+ }
8
+ export declare function fetchContractsFromBroker(config: PactBrokerConfig): Promise<ConsumerContract[]>;
9
+ export declare function publishVerificationResults(config: PactBrokerConfig, results: ContractVerificationResult[]): Promise<void>;
10
+ //# sourceMappingURL=pactBrokerClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pactBrokerClient.d.ts","sourceRoot":"","sources":["../../../src/contracts/pactBrokerClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,0BAA0B,EAAuB,MAAM,0BAA0B,CAAC;AAElH,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA6DD,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAyBpG;AAED,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,0BAA0B,EAAE,GACpC,OAAO,CAAC,IAAI,CAAC,CA+Bf"}