api-tests-coverage 1.0.21 → 1.0.22

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 (125) hide show
  1. package/dist/dashboard/dist/assets/_basePickBy-BKGHUeDJ.js +1 -0
  2. package/dist/dashboard/dist/assets/_baseUniq-CtA-DQF7.js +1 -0
  3. package/dist/dashboard/dist/assets/arc-CbXP3Mc9.js +1 -0
  4. package/dist/dashboard/dist/assets/architectureDiagram-VXUJARFQ-n7QxasMM.js +36 -0
  5. package/dist/dashboard/dist/assets/blockDiagram-VD42YOAC-MXnGwKRn.js +122 -0
  6. package/dist/dashboard/dist/assets/c4Diagram-YG6GDRKO-B3yZ5P9k.js +10 -0
  7. package/dist/dashboard/dist/assets/channel-C7QwX7U8.js +1 -0
  8. package/dist/dashboard/dist/assets/chunk-4BX2VUAB-Dw3El5KF.js +1 -0
  9. package/dist/dashboard/dist/assets/chunk-55IACEB6-T8Jf00IL.js +1 -0
  10. package/dist/dashboard/dist/assets/chunk-B4BG7PRW-DAJalKYJ.js +165 -0
  11. package/dist/dashboard/dist/assets/chunk-DI55MBZ5-p7o_KuDF.js +220 -0
  12. package/dist/dashboard/dist/assets/chunk-FMBD7UC4-B0wUAfQR.js +15 -0
  13. package/dist/dashboard/dist/assets/chunk-QN33PNHL-BTFwTEw8.js +1 -0
  14. package/dist/dashboard/dist/assets/chunk-QZHKN3VN-CNXHnjkC.js +1 -0
  15. package/dist/dashboard/dist/assets/chunk-TZMSLE5B-BIVywBYp.js +1 -0
  16. package/dist/dashboard/dist/assets/classDiagram-2ON5EDUG-Dkb-G0UK.js +1 -0
  17. package/dist/dashboard/dist/assets/classDiagram-v2-WZHVMYZB-Dkb-G0UK.js +1 -0
  18. package/dist/dashboard/dist/assets/clone-BSdXhKmH.js +1 -0
  19. package/dist/dashboard/dist/assets/cose-bilkent-S5V4N54A-DuALhY5a.js +1 -0
  20. package/dist/dashboard/dist/assets/cytoscape.esm-CyJtwmzi.js +331 -0
  21. package/dist/dashboard/dist/assets/dagre-6UL2VRFP-w6endfy9.js +4 -0
  22. package/dist/dashboard/dist/assets/diagram-PSM6KHXK-BDnUwPQC.js +24 -0
  23. package/dist/dashboard/dist/assets/diagram-QEK2KX5R-Cbb7ctAo.js +43 -0
  24. package/dist/dashboard/dist/assets/diagram-S2PKOQOG-76ascveh.js +24 -0
  25. package/dist/dashboard/dist/assets/erDiagram-Q2GNP2WA-BQQnVF0J.js +60 -0
  26. package/dist/dashboard/dist/assets/flowDiagram-NV44I4VS-dKukiSxD.js +162 -0
  27. package/dist/dashboard/dist/assets/ganttDiagram-JELNMOA3-BqnazZuZ.js +267 -0
  28. package/dist/dashboard/dist/assets/gitGraphDiagram-V2S2FVAM-BUFcnXCj.js +65 -0
  29. package/dist/dashboard/dist/assets/graph-CGQIvL3r.js +1 -0
  30. package/dist/dashboard/dist/assets/index-CadOHtae.css +1 -0
  31. package/dist/dashboard/dist/assets/index-DwqfA4mc.js +777 -0
  32. package/dist/dashboard/dist/assets/infoDiagram-HS3SLOUP-BdylFPLI.js +2 -0
  33. package/dist/dashboard/dist/assets/journeyDiagram-XKPGCS4Q-BzJTBkhp.js +139 -0
  34. package/dist/dashboard/dist/assets/kanban-definition-3W4ZIXB7-StKomgio.js +89 -0
  35. package/dist/dashboard/dist/assets/katex-O9d3_IXG.js +261 -0
  36. package/dist/dashboard/dist/assets/layout-BnsX73QS.js +1 -0
  37. package/dist/dashboard/dist/assets/mindmap-definition-VGOIOE7T-HqFRhVFX.js +68 -0
  38. package/dist/dashboard/dist/assets/pieDiagram-ADFJNKIX-2I2tFH0C.js +30 -0
  39. package/dist/dashboard/dist/assets/quadrantDiagram-AYHSOK5B-PlELkdBW.js +7 -0
  40. package/dist/dashboard/dist/assets/requirementDiagram-UZGBJVZJ-_9eLQNcZ.js +64 -0
  41. package/dist/dashboard/dist/assets/sankeyDiagram-TZEHDZUN-DHl1Ss7O.js +10 -0
  42. package/dist/dashboard/dist/assets/sequenceDiagram-WL72ISMW-B9p0m3Uf.js +145 -0
  43. package/dist/dashboard/dist/assets/stateDiagram-FKZM4ZOC--rpDODjT.js +1 -0
  44. package/dist/dashboard/dist/assets/stateDiagram-v2-4FDKWEC3-Ca9uGk46.js +1 -0
  45. package/dist/dashboard/dist/assets/timeline-definition-IT6M3QCI-BCHaGBHB.js +61 -0
  46. package/dist/dashboard/dist/assets/treemap-GDKQZRPO-CgiqDY8M.js +162 -0
  47. package/dist/dashboard/dist/assets/xychartDiagram-PRI3JC2R-BMvBBbeV.js +7 -0
  48. package/dist/dashboard/dist/index.html +14 -0
  49. package/dist/dashboard/dist/reports/business-coverage.json +201 -0
  50. package/dist/dashboard/dist/reports/coverage-intelligence.json +728 -0
  51. package/dist/dashboard/dist/reports/coverage-summary.json +995 -0
  52. package/dist/dashboard/dist/reports/endpoint-coverage.json +336 -0
  53. package/dist/dashboard/dist/reports/error-coverage.json +367 -0
  54. package/dist/dashboard/dist/reports/missing-tests-recommendations.json +285 -0
  55. package/dist/dashboard/dist/reports/risk-prioritization.json +312 -0
  56. package/dist/dashboard/dist/reports/security-coverage.json +299 -0
  57. package/dist/dashboard/dist/vite.svg +1 -0
  58. package/dist/src/generation/context-builder.d.ts +6 -0
  59. package/dist/src/generation/context-builder.d.ts.map +1 -0
  60. package/dist/src/generation/context-builder.js +202 -0
  61. package/dist/src/generation/engine.d.ts +40 -0
  62. package/dist/src/generation/engine.d.ts.map +1 -0
  63. package/dist/src/generation/engine.js +378 -0
  64. package/dist/src/generation/file-router.d.ts +7 -0
  65. package/dist/src/generation/file-router.d.ts.map +1 -0
  66. package/dist/src/generation/file-router.js +79 -0
  67. package/dist/src/generation/gap-extractor.d.ts +12 -0
  68. package/dist/src/generation/gap-extractor.d.ts.map +1 -0
  69. package/dist/src/generation/gap-extractor.js +281 -0
  70. package/dist/src/generation/template-renderer.d.ts +10 -0
  71. package/dist/src/generation/template-renderer.d.ts.map +1 -0
  72. package/dist/src/generation/template-renderer.js +526 -0
  73. package/dist/src/generation/types.d.ts +73 -0
  74. package/dist/src/generation/types.d.ts.map +1 -0
  75. package/dist/src/generation/types.js +2 -0
  76. package/dist/src/index.js +154 -0
  77. package/dist/src/pipeline/detectors/expressMiddlewareDetector.d.ts +21 -0
  78. package/dist/src/pipeline/detectors/expressMiddlewareDetector.d.ts.map +1 -0
  79. package/dist/src/pipeline/detectors/expressMiddlewareDetector.js +201 -0
  80. package/dist/src/pipeline/detectors/flaskBlueprintDetector.d.ts +23 -0
  81. package/dist/src/pipeline/detectors/flaskBlueprintDetector.d.ts.map +1 -0
  82. package/dist/src/pipeline/detectors/flaskBlueprintDetector.js +263 -0
  83. package/dist/src/pipeline/detectors/springDddDetector.d.ts +23 -0
  84. package/dist/src/pipeline/detectors/springDddDetector.d.ts.map +1 -0
  85. package/dist/src/pipeline/detectors/springDddDetector.js +237 -0
  86. package/dist/src/pipeline/detectors/types.d.ts +97 -0
  87. package/dist/src/pipeline/detectors/types.d.ts.map +1 -0
  88. package/dist/src/pipeline/detectors/types.js +15 -0
  89. package/dist/src/reporting.d.ts.map +1 -1
  90. package/dist/src/reporting.js +2 -1
  91. package/dist/src/streaming/detectors/eventBridgeDetector.d.ts +5 -0
  92. package/dist/src/streaming/detectors/eventBridgeDetector.d.ts.map +1 -0
  93. package/dist/src/streaming/detectors/eventBridgeDetector.js +82 -0
  94. package/dist/src/streaming/detectors/kafkaDetector.d.ts +5 -0
  95. package/dist/src/streaming/detectors/kafkaDetector.d.ts.map +1 -0
  96. package/dist/src/streaming/detectors/kafkaDetector.js +97 -0
  97. package/dist/src/streaming/detectors/natsDetector.d.ts +5 -0
  98. package/dist/src/streaming/detectors/natsDetector.d.ts.map +1 -0
  99. package/dist/src/streaming/detectors/natsDetector.js +96 -0
  100. package/dist/src/streaming/detectors/pubsubDetector.d.ts +5 -0
  101. package/dist/src/streaming/detectors/pubsubDetector.d.ts.map +1 -0
  102. package/dist/src/streaming/detectors/pubsubDetector.js +82 -0
  103. package/dist/src/streaming/detectors/rabbitmqDetector.d.ts +5 -0
  104. package/dist/src/streaming/detectors/rabbitmqDetector.d.ts.map +1 -0
  105. package/dist/src/streaming/detectors/rabbitmqDetector.js +103 -0
  106. package/dist/src/streaming/detectors/redisPubsubDetector.d.ts +5 -0
  107. package/dist/src/streaming/detectors/redisPubsubDetector.d.ts.map +1 -0
  108. package/dist/src/streaming/detectors/redisPubsubDetector.js +81 -0
  109. package/dist/src/streaming/detectors/snsDetector.d.ts +5 -0
  110. package/dist/src/streaming/detectors/snsDetector.d.ts.map +1 -0
  111. package/dist/src/streaming/detectors/snsDetector.js +81 -0
  112. package/dist/src/streaming/detectors/sqsDetector.d.ts +5 -0
  113. package/dist/src/streaming/detectors/sqsDetector.d.ts.map +1 -0
  114. package/dist/src/streaming/detectors/sqsDetector.js +81 -0
  115. package/dist/src/streaming/eventCoverage.d.ts +46 -0
  116. package/dist/src/streaming/eventCoverage.d.ts.map +1 -0
  117. package/dist/src/streaming/eventCoverage.js +270 -0
  118. package/dist/src/streaming/types.d.ts +34 -0
  119. package/dist/src/streaming/types.d.ts.map +1 -0
  120. package/dist/src/streaming/types.js +2 -0
  121. package/dist/src/summary/markdownRenderer.d.ts.map +1 -1
  122. package/dist/src/summary/markdownRenderer.js +1 -0
  123. package/dist/src/summary/summaryTypes.d.ts.map +1 -1
  124. package/dist/src/summary/summaryTypes.js +1 -0
  125. package/package.json +1 -1
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SnsDetector = void 0;
4
+ function resolveTopicString(raw) {
5
+ var _a;
6
+ const trimmed = raw.trim();
7
+ const envMatch = (_a = trimmed.match(/process\.env\.([A-Z_a-z][A-Z_a-z0-9]*)/)) !== null && _a !== void 0 ? _a : trimmed.match(/process\.env\[['"]([A-Z_a-z][A-Z_a-z0-9]*)['"]\]/);
8
+ if (envMatch) {
9
+ return { topic: `UNRESOLVED:env:${envMatch[1]}`, resolution: `UNRESOLVED:env:${envMatch[1]}` };
10
+ }
11
+ if (trimmed.includes('${')) {
12
+ return { topic: 'UNRESOLVED:dynamic', resolution: 'UNRESOLVED:dynamic' };
13
+ }
14
+ const literalMatch = trimmed.match(/^['"`]([^'"`]+)['"`]$/);
15
+ if (literalMatch) {
16
+ return { topic: literalMatch[1], resolution: 'resolved' };
17
+ }
18
+ if (trimmed.match(/^[A-Za-z_][A-Za-z_0-9.]*$/)) {
19
+ return { topic: trimmed, resolution: 'cross-file-unresolved' };
20
+ }
21
+ return { topic: 'UNRESOLVED:dynamic', resolution: 'UNRESOLVED:dynamic' };
22
+ }
23
+ class SnsDetector {
24
+ detect(fileContent, filePath) {
25
+ const nodes = [];
26
+ try {
27
+ let idx = 0;
28
+ let match;
29
+ // sns.publish({ TopicArn: '...' }) or PublishCommand({ TopicArn: '...' })
30
+ const publishRegex = /(?:sns\.publish|PublishCommand|PublishBatchCommand)\s*\(\s*\{[^}]*TopicArn\s*:\s*([^,}\n]+)/g;
31
+ while ((match = publishRegex.exec(fileContent)) !== null) {
32
+ const { topic, resolution } = resolveTopicString(match[1]);
33
+ nodes.push({
34
+ id: `sns-producer-${filePath}-${idx++}`,
35
+ filePath,
36
+ brokerType: 'sns',
37
+ nodeType: 'producer',
38
+ topic,
39
+ resolution,
40
+ hasTest: false,
41
+ testFiles: [],
42
+ });
43
+ }
44
+ // sns.subscribe({ TopicArn: '...', Protocol: '...' })
45
+ const subscribeRegex = /(?:sns\.subscribe|SubscribeCommand)\s*\(\s*\{[^}]*TopicArn\s*:\s*([^,}\n]+)/g;
46
+ while ((match = subscribeRegex.exec(fileContent)) !== null) {
47
+ const { topic, resolution } = resolveTopicString(match[1]);
48
+ nodes.push({
49
+ id: `sns-consumer-${filePath}-${idx++}`,
50
+ filePath,
51
+ brokerType: 'sns',
52
+ nodeType: 'consumer',
53
+ topic,
54
+ resolution,
55
+ hasTest: false,
56
+ testFiles: [],
57
+ });
58
+ }
59
+ // @SnsListener("arn:aws:sns:...") annotation
60
+ const snsListenerRegex = /@SnsListener\s*\(\s*([^)]+)\)/g;
61
+ while ((match = snsListenerRegex.exec(fileContent)) !== null) {
62
+ const { topic, resolution } = resolveTopicString(match[1]);
63
+ nodes.push({
64
+ id: `sns-listener-${filePath}-${idx++}`,
65
+ filePath,
66
+ brokerType: 'sns',
67
+ nodeType: 'consumer',
68
+ topic,
69
+ resolution,
70
+ hasTest: false,
71
+ testFiles: [],
72
+ });
73
+ }
74
+ }
75
+ catch {
76
+ // never throws
77
+ }
78
+ return nodes;
79
+ }
80
+ }
81
+ exports.SnsDetector = SnsDetector;
@@ -0,0 +1,5 @@
1
+ import type { EventNode } from '../types';
2
+ export declare class SqsDetector {
3
+ detect(fileContent: string, filePath: string): EventNode[];
4
+ }
5
+ //# sourceMappingURL=sqsDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqsDetector.d.ts","sourceRoot":"","sources":["../../../../src/streaming/detectors/sqsDetector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,UAAU,CAAC;AAsB3D,qBAAa,WAAW;IACtB,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE;CA0D3D"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SqsDetector = void 0;
4
+ function resolveTopicString(raw) {
5
+ var _a;
6
+ const trimmed = raw.trim();
7
+ const envMatch = (_a = trimmed.match(/process\.env\.([A-Z_a-z][A-Z_a-z0-9]*)/)) !== null && _a !== void 0 ? _a : trimmed.match(/process\.env\[['"]([A-Z_a-z][A-Z_a-z0-9]*)['"]\]/);
8
+ if (envMatch) {
9
+ return { topic: `UNRESOLVED:env:${envMatch[1]}`, resolution: `UNRESOLVED:env:${envMatch[1]}` };
10
+ }
11
+ if (trimmed.includes('${')) {
12
+ return { topic: 'UNRESOLVED:dynamic', resolution: 'UNRESOLVED:dynamic' };
13
+ }
14
+ const literalMatch = trimmed.match(/^['"`]([^'"`]+)['"`]$/);
15
+ if (literalMatch) {
16
+ return { topic: literalMatch[1], resolution: 'resolved' };
17
+ }
18
+ if (trimmed.match(/^[A-Za-z_][A-Za-z_0-9.]*$/)) {
19
+ return { topic: trimmed, resolution: 'cross-file-unresolved' };
20
+ }
21
+ return { topic: 'UNRESOLVED:dynamic', resolution: 'UNRESOLVED:dynamic' };
22
+ }
23
+ class SqsDetector {
24
+ detect(fileContent, filePath) {
25
+ const nodes = [];
26
+ try {
27
+ let idx = 0;
28
+ let match;
29
+ // sqs.sendMessage({ QueueUrl: '...' }) or SendMessageCommand({ QueueUrl: '...' })
30
+ const sendMessageRegex = /(?:sendMessage|SendMessageCommand|SendMessageBatchCommand)\s*\(\s*\{[^}]*QueueUrl\s*:\s*([^,}\n]+)/g;
31
+ while ((match = sendMessageRegex.exec(fileContent)) !== null) {
32
+ const { topic, resolution } = resolveTopicString(match[1]);
33
+ nodes.push({
34
+ id: `sqs-producer-${filePath}-${idx++}`,
35
+ filePath,
36
+ brokerType: 'sqs',
37
+ nodeType: 'producer',
38
+ topic,
39
+ resolution,
40
+ hasTest: false,
41
+ testFiles: [],
42
+ });
43
+ }
44
+ // sqs.receiveMessage({ QueueUrl: '...' }) or ReceiveMessageCommand({ QueueUrl: '...' })
45
+ const receiveMessageRegex = /(?:receiveMessage|ReceiveMessageCommand)\s*\(\s*\{[^}]*QueueUrl\s*:\s*([^,}\n]+)/g;
46
+ while ((match = receiveMessageRegex.exec(fileContent)) !== null) {
47
+ const { topic, resolution } = resolveTopicString(match[1]);
48
+ nodes.push({
49
+ id: `sqs-consumer-${filePath}-${idx++}`,
50
+ filePath,
51
+ brokerType: 'sqs',
52
+ nodeType: 'consumer',
53
+ topic,
54
+ resolution,
55
+ hasTest: false,
56
+ testFiles: [],
57
+ });
58
+ }
59
+ // @SqsListener("queueName") annotation (Spring Cloud AWS)
60
+ const sqsListenerRegex = /@SqsListener\s*\(\s*(?:value\s*=\s*)?([^)]+)\)/g;
61
+ while ((match = sqsListenerRegex.exec(fileContent)) !== null) {
62
+ const { topic, resolution } = resolveTopicString(match[1]);
63
+ nodes.push({
64
+ id: `sqs-listener-${filePath}-${idx++}`,
65
+ filePath,
66
+ brokerType: 'sqs',
67
+ nodeType: 'consumer',
68
+ topic,
69
+ resolution,
70
+ hasTest: false,
71
+ testFiles: [],
72
+ });
73
+ }
74
+ }
75
+ catch {
76
+ // never throws
77
+ }
78
+ return nodes;
79
+ }
80
+ }
81
+ exports.SqsDetector = SqsDetector;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Event / Message-Driven Coverage (Feature 29)
3
+ *
4
+ * Scans source files for broker-specific producer/consumer patterns,
5
+ * then cross-references with test files to determine event coverage.
6
+ *
7
+ * Detectors NEVER throw — all file parsing is wrapped in try/catch.
8
+ * Dynamic/env-var topics: UNRESOLVED:env:VAR or UNRESOLVED:dynamic.
9
+ */
10
+ import type { EventNode, BrokerType, EventCoverageResult } from './types';
11
+ /**
12
+ * Scan source files for event producer/consumer patterns using all broker detectors.
13
+ * Skips the streaming detector source files themselves to avoid false positives
14
+ * from pattern definitions in the detector implementations.
15
+ */
16
+ export declare function scanEventNodes(sourceGlob: string): EventNode[];
17
+ /**
18
+ * Cross-reference event nodes against test files.
19
+ * A node is "covered" if its topic name appears in any test file content.
20
+ */
21
+ export declare function matchTestCoverage(nodes: EventNode[], testsGlob: string): EventNode[];
22
+ /**
23
+ * Validate event schema health: flags nodes missing version/eventId/timestamp/source.
24
+ */
25
+ export declare function checkSchemaHealth(nodes: EventNode[]): string[];
26
+ /**
27
+ * Detect DLQ issues: DLQ configured but never consumed.
28
+ * Scopes the check by brokerType+topic to avoid false negatives
29
+ * when different brokers reuse the same topic name.
30
+ */
31
+ export declare function checkDlqIssues(nodes: EventNode[]): string[];
32
+ /**
33
+ * Build a broker breakdown: count of nodes per broker type.
34
+ */
35
+ export declare function buildBrokerBreakdown(nodes: EventNode[]): Partial<Record<BrokerType, number>>;
36
+ /**
37
+ * Run full event coverage analysis and produce a CoverageResult-compatible output.
38
+ */
39
+ export declare function analyzeEventCoverage(sourceGlob: string, testsGlob: string): EventCoverageResult;
40
+ /**
41
+ * Write event coverage JSON report.
42
+ * Includes a top-level `topics` array aggregated by broker+topic+nodeType
43
+ * so the dashboard StreamingPage can render per-topic rows without duplicate IDs.
44
+ */
45
+ export declare function writeEventReport(result: EventCoverageResult, reportsDir: string): void;
46
+ //# sourceMappingURL=eventCoverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventCoverage.d.ts","sourceRoot":"","sources":["../../../src/streaming/eventCoverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAkC1E;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,CA8B9D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,CA+BpF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAc9D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,CAgB3D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAM5F;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,mBAAmB,CA4BrB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAuCtF"}
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+ /**
3
+ * Event / Message-Driven Coverage (Feature 29)
4
+ *
5
+ * Scans source files for broker-specific producer/consumer patterns,
6
+ * then cross-references with test files to determine event coverage.
7
+ *
8
+ * Detectors NEVER throw — all file parsing is wrapped in try/catch.
9
+ * Dynamic/env-var topics: UNRESOLVED:env:VAR or UNRESOLVED:dynamic.
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.scanEventNodes = scanEventNodes;
49
+ exports.matchTestCoverage = matchTestCoverage;
50
+ exports.checkSchemaHealth = checkSchemaHealth;
51
+ exports.checkDlqIssues = checkDlqIssues;
52
+ exports.buildBrokerBreakdown = buildBrokerBreakdown;
53
+ exports.analyzeEventCoverage = analyzeEventCoverage;
54
+ exports.writeEventReport = writeEventReport;
55
+ const fs = __importStar(require("fs"));
56
+ const path = __importStar(require("path"));
57
+ const fast_glob_1 = __importDefault(require("fast-glob"));
58
+ const kafkaDetector_1 = require("./detectors/kafkaDetector");
59
+ const rabbitmqDetector_1 = require("./detectors/rabbitmqDetector");
60
+ const snsDetector_1 = require("./detectors/snsDetector");
61
+ const sqsDetector_1 = require("./detectors/sqsDetector");
62
+ const eventBridgeDetector_1 = require("./detectors/eventBridgeDetector");
63
+ const pubsubDetector_1 = require("./detectors/pubsubDetector");
64
+ const natsDetector_1 = require("./detectors/natsDetector");
65
+ const redisPubsubDetector_1 = require("./detectors/redisPubsubDetector");
66
+ // ─── All detector instances ──────────────────────────────────────────────────
67
+ const DETECTORS = [
68
+ new kafkaDetector_1.KafkaDetector(),
69
+ new rabbitmqDetector_1.RabbitmqDetector(),
70
+ new snsDetector_1.SnsDetector(),
71
+ new sqsDetector_1.SqsDetector(),
72
+ new eventBridgeDetector_1.EventBridgeDetector(),
73
+ new pubsubDetector_1.PubsubDetector(),
74
+ new natsDetector_1.NatsDetector(),
75
+ new redisPubsubDetector_1.RedisPubsubDetector(),
76
+ ];
77
+ // ─── Scan exclusions ─────────────────────────────────────────────────────────
78
+ /** Paths within the streaming module that contain broker pattern definitions (not actual usage). */
79
+ const EXCLUDED_STREAMING_PATHS = [
80
+ '/streaming/detectors/',
81
+ '/streaming/eventCoverage',
82
+ '/streaming/types',
83
+ ];
84
+ // ─── Public API ──────────────────────────────────────────────────────────────
85
+ /**
86
+ * Scan source files for event producer/consumer patterns using all broker detectors.
87
+ * Skips the streaming detector source files themselves to avoid false positives
88
+ * from pattern definitions in the detector implementations.
89
+ */
90
+ function scanEventNodes(sourceGlob) {
91
+ const files = fast_glob_1.default.sync(sourceGlob, { absolute: true });
92
+ const allNodes = [];
93
+ for (const filePath of files) {
94
+ // Skip the streaming module's own source files — they contain broker pattern
95
+ // definitions (regexes, keyword lists) which would produce false positives.
96
+ const normalised = filePath.replace(/\\/g, '/');
97
+ if (EXCLUDED_STREAMING_PATHS.some((p) => normalised.includes(p))) {
98
+ continue;
99
+ }
100
+ let content;
101
+ try {
102
+ content = fs.readFileSync(filePath, 'utf-8');
103
+ }
104
+ catch {
105
+ continue;
106
+ }
107
+ for (const detector of DETECTORS) {
108
+ try {
109
+ const nodes = detector.detect(content, filePath);
110
+ allNodes.push(...nodes);
111
+ }
112
+ catch {
113
+ // Detectors NEVER throw, but just in case
114
+ }
115
+ }
116
+ }
117
+ return allNodes;
118
+ }
119
+ /**
120
+ * Cross-reference event nodes against test files.
121
+ * A node is "covered" if its topic name appears in any test file content.
122
+ */
123
+ function matchTestCoverage(nodes, testsGlob) {
124
+ const testFiles = fast_glob_1.default.sync(testsGlob, { absolute: true });
125
+ const testContents = [];
126
+ for (const tf of testFiles) {
127
+ try {
128
+ testContents.push({ filePath: tf, content: fs.readFileSync(tf, 'utf-8') });
129
+ }
130
+ catch {
131
+ continue;
132
+ }
133
+ }
134
+ return nodes.map((node) => {
135
+ // Skip matching for unresolved topics
136
+ if (node.resolution !== 'resolved') {
137
+ return { ...node, hasTest: false, testFiles: [] };
138
+ }
139
+ const matchedTests = [];
140
+ for (const tc of testContents) {
141
+ if (tc.content.includes(node.topic)) {
142
+ matchedTests.push(tc.filePath);
143
+ }
144
+ }
145
+ return {
146
+ ...node,
147
+ hasTest: matchedTests.length > 0,
148
+ testFiles: matchedTests,
149
+ };
150
+ });
151
+ }
152
+ /**
153
+ * Validate event schema health: flags nodes missing version/eventId/timestamp/source.
154
+ */
155
+ function checkSchemaHealth(nodes) {
156
+ const issues = [];
157
+ for (const node of nodes) {
158
+ if (!node.schema)
159
+ continue;
160
+ const missing = [];
161
+ if (!node.schema.hasVersion)
162
+ missing.push('version');
163
+ if (!node.schema.hasEventId)
164
+ missing.push('eventId');
165
+ if (!node.schema.hasTimestamp)
166
+ missing.push('timestamp');
167
+ if (!node.schema.hasSource)
168
+ missing.push('source');
169
+ if (missing.length > 0) {
170
+ issues.push(`${node.id}: missing schema fields: ${missing.join(', ')}`);
171
+ }
172
+ }
173
+ return issues;
174
+ }
175
+ /**
176
+ * Detect DLQ issues: DLQ configured but never consumed.
177
+ * Scopes the check by brokerType+topic to avoid false negatives
178
+ * when different brokers reuse the same topic name.
179
+ */
180
+ function checkDlqIssues(nodes) {
181
+ const dlqNodes = nodes.filter((n) => n.nodeType === 'dlq');
182
+ const consumerKeys = new Set(nodes
183
+ .filter((n) => n.nodeType === 'consumer')
184
+ .map((n) => `${n.brokerType}:${n.topic}`));
185
+ const issues = [];
186
+ for (const dlq of dlqNodes) {
187
+ if (!consumerKeys.has(`${dlq.brokerType}:${dlq.topic}`)) {
188
+ issues.push(`DLQ '${dlq.topic}' configured but never consumed — severity: high`);
189
+ }
190
+ }
191
+ return issues;
192
+ }
193
+ /**
194
+ * Build a broker breakdown: count of nodes per broker type.
195
+ */
196
+ function buildBrokerBreakdown(nodes) {
197
+ var _a;
198
+ const breakdown = {};
199
+ for (const node of nodes) {
200
+ breakdown[node.brokerType] = ((_a = breakdown[node.brokerType]) !== null && _a !== void 0 ? _a : 0) + 1;
201
+ }
202
+ return breakdown;
203
+ }
204
+ /**
205
+ * Run full event coverage analysis and produce a CoverageResult-compatible output.
206
+ */
207
+ function analyzeEventCoverage(sourceGlob, testsGlob) {
208
+ const rawNodes = scanEventNodes(sourceGlob);
209
+ const nodes = matchTestCoverage(rawNodes, testsGlob);
210
+ const totalItems = nodes.length;
211
+ const coveredItems = nodes.filter((n) => n.hasTest).length;
212
+ const coveragePercent = totalItems > 0
213
+ ? Math.round((coveredItems / totalItems) * 10000) / 100
214
+ : 0;
215
+ const unresolvedCount = nodes.filter((n) => n.resolution !== 'resolved').length;
216
+ const brokerBreakdown = buildBrokerBreakdown(nodes);
217
+ const schemaHealthIssues = checkSchemaHealth(nodes);
218
+ const dlqIssues = checkDlqIssues(nodes);
219
+ return {
220
+ type: 'event',
221
+ totalItems,
222
+ coveredItems,
223
+ coveragePercent,
224
+ details: {
225
+ nodes,
226
+ unresolvedCount,
227
+ brokerBreakdown,
228
+ schemaHealthIssues,
229
+ dlqIssues,
230
+ },
231
+ };
232
+ }
233
+ /**
234
+ * Write event coverage JSON report.
235
+ * Includes a top-level `topics` array aggregated by broker+topic+nodeType
236
+ * so the dashboard StreamingPage can render per-topic rows without duplicate IDs.
237
+ */
238
+ function writeEventReport(result, reportsDir) {
239
+ const outPath = path.join(reportsDir, 'event-coverage.json');
240
+ fs.mkdirSync(reportsDir, { recursive: true });
241
+ // Aggregate nodes by a stable composite key (broker:nodeType:topic) to avoid
242
+ // duplicate IDs in the dashboard when multiple occurrences share the same topic.
243
+ const topicMap = new Map();
244
+ for (const node of result.details.nodes) {
245
+ const key = `${node.brokerType}:${node.nodeType}:${node.topic}`;
246
+ const existing = topicMap.get(key);
247
+ if (existing) {
248
+ existing.covered = existing.covered || node.hasTest;
249
+ for (const t of node.testFiles) {
250
+ if (!existing.tests.includes(t))
251
+ existing.tests.push(t);
252
+ }
253
+ }
254
+ else {
255
+ topicMap.set(key, {
256
+ id: key,
257
+ covered: node.hasTest,
258
+ broker: node.brokerType,
259
+ tests: [...node.testFiles],
260
+ description: `${node.nodeType} on ${node.brokerType}`,
261
+ });
262
+ }
263
+ }
264
+ const report = {
265
+ ...result,
266
+ generatedAt: new Date().toISOString(),
267
+ topics: Array.from(topicMap.values()),
268
+ };
269
+ fs.writeFileSync(outPath, JSON.stringify(report, null, 2), 'utf-8');
270
+ }
@@ -0,0 +1,34 @@
1
+ export type BrokerType = 'kafka' | 'rabbitmq' | 'sqs' | 'sns' | 'eventbridge' | 'pubsub' | 'nats' | 'redis-pubsub' | 'stomp' | 'amqp' | 'azure-servicebus' | 'kinesis' | 'mqtt' | 'pulsar' | 'unknown';
2
+ export type TopicResolution = 'resolved' | 'cross-file-unresolved' | 'UNRESOLVED:dynamic' | `UNRESOLVED:env:${string}`;
3
+ export interface EventNode {
4
+ id: string;
5
+ filePath: string;
6
+ brokerType: BrokerType;
7
+ nodeType: 'producer' | 'consumer' | 'dlq' | 'topic-definition';
8
+ topic: string;
9
+ resolution: TopicResolution;
10
+ schema?: EventSchema;
11
+ hasTest: boolean;
12
+ testFiles: string[];
13
+ }
14
+ export interface EventSchema {
15
+ hasVersion: boolean;
16
+ hasEventId: boolean;
17
+ hasTimestamp: boolean;
18
+ hasSource: boolean;
19
+ issues: string[];
20
+ }
21
+ export interface EventCoverageResult {
22
+ type: 'event';
23
+ totalItems: number;
24
+ coveredItems: number;
25
+ coveragePercent: number;
26
+ details: {
27
+ nodes: EventNode[];
28
+ unresolvedCount: number;
29
+ brokerBreakdown: Partial<Record<BrokerType, number>>;
30
+ schemaHealthIssues: string[];
31
+ dlqIssues: string[];
32
+ };
33
+ }
34
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/streaming/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,aAAa,GAAG,QAAQ,GAC/D,MAAM,GAAG,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,kBAAkB,GAC/D,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE9C,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,uBAAuB,GACvB,oBAAoB,GACpB,kBAAkB,MAAM,EAAE,CAAC;AAE/B,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,UAAU,GAAG,UAAU,GAAG,KAAK,GAAG,kBAAkB,CAAC;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,eAAe,CAAC;IAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE;QACP,KAAK,EAAE,SAAS,EAAE,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,eAAe,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;QACrD,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAC7B,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1 +1 @@
1
- {"version":3,"file":"markdownRenderer.d.ts","sourceRoot":"","sources":["../../../src/summary/markdownRenderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markdownRenderer.d.ts","sourceRoot":"","sources":["../../../src/summary/markdownRenderer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAIpE,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,4EAA4E;IAC5E,EAAE,EAAE,MAAM,CAAC;IACX,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,QAAQ,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,aAAa,EAAE,OAAO,CAAC;IACvB,sEAAsE;IACtE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,IAAI,EAAE,OAAO,CAAC;CACf;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,kEAAkE;IAClE,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,qCAAqC;IACrC,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,+DAA+D;IAC/D,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,iEAAiE;IACjE,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAChD,mCAAmC;IACnC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,mBAAmB,CAAC,EAAE;QACpB,aAAa,EAAE,MAAM,CAAC;QACtB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,2BAA2B,EAAE,MAAM,CAAC;QACpC,yBAAyB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClD,YAAY,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;CACH;AAED,sFAAsF;AACtF,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CActD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,SAAK,GAAG,MAAM,EAAE,CAgDxE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,EACtB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,WAAW,EAAE,OAAO,GACnB,MAAM,CA2DR;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,mBAAmB,EACjC,cAAc,EAAE,aAAa,EAAE,EAC/B,aAAa,EAAE,OAAO,EACtB,UAAU,EAAE,OAAO,GAAG,SAAS,GAC9B,MAAM,CAuDR;AAiBD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAO7D;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CA6D9E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAuGvF;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,WAAW,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC,GACtD,MAAM,CA8CR"}
@@ -33,6 +33,7 @@ function coverageTypeTitle(type) {
33
33
  performance: 'Performance Coverage',
34
34
  resilience: 'Resilience Coverage',
35
35
  compatibility: 'Compatibility & Contract Coverage',
36
+ event: 'Event / Message Coverage',
36
37
  };
37
38
  return (_a = titles[type]) !== null && _a !== void 0 ? _a : `${type.charAt(0).toUpperCase()}${type.slice(1)} Coverage`;
38
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"summaryTypes.d.ts","sourceRoot":"","sources":["../../../src/summary/summaryTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,QAAQ,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,wDAAwD;IACxD,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,2DAA2D;AAC3D,eAAO,MAAM,kBAAkB,EAAE,MAAM,EAUtC,CAAC"}
1
+ {"version":3,"file":"summaryTypes.d.ts","sourceRoot":"","sources":["../../../src/summary/summaryTypes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,CAAC;AAE/D,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,QAAQ,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,wDAAwD;IACxD,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;IACrB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,2DAA2D;AAC3D,eAAO,MAAM,kBAAkB,EAAE,MAAM,EAWtC,CAAC"}
@@ -24,4 +24,5 @@ exports.KNOWN_METRIC_TYPES = [
24
24
  'performance',
25
25
  'resilience',
26
26
  'compatibility',
27
+ 'event',
27
28
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "api-tests-coverage",
3
- "version": "1.0.21",
3
+ "version": "1.0.22",
4
4
  "description": "CLI and library to measure how thoroughly your test suite exercises your API surface area",
5
5
  "main": "dist/src/lib/index.js",
6
6
  "types": "dist/src/lib/index.d.ts",