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.
Files changed (288) hide show
  1. package/README.md +703 -0
  2. package/config.yaml.example +227 -0
  3. package/dist/action/src/index.d.ts +2 -0
  4. package/dist/action/src/index.d.ts.map +1 -0
  5. package/dist/action/src/index.js +349 -0
  6. package/dist/action/src/prComment.d.ts +34 -0
  7. package/dist/action/src/prComment.d.ts.map +1 -0
  8. package/dist/action/src/prComment.js +146 -0
  9. package/dist/src/ast/astAnalysisOrchestrator.d.ts +36 -0
  10. package/dist/src/ast/astAnalysisOrchestrator.d.ts.map +1 -0
  11. package/dist/src/ast/astAnalysisOrchestrator.js +123 -0
  12. package/dist/src/ast/astTypes.d.ts +105 -0
  13. package/dist/src/ast/astTypes.d.ts.map +1 -0
  14. package/dist/src/ast/astTypes.js +9 -0
  15. package/dist/src/ast/languageAnalyzer.d.ts +46 -0
  16. package/dist/src/ast/languageAnalyzer.d.ts.map +1 -0
  17. package/dist/src/ast/languageAnalyzer.js +9 -0
  18. package/dist/src/ast/languageCapabilities.d.ts +24 -0
  19. package/dist/src/ast/languageCapabilities.d.ts.map +1 -0
  20. package/dist/src/ast/languageCapabilities.js +92 -0
  21. package/dist/src/ast/parseFile.d.ts +16 -0
  22. package/dist/src/ast/parseFile.d.ts.map +1 -0
  23. package/dist/src/ast/parseFile.js +65 -0
  24. package/dist/src/ast/parserRegistry.d.ts +39 -0
  25. package/dist/src/ast/parserRegistry.d.ts.map +1 -0
  26. package/dist/src/ast/parserRegistry.js +66 -0
  27. package/dist/src/buildSummary.d.ts +26 -0
  28. package/dist/src/buildSummary.d.ts.map +1 -0
  29. package/dist/src/buildSummary.js +193 -0
  30. package/dist/src/businessCoverage.d.ts +68 -0
  31. package/dist/src/businessCoverage.d.ts.map +1 -0
  32. package/dist/src/businessCoverage.js +290 -0
  33. package/dist/src/compatibilityCoverage.d.ts +83 -0
  34. package/dist/src/compatibilityCoverage.d.ts.map +1 -0
  35. package/dist/src/compatibilityCoverage.js +501 -0
  36. package/dist/src/config/defaultConfig.d.ts +9 -0
  37. package/dist/src/config/defaultConfig.d.ts.map +1 -0
  38. package/dist/src/config/defaultConfig.js +97 -0
  39. package/dist/src/config/index.d.ts +12 -0
  40. package/dist/src/config/index.d.ts.map +1 -0
  41. package/dist/src/config/index.js +37 -0
  42. package/dist/src/config/loadConfig.d.ts +29 -0
  43. package/dist/src/config/loadConfig.d.ts.map +1 -0
  44. package/dist/src/config/loadConfig.js +135 -0
  45. package/dist/src/config/mergeConfig.d.ts +15 -0
  46. package/dist/src/config/mergeConfig.d.ts.map +1 -0
  47. package/dist/src/config/mergeConfig.js +57 -0
  48. package/dist/src/config/schema.d.ts +15 -0
  49. package/dist/src/config/schema.d.ts.map +1 -0
  50. package/dist/src/config/schema.js +30 -0
  51. package/dist/src/config/types.d.ts +175 -0
  52. package/dist/src/config/types.d.ts.map +1 -0
  53. package/dist/src/config/types.js +9 -0
  54. package/dist/src/config/validateConfig.d.ts +22 -0
  55. package/dist/src/config/validateConfig.d.ts.map +1 -0
  56. package/dist/src/config/validateConfig.js +171 -0
  57. package/dist/src/config.d.ts +168 -0
  58. package/dist/src/config.d.ts.map +1 -0
  59. package/dist/src/config.js +204 -0
  60. package/dist/src/coverage/deep-analysis/callGraph.d.ts +67 -0
  61. package/dist/src/coverage/deep-analysis/callGraph.d.ts.map +1 -0
  62. package/dist/src/coverage/deep-analysis/callGraph.js +275 -0
  63. package/dist/src/coverage/deep-analysis/deepEndpointResolver.d.ts +23 -0
  64. package/dist/src/coverage/deep-analysis/deepEndpointResolver.d.ts.map +1 -0
  65. package/dist/src/coverage/deep-analysis/deepEndpointResolver.js +394 -0
  66. package/dist/src/coverage/deep-analysis/index.d.ts +17 -0
  67. package/dist/src/coverage/deep-analysis/index.d.ts.map +1 -0
  68. package/dist/src/coverage/deep-analysis/index.js +63 -0
  69. package/dist/src/coverage/deep-analysis/resolveAssertions.d.ts +60 -0
  70. package/dist/src/coverage/deep-analysis/resolveAssertions.d.ts.map +1 -0
  71. package/dist/src/coverage/deep-analysis/resolveAssertions.js +121 -0
  72. package/dist/src/coverage/deep-analysis/resolveConstants.d.ts +36 -0
  73. package/dist/src/coverage/deep-analysis/resolveConstants.d.ts.map +1 -0
  74. package/dist/src/coverage/deep-analysis/resolveConstants.js +92 -0
  75. package/dist/src/coverage/deep-analysis/resolveEnums.d.ts +55 -0
  76. package/dist/src/coverage/deep-analysis/resolveEnums.d.ts.map +1 -0
  77. package/dist/src/coverage/deep-analysis/resolveEnums.js +152 -0
  78. package/dist/src/coverage/deep-analysis/resolveMethodChains.d.ts +70 -0
  79. package/dist/src/coverage/deep-analysis/resolveMethodChains.d.ts.map +1 -0
  80. package/dist/src/coverage/deep-analysis/resolveMethodChains.js +152 -0
  81. package/dist/src/coverage/deep-analysis/resolvePaths.d.ts +80 -0
  82. package/dist/src/coverage/deep-analysis/resolvePaths.d.ts.map +1 -0
  83. package/dist/src/coverage/deep-analysis/resolvePaths.js +216 -0
  84. package/dist/src/coverage/deep-analysis/resolveRequestWrappers.d.ts +71 -0
  85. package/dist/src/coverage/deep-analysis/resolveRequestWrappers.d.ts.map +1 -0
  86. package/dist/src/coverage/deep-analysis/resolveRequestWrappers.js +226 -0
  87. package/dist/src/coverage/deep-analysis/symbolTable.d.ts +58 -0
  88. package/dist/src/coverage/deep-analysis/symbolTable.d.ts.map +1 -0
  89. package/dist/src/coverage/deep-analysis/symbolTable.js +230 -0
  90. package/dist/src/coverage/deep-analysis/types.d.ts +122 -0
  91. package/dist/src/coverage/deep-analysis/types.d.ts.map +1 -0
  92. package/dist/src/coverage/deep-analysis/types.js +21 -0
  93. package/dist/src/discovery/fileClassifier.d.ts +50 -0
  94. package/dist/src/discovery/fileClassifier.d.ts.map +1 -0
  95. package/dist/src/discovery/fileClassifier.js +238 -0
  96. package/dist/src/discovery/projectDiscovery.d.ts +66 -0
  97. package/dist/src/discovery/projectDiscovery.d.ts.map +1 -0
  98. package/dist/src/discovery/projectDiscovery.js +287 -0
  99. package/dist/src/endpointCoverage.d.ts +70 -0
  100. package/dist/src/endpointCoverage.d.ts.map +1 -0
  101. package/dist/src/endpointCoverage.js +381 -0
  102. package/dist/src/errorCoverage.d.ts +93 -0
  103. package/dist/src/errorCoverage.d.ts.map +1 -0
  104. package/dist/src/errorCoverage.js +698 -0
  105. package/dist/src/index.d.ts +3 -0
  106. package/dist/src/index.d.ts.map +1 -0
  107. package/dist/src/index.js +1441 -0
  108. package/dist/src/inference/businessRuleInference.d.ts +63 -0
  109. package/dist/src/inference/businessRuleInference.d.ts.map +1 -0
  110. package/dist/src/inference/businessRuleInference.js +268 -0
  111. package/dist/src/inference/integrationFlowInference.d.ts +56 -0
  112. package/dist/src/inference/integrationFlowInference.d.ts.map +1 -0
  113. package/dist/src/inference/integrationFlowInference.js +266 -0
  114. package/dist/src/integrationCoverage.d.ts +72 -0
  115. package/dist/src/integrationCoverage.d.ts.map +1 -0
  116. package/dist/src/integrationCoverage.js +317 -0
  117. package/dist/src/intelligence/index.d.ts +20 -0
  118. package/dist/src/intelligence/index.d.ts.map +1 -0
  119. package/dist/src/intelligence/index.js +105 -0
  120. package/dist/src/intelligence/linkageEngine.d.ts +20 -0
  121. package/dist/src/intelligence/linkageEngine.d.ts.map +1 -0
  122. package/dist/src/intelligence/linkageEngine.js +522 -0
  123. package/dist/src/intelligence/markdownReporter.d.ts +12 -0
  124. package/dist/src/intelligence/markdownReporter.d.ts.map +1 -0
  125. package/dist/src/intelligence/markdownReporter.js +265 -0
  126. package/dist/src/intelligence/riskScoring.d.ts +53 -0
  127. package/dist/src/intelligence/riskScoring.d.ts.map +1 -0
  128. package/dist/src/intelligence/riskScoring.js +181 -0
  129. package/dist/src/intelligence/types.d.ts +121 -0
  130. package/dist/src/intelligence/types.d.ts.map +1 -0
  131. package/dist/src/intelligence/types.js +8 -0
  132. package/dist/src/languageDetection.d.ts +100 -0
  133. package/dist/src/languageDetection.d.ts.map +1 -0
  134. package/dist/src/languageDetection.js +349 -0
  135. package/dist/src/languages/java/index.d.ts +16 -0
  136. package/dist/src/languages/java/index.d.ts.map +1 -0
  137. package/dist/src/languages/java/index.js +103 -0
  138. package/dist/src/languages/java/parser.d.ts +7 -0
  139. package/dist/src/languages/java/parser.d.ts.map +1 -0
  140. package/dist/src/languages/java/parser.js +50 -0
  141. package/dist/src/languages/java/semanticBuilder.d.ts +21 -0
  142. package/dist/src/languages/java/semanticBuilder.d.ts.map +1 -0
  143. package/dist/src/languages/java/semanticBuilder.js +358 -0
  144. package/dist/src/languages/javascript/annotationExtractor.d.ts +20 -0
  145. package/dist/src/languages/javascript/annotationExtractor.d.ts.map +1 -0
  146. package/dist/src/languages/javascript/annotationExtractor.js +94 -0
  147. package/dist/src/languages/javascript/assertionResolver.d.ts +18 -0
  148. package/dist/src/languages/javascript/assertionResolver.d.ts.map +1 -0
  149. package/dist/src/languages/javascript/assertionResolver.js +150 -0
  150. package/dist/src/languages/javascript/callResolver.d.ts +23 -0
  151. package/dist/src/languages/javascript/callResolver.d.ts.map +1 -0
  152. package/dist/src/languages/javascript/callResolver.js +236 -0
  153. package/dist/src/languages/javascript/httpInteractionExtractor.d.ts +23 -0
  154. package/dist/src/languages/javascript/httpInteractionExtractor.d.ts.map +1 -0
  155. package/dist/src/languages/javascript/httpInteractionExtractor.js +205 -0
  156. package/dist/src/languages/javascript/index.d.ts +20 -0
  157. package/dist/src/languages/javascript/index.d.ts.map +1 -0
  158. package/dist/src/languages/javascript/index.js +136 -0
  159. package/dist/src/languages/javascript/parser.d.ts +14 -0
  160. package/dist/src/languages/javascript/parser.d.ts.map +1 -0
  161. package/dist/src/languages/javascript/parser.js +38 -0
  162. package/dist/src/languages/javascript/symbolResolver.d.ts +31 -0
  163. package/dist/src/languages/javascript/symbolResolver.d.ts.map +1 -0
  164. package/dist/src/languages/javascript/symbolResolver.js +183 -0
  165. package/dist/src/languages/kotlin/index.d.ts +16 -0
  166. package/dist/src/languages/kotlin/index.d.ts.map +1 -0
  167. package/dist/src/languages/kotlin/index.js +151 -0
  168. package/dist/src/languages/kotlin/parser.d.ts +11 -0
  169. package/dist/src/languages/kotlin/parser.d.ts.map +1 -0
  170. package/dist/src/languages/kotlin/parser.js +74 -0
  171. package/dist/src/languages/python/index.d.ts +15 -0
  172. package/dist/src/languages/python/index.d.ts.map +1 -0
  173. package/dist/src/languages/python/index.js +293 -0
  174. package/dist/src/languages/ruby/index.d.ts +15 -0
  175. package/dist/src/languages/ruby/index.d.ts.map +1 -0
  176. package/dist/src/languages/ruby/index.js +274 -0
  177. package/dist/src/languages/shared/treeSitterUtils.d.ts +43 -0
  178. package/dist/src/languages/shared/treeSitterUtils.d.ts.map +1 -0
  179. package/dist/src/languages/shared/treeSitterUtils.js +100 -0
  180. package/dist/src/languages/typescript/index.d.ts +14 -0
  181. package/dist/src/languages/typescript/index.d.ts.map +1 -0
  182. package/dist/src/languages/typescript/index.js +25 -0
  183. package/dist/src/lib/index.d.ts +228 -0
  184. package/dist/src/lib/index.d.ts.map +1 -0
  185. package/dist/src/lib/index.js +486 -0
  186. package/dist/src/mcp/client/index.d.ts +37 -0
  187. package/dist/src/mcp/client/index.d.ts.map +1 -0
  188. package/dist/src/mcp/client/index.js +235 -0
  189. package/dist/src/mcp/config.d.ts +50 -0
  190. package/dist/src/mcp/config.d.ts.map +1 -0
  191. package/dist/src/mcp/config.js +125 -0
  192. package/dist/src/mcp/events.d.ts +24 -0
  193. package/dist/src/mcp/events.d.ts.map +1 -0
  194. package/dist/src/mcp/events.js +48 -0
  195. package/dist/src/mcp/fallback/index.d.ts +50 -0
  196. package/dist/src/mcp/fallback/index.d.ts.map +1 -0
  197. package/dist/src/mcp/fallback/index.js +216 -0
  198. package/dist/src/mcp/index.d.ts +67 -0
  199. package/dist/src/mcp/index.d.ts.map +1 -0
  200. package/dist/src/mcp/index.js +212 -0
  201. package/dist/src/mcp/normalizer.d.ts +21 -0
  202. package/dist/src/mcp/normalizer.d.ts.map +1 -0
  203. package/dist/src/mcp/normalizer.js +99 -0
  204. package/dist/src/mcp/prompts/index.d.ts +86 -0
  205. package/dist/src/mcp/prompts/index.d.ts.map +1 -0
  206. package/dist/src/mcp/prompts/index.js +304 -0
  207. package/dist/src/mcp/templates/index.d.ts +35 -0
  208. package/dist/src/mcp/templates/index.d.ts.map +1 -0
  209. package/dist/src/mcp/templates/index.js +143 -0
  210. package/dist/src/mcp/testing/mock-server/index.d.ts +47 -0
  211. package/dist/src/mcp/testing/mock-server/index.d.ts.map +1 -0
  212. package/dist/src/mcp/testing/mock-server/index.js +157 -0
  213. package/dist/src/mcp/types.d.ts +127 -0
  214. package/dist/src/mcp/types.d.ts.map +1 -0
  215. package/dist/src/mcp/types.js +8 -0
  216. package/dist/src/observability.d.ts +138 -0
  217. package/dist/src/observability.d.ts.map +1 -0
  218. package/dist/src/observability.js +519 -0
  219. package/dist/src/parameterCoverage.d.ts +75 -0
  220. package/dist/src/parameterCoverage.d.ts.map +1 -0
  221. package/dist/src/parameterCoverage.js +629 -0
  222. package/dist/src/perfResilienceCoverage.d.ts +155 -0
  223. package/dist/src/perfResilienceCoverage.d.ts.map +1 -0
  224. package/dist/src/perfResilienceCoverage.js +670 -0
  225. package/dist/src/pluginLoader.d.ts +51 -0
  226. package/dist/src/pluginLoader.d.ts.map +1 -0
  227. package/dist/src/pluginLoader.js +72 -0
  228. package/dist/src/publishing.d.ts +63 -0
  229. package/dist/src/publishing.d.ts.map +1 -0
  230. package/dist/src/publishing.js +379 -0
  231. package/dist/src/qualityGate.d.ts +58 -0
  232. package/dist/src/qualityGate.d.ts.map +1 -0
  233. package/dist/src/qualityGate.js +118 -0
  234. package/dist/src/reporting.d.ts +41 -0
  235. package/dist/src/reporting.d.ts.map +1 -0
  236. package/dist/src/reporting.js +278 -0
  237. package/dist/src/screenshots.d.ts +71 -0
  238. package/dist/src/screenshots.d.ts.map +1 -0
  239. package/dist/src/screenshots.js +141 -0
  240. package/dist/src/security/gate/index.d.ts +11 -0
  241. package/dist/src/security/gate/index.d.ts.map +1 -0
  242. package/dist/src/security/gate/index.js +65 -0
  243. package/dist/src/security/index.d.ts +30 -0
  244. package/dist/src/security/index.d.ts.map +1 -0
  245. package/dist/src/security/index.js +342 -0
  246. package/dist/src/security/normalizers/semgrep.d.ts +10 -0
  247. package/dist/src/security/normalizers/semgrep.d.ts.map +1 -0
  248. package/dist/src/security/normalizers/semgrep.js +104 -0
  249. package/dist/src/security/normalizers/trivy.d.ts +10 -0
  250. package/dist/src/security/normalizers/trivy.d.ts.map +1 -0
  251. package/dist/src/security/normalizers/trivy.js +78 -0
  252. package/dist/src/security/normalizers/zap.d.ts +10 -0
  253. package/dist/src/security/normalizers/zap.d.ts.map +1 -0
  254. package/dist/src/security/normalizers/zap.js +104 -0
  255. package/dist/src/security/scanners/semgrep.d.ts +6 -0
  256. package/dist/src/security/scanners/semgrep.d.ts.map +1 -0
  257. package/dist/src/security/scanners/semgrep.js +125 -0
  258. package/dist/src/security/scanners/trivy.d.ts +6 -0
  259. package/dist/src/security/scanners/trivy.d.ts.map +1 -0
  260. package/dist/src/security/scanners/trivy.js +115 -0
  261. package/dist/src/security/scanners/zap.d.ts +6 -0
  262. package/dist/src/security/scanners/zap.d.ts.map +1 -0
  263. package/dist/src/security/scanners/zap.js +135 -0
  264. package/dist/src/security/types.d.ts +146 -0
  265. package/dist/src/security/types.d.ts.map +1 -0
  266. package/dist/src/security/types.js +6 -0
  267. package/dist/src/securityCoverage.d.ts +116 -0
  268. package/dist/src/securityCoverage.d.ts.map +1 -0
  269. package/dist/src/securityCoverage.js +725 -0
  270. package/dist/src/summary/buildSummary.d.ts +28 -0
  271. package/dist/src/summary/buildSummary.d.ts.map +1 -0
  272. package/dist/src/summary/buildSummary.js +257 -0
  273. package/dist/src/summary/evaluateMetrics.d.ts +31 -0
  274. package/dist/src/summary/evaluateMetrics.d.ts.map +1 -0
  275. package/dist/src/summary/evaluateMetrics.js +118 -0
  276. package/dist/src/summary/index.d.ts +10 -0
  277. package/dist/src/summary/index.d.ts.map +1 -0
  278. package/dist/src/summary/index.js +22 -0
  279. package/dist/src/summary/markdownRenderer.d.ts +139 -0
  280. package/dist/src/summary/markdownRenderer.d.ts.map +1 -0
  281. package/dist/src/summary/markdownRenderer.js +459 -0
  282. package/dist/src/summary/prSummary.d.ts +24 -0
  283. package/dist/src/summary/prSummary.d.ts.map +1 -0
  284. package/dist/src/summary/prSummary.js +233 -0
  285. package/dist/src/summary/summaryTypes.d.ts +35 -0
  286. package/dist/src/summary/summaryTypes.d.ts.map +1 -0
  287. package/dist/src/summary/summaryTypes.js +27 -0
  288. package/package.json +84 -0
@@ -0,0 +1,519 @@
1
+ "use strict";
2
+ /**
3
+ * Observability module — structured logging, Prometheus metrics, and OpenTelemetry tracing.
4
+ *
5
+ * Usage:
6
+ * import { createLogger, initMetrics, startMetricsServer, recordCoverageMetrics,
7
+ * recordSecurityScanMetrics, initTracing, startSpan, endSpan } from './observability';
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ var __importDefault = (this && this.__importDefault) || function (mod) {
43
+ return (mod && mod.__esModule) ? mod : { "default": mod };
44
+ };
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.createLogger = createLogger;
47
+ exports.initLogger = initLogger;
48
+ exports.getLogger = getLogger;
49
+ exports.logCoverageResult = logCoverageResult;
50
+ exports.logThresholdBreach = logThresholdBreach;
51
+ exports.initMetrics = initMetrics;
52
+ exports.getRegistry = getRegistry;
53
+ exports.recordCoverageMetrics = recordCoverageMetrics;
54
+ exports.recordSecurityScanMetrics = recordSecurityScanMetrics;
55
+ exports.recordIntelligenceMetrics = recordIntelligenceMetrics;
56
+ exports.startMetricsServer = startMetricsServer;
57
+ exports.stopMetricsServer = stopMetricsServer;
58
+ exports.initTracing = initTracing;
59
+ exports.startSpan = startSpan;
60
+ exports.getCollectedSpans = getCollectedSpans;
61
+ exports.clearCollectedSpans = clearCollectedSpans;
62
+ exports.buildObservabilityInfo = buildObservabilityInfo;
63
+ const http = __importStar(require("http"));
64
+ const pino_1 = __importDefault(require("pino"));
65
+ const prom_client_1 = require("prom-client");
66
+ /** Create a pino logger at the specified level (defaults to 'info'). */
67
+ function createLogger(level = 'info') {
68
+ return (0, pino_1.default)({
69
+ level,
70
+ timestamp: pino_1.default.stdTimeFunctions.isoTime,
71
+ formatters: {
72
+ level(label) {
73
+ return { level: label };
74
+ },
75
+ },
76
+ });
77
+ }
78
+ /** Shared module-level logger instance — replaced by initLogger(). */
79
+ let _logger = createLogger('info');
80
+ /** Initialise (or replace) the module-level logger. */
81
+ function initLogger(level) {
82
+ _logger = createLogger(level);
83
+ }
84
+ /** Return the current module-level logger. */
85
+ function getLogger() {
86
+ return _logger;
87
+ }
88
+ /** Log a coverage result at INFO level with structured fields. */
89
+ function logCoverageResult(logger, result, threshold) {
90
+ const status = threshold !== undefined
91
+ ? result.coveragePercent >= threshold
92
+ ? 'pass'
93
+ : 'fail'
94
+ : 'unchecked';
95
+ logger.info({
96
+ coverageType: result.type,
97
+ totalItems: result.totalItems,
98
+ coveredItems: result.coveredItems,
99
+ coveragePercent: result.coveragePercent,
100
+ threshold,
101
+ status,
102
+ message: `Coverage result for ${result.type}: ${result.coveragePercent}% (${result.coveredItems}/${result.totalItems})`,
103
+ });
104
+ }
105
+ /** Log a threshold breach at WARN level. */
106
+ function logThresholdBreach(logger, coverageType, coveragePercent, threshold) {
107
+ const gap = (threshold - coveragePercent).toFixed(2);
108
+ logger.warn({
109
+ event: 'threshold_breach',
110
+ coverageType,
111
+ coveragePercent,
112
+ threshold,
113
+ gap: parseFloat(gap),
114
+ message: `Threshold breach: ${coverageType} coverage ${coveragePercent}% is below threshold ${threshold}% (gap: ${gap}%)`,
115
+ });
116
+ }
117
+ // ─── Prometheus metrics ───────────────────────────────────────────────────────
118
+ /** Per-run Prometheus registry — recreated each run to avoid stale data. */
119
+ let _registry = null;
120
+ /** Gauges populated after each analysis run. */
121
+ let _gauges = null;
122
+ /** Gauges for the security scanning layer. */
123
+ let _securityGauges = null;
124
+ /** Gauges for the coverage intelligence layer. */
125
+ let _intelligenceGauges = null;
126
+ /** Metrics HTTP server (set when --metrics-port is active). */
127
+ let _metricsServer = null;
128
+ /**
129
+ * Initialise a fresh Prometheus registry and register the coverage gauges.
130
+ * Call once before recording metrics.
131
+ */
132
+ function initMetrics(serviceName = 'api-coverage-analyzer') {
133
+ _registry = new prom_client_1.Registry();
134
+ // Optional: collect default Node.js process metrics
135
+ (0, prom_client_1.collectDefaultMetrics)({ register: _registry, prefix: 'nodejs_' });
136
+ _gauges = {
137
+ total: new prom_client_1.Gauge({
138
+ name: 'api_coverage_total',
139
+ help: 'Total number of items analysed for this coverage type',
140
+ labelNames: ['service', 'coverage_type'],
141
+ registers: [_registry],
142
+ }),
143
+ covered: new prom_client_1.Gauge({
144
+ name: 'api_coverage_covered',
145
+ help: 'Number of covered items for this coverage type',
146
+ labelNames: ['service', 'coverage_type'],
147
+ registers: [_registry],
148
+ }),
149
+ ratio: new prom_client_1.Gauge({
150
+ name: 'api_coverage_ratio',
151
+ help: 'Coverage ratio (0–1) for this coverage type',
152
+ labelNames: ['service', 'coverage_type'],
153
+ registers: [_registry],
154
+ }),
155
+ thresholdFailure: new prom_client_1.Gauge({
156
+ name: 'api_coverage_threshold_failure',
157
+ help: '1 if coverage is below the configured threshold, 0 otherwise',
158
+ labelNames: ['service', 'coverage_type'],
159
+ registers: [_registry],
160
+ }),
161
+ };
162
+ _securityGauges = {
163
+ findings: new prom_client_1.Gauge({
164
+ name: 'api_security_findings_total',
165
+ help: 'Number of security scan findings labeled by severity, category and scanner',
166
+ labelNames: ['service', 'severity', 'category', 'scanner'],
167
+ registers: [_registry],
168
+ }),
169
+ gatePassed: new prom_client_1.Gauge({
170
+ name: 'api_security_gate_passed',
171
+ help: '1 if the security gate passed on the last scan, 0 if it failed, -1 if not configured',
172
+ labelNames: ['service'],
173
+ registers: [_registry],
174
+ }),
175
+ scanTimestamp: new prom_client_1.Gauge({
176
+ name: 'api_security_scan_timestamp_seconds',
177
+ help: 'Unix timestamp (seconds) of the last security scan run',
178
+ labelNames: ['service'],
179
+ registers: [_registry],
180
+ }),
181
+ };
182
+ // Store service name for use in recordCoverageMetrics
183
+ _registry._serviceName = serviceName;
184
+ _intelligenceGauges = {
185
+ functionalFindingsTotal: new prom_client_1.Gauge({
186
+ name: 'api_coverage_functional_findings_total',
187
+ help: 'Total number of functional findings detected by the intelligence engine',
188
+ labelNames: ['project', 'coverage_type', 'language', 'framework'],
189
+ registers: [_registry],
190
+ }),
191
+ missingTestRecommendationsTotal: new prom_client_1.Gauge({
192
+ name: 'api_coverage_missing_test_recommendations_total',
193
+ help: 'Total number of missing test recommendations',
194
+ labelNames: ['project', 'coverage_type', 'language', 'framework'],
195
+ registers: [_registry],
196
+ }),
197
+ missingTestByPriority: new prom_client_1.Gauge({
198
+ name: 'api_coverage_missing_test_recommendations_by_priority',
199
+ help: 'Missing test recommendations grouped by priority',
200
+ labelNames: ['project', 'priority', 'risk_band'],
201
+ registers: [_registry],
202
+ }),
203
+ riskScoreMax: new prom_client_1.Gauge({
204
+ name: 'api_coverage_risk_score_max',
205
+ help: 'Maximum risk score across all recommendations',
206
+ labelNames: ['project'],
207
+ registers: [_registry],
208
+ }),
209
+ riskScoreAvg: new prom_client_1.Gauge({
210
+ name: 'api_coverage_risk_score_avg',
211
+ help: 'Average risk score across all recommendations',
212
+ labelNames: ['project'],
213
+ registers: [_registry],
214
+ }),
215
+ criticalUncoveredItems: new prom_client_1.Gauge({
216
+ name: 'api_coverage_critical_uncovered_items_total',
217
+ help: 'Total number of critical/high severity uncovered items',
218
+ labelNames: ['project'],
219
+ registers: [_registry],
220
+ }),
221
+ unprotectedSecurityFindings: new prom_client_1.Gauge({
222
+ name: 'api_coverage_unprotected_security_findings_total',
223
+ help: 'Number of security findings with no associated test protection',
224
+ labelNames: ['project'],
225
+ registers: [_registry],
226
+ }),
227
+ };
228
+ return _registry;
229
+ }
230
+ /** Return the current registry (null if not yet initialised). */
231
+ function getRegistry() {
232
+ return _registry;
233
+ }
234
+ /**
235
+ * Record coverage results into the Prometheus gauges.
236
+ * Must be called after initMetrics().
237
+ */
238
+ function recordCoverageMetrics(results, thresholds = {}, serviceName = 'api-coverage-analyzer') {
239
+ if (!_gauges || !_registry)
240
+ return;
241
+ for (const r of results) {
242
+ const labels = { service: serviceName, coverage_type: r.type };
243
+ const ratio = r.totalItems > 0 ? r.coveredItems / r.totalItems : 0;
244
+ const threshold = thresholds[r.type];
245
+ const failing = threshold !== undefined && r.coveragePercent < threshold ? 1 : 0;
246
+ _gauges.total.set(labels, r.totalItems);
247
+ _gauges.covered.set(labels, r.coveredItems);
248
+ _gauges.ratio.set(labels, ratio);
249
+ _gauges.thresholdFailure.set(labels, failing);
250
+ }
251
+ }
252
+ /**
253
+ * Record security scanning results into dedicated Prometheus gauges.
254
+ *
255
+ * Exposes:
256
+ * - `api_security_findings_total{service, severity, category, scanner}` — count per label combination
257
+ * - `api_security_gate_passed{service}` — 1 = passed, 0 = failed, -1 = not configured
258
+ * - `api_security_scan_timestamp_seconds{service}` — Unix timestamp of this scan
259
+ *
260
+ * Must be called after initMetrics().
261
+ */
262
+ function recordSecurityScanMetrics(summary, serviceName = 'api-coverage-analyzer') {
263
+ if (!_securityGauges || !_registry)
264
+ return;
265
+ const now = Math.floor(Date.now() / 1000);
266
+ _securityGauges.scanTimestamp.set({ service: serviceName }, now);
267
+ // Gate status: 1 passed, 0 failed, -1 not configured
268
+ const gateValue = summary.gateResult === undefined ? -1 : summary.gateResult.passed ? 1 : 0;
269
+ _securityGauges.gatePassed.set({ service: serviceName }, gateValue);
270
+ const severities = ['LOW', 'MEDIUM', 'HIGH', 'CRITICAL'];
271
+ const categories = Object.keys(summary.byCategory);
272
+ const scanners = summary.scannersRun.length > 0 ? summary.scannersRun : ['none'];
273
+ // Zero-out all combinations first so Grafana sees 0 instead of stale values
274
+ for (const sev of severities) {
275
+ for (const cat of categories) {
276
+ for (const scanner of scanners) {
277
+ _securityGauges.findings.set({ service: serviceName, severity: sev, category: cat, scanner }, 0);
278
+ }
279
+ }
280
+ }
281
+ if (summary.findings && summary.findings.length > 0) {
282
+ // Use the per-finding detail list when available (highest granularity)
283
+ for (const finding of summary.findings) {
284
+ _securityGauges.findings.inc({ service: serviceName, severity: finding.severity, category: finding.category, scanner: finding.scanner }, 1);
285
+ }
286
+ }
287
+ else {
288
+ // Fallback: use pre-aggregated severity counts when no per-finding list is provided
289
+ for (const [sev, count] of Object.entries(summary.bySeverity)) {
290
+ for (const scanner of scanners) {
291
+ _securityGauges.findings.set({ service: serviceName, severity: sev, category: 'unknown', scanner }, count);
292
+ }
293
+ }
294
+ }
295
+ }
296
+ /**
297
+ * Record coverage intelligence results into dedicated Prometheus gauges.
298
+ *
299
+ * Must be called after initMetrics().
300
+ */
301
+ function recordIntelligenceMetrics(summary, projectName) {
302
+ var _a, _b, _c, _d, _e;
303
+ if (!_intelligenceGauges || !_registry)
304
+ return;
305
+ const project = (_a = projectName !== null && projectName !== void 0 ? projectName : summary.projectName) !== null && _a !== void 0 ? _a : 'unknown';
306
+ const language = (_c = (_b = summary.languages) === null || _b === void 0 ? void 0 : _b[0]) !== null && _c !== void 0 ? _c : 'unknown';
307
+ const framework = (_e = (_d = summary.frameworks) === null || _d === void 0 ? void 0 : _d[0]) !== null && _e !== void 0 ? _e : 'unknown';
308
+ _intelligenceGauges.functionalFindingsTotal.set({ project, coverage_type: 'all', language, framework }, summary.totalFindings);
309
+ _intelligenceGauges.missingTestRecommendationsTotal.set({ project, coverage_type: 'all', language, framework }, summary.totalRecommendations);
310
+ _intelligenceGauges.riskScoreMax.set({ project }, summary.maxRiskScore);
311
+ _intelligenceGauges.riskScoreAvg.set({ project }, summary.avgRiskScore);
312
+ _intelligenceGauges.criticalUncoveredItems.set({ project }, summary.criticalUncoveredItems);
313
+ _intelligenceGauges.unprotectedSecurityFindings.set({ project }, summary.unprotectedSecurityFindings);
314
+ for (const [priority, count] of Object.entries(summary.recommendationsByPriority)) {
315
+ // Derive a risk band label from priority
316
+ const riskBand = priority === 'P0' ? 'Critical' :
317
+ priority === 'P1' ? 'High' :
318
+ priority === 'P2' ? 'Moderate' : 'Low';
319
+ _intelligenceGauges.missingTestByPriority.set({ project, priority, risk_band: riskBand }, count);
320
+ }
321
+ }
322
+ /**
323
+ * Start an HTTP server that exposes /metrics in Prometheus text format.
324
+ * Resolves with the bound server instance once the port is open.
325
+ */
326
+ function startMetricsServer(port) {
327
+ return new Promise((resolve, reject) => {
328
+ if (!_registry) {
329
+ reject(new Error('Metrics registry not initialised — call initMetrics() first'));
330
+ return;
331
+ }
332
+ const registry = _registry;
333
+ const server = http.createServer(async (req, res) => {
334
+ if (req.url === '/metrics') {
335
+ try {
336
+ const text = await registry.metrics();
337
+ res.writeHead(200, { 'Content-Type': registry.contentType });
338
+ res.end(text);
339
+ }
340
+ catch (err) {
341
+ res.writeHead(500);
342
+ res.end(String(err));
343
+ }
344
+ }
345
+ else {
346
+ res.writeHead(404);
347
+ res.end('Not found');
348
+ }
349
+ });
350
+ server.once('error', reject);
351
+ server.listen(port, () => {
352
+ _metricsServer = server;
353
+ resolve(server);
354
+ });
355
+ });
356
+ }
357
+ /** Stop the metrics server if it is running. */
358
+ function stopMetricsServer() {
359
+ return new Promise((resolve) => {
360
+ if (_metricsServer) {
361
+ _metricsServer.close(() => {
362
+ _metricsServer = null;
363
+ resolve();
364
+ });
365
+ }
366
+ else {
367
+ resolve();
368
+ }
369
+ });
370
+ }
371
+ /** In-memory span collector (used when no OTLP endpoint is configured). */
372
+ const _spans = [];
373
+ let _tracingEnabled = false;
374
+ let _otlpEndpoint = null;
375
+ /** Enable or disable tracing. If endpoint is provided, spans are POSTed via OTLP HTTP. */
376
+ function initTracing(enabled, otlpEndpoint) {
377
+ _tracingEnabled = enabled;
378
+ _otlpEndpoint = otlpEndpoint !== null && otlpEndpoint !== void 0 ? otlpEndpoint : null;
379
+ if (enabled) {
380
+ _logger.debug({ event: 'tracing_init', otlpEndpoint: _otlpEndpoint !== null && _otlpEndpoint !== void 0 ? _otlpEndpoint : 'in-memory' }, 'OpenTelemetry tracing enabled');
381
+ }
382
+ }
383
+ /** Start a new span. No-op if tracing is disabled. */
384
+ function startSpan(name, attributes = {}) {
385
+ const span = {
386
+ name,
387
+ startTime: Date.now(),
388
+ attributes: { ...attributes },
389
+ ended: false,
390
+ end(extraAttributes) {
391
+ if (this.ended)
392
+ return;
393
+ this.ended = true;
394
+ this.endTime = Date.now();
395
+ if (extraAttributes) {
396
+ Object.assign(this.attributes, extraAttributes);
397
+ }
398
+ if (_tracingEnabled) {
399
+ const durationMs = this.endTime - this.startTime;
400
+ _logger.debug({
401
+ event: 'span_end',
402
+ spanName: this.name,
403
+ durationMs,
404
+ attributes: this.attributes,
405
+ });
406
+ _spans.push(this);
407
+ if (_otlpEndpoint) {
408
+ void exportSpanOtlp(this, _otlpEndpoint);
409
+ }
410
+ }
411
+ },
412
+ };
413
+ if (_tracingEnabled) {
414
+ _logger.debug({ event: 'span_start', spanName: name, attributes });
415
+ }
416
+ return span;
417
+ }
418
+ /** Return all completed spans collected in memory. */
419
+ function getCollectedSpans() {
420
+ return [..._spans];
421
+ }
422
+ /** Clear the in-memory span buffer (useful in tests). */
423
+ function clearCollectedSpans() {
424
+ _spans.length = 0;
425
+ }
426
+ /**
427
+ * Export a single span to an OTLP HTTP endpoint.
428
+ * This is a minimal implementation that sends a simplified JSON payload.
429
+ * For production use, the full @opentelemetry/exporter-trace-otlp-http package
430
+ * can be substituted.
431
+ */
432
+ async function exportSpanOtlp(span, endpoint) {
433
+ var _a;
434
+ const url = new URL('/v1/traces', endpoint);
435
+ const body = JSON.stringify({
436
+ resourceSpans: [
437
+ {
438
+ resource: {
439
+ attributes: [{ key: 'service.name', value: { stringValue: 'api-coverage-analyzer' } }],
440
+ },
441
+ scopeSpans: [
442
+ {
443
+ spans: [
444
+ {
445
+ name: span.name,
446
+ startTimeUnixNano: String(span.startTime * 1000000),
447
+ endTimeUnixNano: String(((_a = span.endTime) !== null && _a !== void 0 ? _a : span.startTime) * 1000000),
448
+ attributes: Object.entries(span.attributes).map(([k, v]) => ({
449
+ key: k,
450
+ value: typeof v === 'string'
451
+ ? { stringValue: v }
452
+ : typeof v === 'boolean'
453
+ ? { boolValue: v }
454
+ : { intValue: v },
455
+ })),
456
+ status: {},
457
+ },
458
+ ],
459
+ },
460
+ ],
461
+ },
462
+ ],
463
+ });
464
+ try {
465
+ const { default: https } = await Promise.resolve().then(() => __importStar(require('https')));
466
+ const { default: httpModule } = await Promise.resolve().then(() => __importStar(require('http')));
467
+ const mod = url.protocol === 'https:' ? https : httpModule;
468
+ await new Promise((resolve, reject) => {
469
+ const reqOptions = {
470
+ method: 'POST',
471
+ hostname: url.hostname,
472
+ port: url.port || undefined,
473
+ path: url.pathname,
474
+ headers: {
475
+ 'Content-Type': 'application/json',
476
+ 'Content-Length': Buffer.byteLength(body),
477
+ },
478
+ };
479
+ const req = mod.request(reqOptions, (res) => {
480
+ res.resume();
481
+ res.on('end', resolve);
482
+ });
483
+ req.on('error', reject);
484
+ req.write(body);
485
+ req.end();
486
+ });
487
+ }
488
+ catch (err) {
489
+ _logger.warn({ event: 'otlp_export_error', error: String(err) }, 'Failed to export span to OTLP endpoint');
490
+ }
491
+ }
492
+ /** Build an observability info object for embedding in reports. */
493
+ function buildObservabilityInfo(metricsPort) {
494
+ return {
495
+ metricsUrl: metricsPort ? `http://localhost:${metricsPort}/metrics` : null,
496
+ tracingEnabled: _tracingEnabled,
497
+ otlpEndpoint: _otlpEndpoint,
498
+ metricNames: {
499
+ total: 'api_coverage_total{service="<name>",coverage_type="<type>"}',
500
+ covered: 'api_coverage_covered{service="<name>",coverage_type="<type>"}',
501
+ ratio: 'api_coverage_ratio{service="<name>",coverage_type="<type>"}',
502
+ thresholdFailure: 'api_coverage_threshold_failure{service="<name>",coverage_type="<type>"}',
503
+ },
504
+ securityMetricNames: {
505
+ findings: 'api_security_findings_total{service="<name>",severity="<sev>",category="<cat>",scanner="<scanner>"}',
506
+ gatePassed: 'api_security_gate_passed{service="<name>"}',
507
+ scanTimestamp: 'api_security_scan_timestamp_seconds{service="<name>"}',
508
+ },
509
+ intelligenceMetricNames: {
510
+ functionalFindingsTotal: 'api_coverage_functional_findings_total{project="<name>",coverage_type="<type>",language="<lang>",framework="<fw>"}',
511
+ missingTestRecommendationsTotal: 'api_coverage_missing_test_recommendations_total{project="<name>",coverage_type="<type>",language="<lang>",framework="<fw>"}',
512
+ missingTestByPriority: 'api_coverage_missing_test_recommendations_by_priority{project="<name>",priority="<P0-P3>",risk_band="<band>"}',
513
+ riskScoreMax: 'api_coverage_risk_score_max{project="<name>"}',
514
+ riskScoreAvg: 'api_coverage_risk_score_avg{project="<name>"}',
515
+ criticalUncoveredItems: 'api_coverage_critical_uncovered_items_total{project="<name>"}',
516
+ unprotectedSecurityFindings: 'api_coverage_unprotected_security_findings_total{project="<name>"}',
517
+ },
518
+ };
519
+ }
@@ -0,0 +1,75 @@
1
+ import type { AstAnalysisConfig, DeepAnalysisCoverageConfig } from './config/types';
2
+ export interface SchemaConstraints {
3
+ type?: string;
4
+ format?: string;
5
+ minimum?: number;
6
+ maximum?: number;
7
+ minLength?: number;
8
+ maxLength?: number;
9
+ pattern?: string;
10
+ enum?: unknown[];
11
+ }
12
+ export interface ParameterInfo {
13
+ /** e.g. "POST /users" */
14
+ endpoint: string;
15
+ method: string;
16
+ path: string;
17
+ name: string;
18
+ location: 'path' | 'query' | 'header' | 'body';
19
+ required: boolean;
20
+ schema: SchemaConstraints;
21
+ }
22
+ export interface ParameterCoverage {
23
+ parameter: ParameterInfo;
24
+ validValue: boolean;
25
+ boundaryValue: boolean;
26
+ missing: boolean;
27
+ invalidValue: boolean;
28
+ /** Fraction of the four categories that are covered (0–1). */
29
+ ratio: number;
30
+ /**
31
+ * AST metadata when at least one coverage category was informed by semantic
32
+ * analysis rather than text scanning alone.
33
+ */
34
+ astMetadata?: {
35
+ sourceLanguage?: string;
36
+ resolutionType?: string;
37
+ confidence?: string;
38
+ };
39
+ }
40
+ /**
41
+ * Options to enable AST-augmented parameter coverage analysis.
42
+ * When provided, the AST layer supplements text-scan detection with
43
+ * semantic parameter scenario signals from language analyzers.
44
+ */
45
+ export interface AstParameterAnalysisOptions {
46
+ astConfig: AstAnalysisConfig;
47
+ deepConfig?: DeepAnalysisCoverageConfig;
48
+ }
49
+ export interface ParameterCoverageReport {
50
+ totalParameters: number;
51
+ averageCoverage: number;
52
+ fullyCoveredPercentage: number;
53
+ uncoveredParameters: ParameterInfo[];
54
+ parameters: ParameterCoverage[];
55
+ }
56
+ /**
57
+ * Parse an OpenAPI 3 spec file and return a flat list of all parameters,
58
+ * including request-body properties treated as body parameters.
59
+ */
60
+ export declare function parseParameters(specPath: string): Promise<ParameterInfo[]>;
61
+ /**
62
+ * For each parameter, scan test files and determine which coverage
63
+ * categories are satisfied. Optionally augments text-scan results with
64
+ * AST-derived semantic signals when `astOptions` is provided.
65
+ */
66
+ export declare function analyzeParameterCoverage(params: ParameterInfo[], testGlob: string, astOptions?: AstParameterAnalysisOptions): Promise<ParameterCoverage[]>;
67
+ /**
68
+ * Aggregate individual parameter coverages into a summary report.
69
+ */
70
+ export declare function buildParameterCoverageReport(coverages: ParameterCoverage[]): ParameterCoverageReport;
71
+ /**
72
+ * Write JSON and HTML parameter-coverage reports to the given directory.
73
+ */
74
+ export declare function generateParameterReports(report: ParameterCoverageReport, reportsDir: string): void;
75
+ //# sourceMappingURL=parameterCoverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameterCoverage.d.ts","sourceRoot":"","sources":["../../src/parameterCoverage.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAUpF,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,aAAa,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,WAAW,CAAC,EAAE;QACZ,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;;;GAIG;AACH,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,iBAAiB,CAAC;IAC7B,UAAU,CAAC,EAAE,0BAA0B,CAAC;CACzC;AAED,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,mBAAmB,EAAE,aAAa,EAAE,CAAC;IACrC,UAAU,EAAE,iBAAiB,EAAE,CAAC;CACjC;AA0BD;;;GAGG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAkEhF;AAyXD;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,aAAa,EAAE,EACvB,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,2BAA2B,GACvC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA+D9B;AAID;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,uBAAuB,CAuBpG;AAID;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,uBAAuB,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAwGlG"}