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.
- package/dist/dashboard/dist/assets/_basePickBy-BKGHUeDJ.js +1 -0
- package/dist/dashboard/dist/assets/_baseUniq-CtA-DQF7.js +1 -0
- package/dist/dashboard/dist/assets/arc-CbXP3Mc9.js +1 -0
- package/dist/dashboard/dist/assets/architectureDiagram-VXUJARFQ-n7QxasMM.js +36 -0
- package/dist/dashboard/dist/assets/blockDiagram-VD42YOAC-MXnGwKRn.js +122 -0
- package/dist/dashboard/dist/assets/c4Diagram-YG6GDRKO-B3yZ5P9k.js +10 -0
- package/dist/dashboard/dist/assets/channel-C7QwX7U8.js +1 -0
- package/dist/dashboard/dist/assets/chunk-4BX2VUAB-Dw3El5KF.js +1 -0
- package/dist/dashboard/dist/assets/chunk-55IACEB6-T8Jf00IL.js +1 -0
- package/dist/dashboard/dist/assets/chunk-B4BG7PRW-DAJalKYJ.js +165 -0
- package/dist/dashboard/dist/assets/chunk-DI55MBZ5-p7o_KuDF.js +220 -0
- package/dist/dashboard/dist/assets/chunk-FMBD7UC4-B0wUAfQR.js +15 -0
- package/dist/dashboard/dist/assets/chunk-QN33PNHL-BTFwTEw8.js +1 -0
- package/dist/dashboard/dist/assets/chunk-QZHKN3VN-CNXHnjkC.js +1 -0
- package/dist/dashboard/dist/assets/chunk-TZMSLE5B-BIVywBYp.js +1 -0
- package/dist/dashboard/dist/assets/classDiagram-2ON5EDUG-Dkb-G0UK.js +1 -0
- package/dist/dashboard/dist/assets/classDiagram-v2-WZHVMYZB-Dkb-G0UK.js +1 -0
- package/dist/dashboard/dist/assets/clone-BSdXhKmH.js +1 -0
- package/dist/dashboard/dist/assets/cose-bilkent-S5V4N54A-DuALhY5a.js +1 -0
- package/dist/dashboard/dist/assets/cytoscape.esm-CyJtwmzi.js +331 -0
- package/dist/dashboard/dist/assets/dagre-6UL2VRFP-w6endfy9.js +4 -0
- package/dist/dashboard/dist/assets/diagram-PSM6KHXK-BDnUwPQC.js +24 -0
- package/dist/dashboard/dist/assets/diagram-QEK2KX5R-Cbb7ctAo.js +43 -0
- package/dist/dashboard/dist/assets/diagram-S2PKOQOG-76ascveh.js +24 -0
- package/dist/dashboard/dist/assets/erDiagram-Q2GNP2WA-BQQnVF0J.js +60 -0
- package/dist/dashboard/dist/assets/flowDiagram-NV44I4VS-dKukiSxD.js +162 -0
- package/dist/dashboard/dist/assets/ganttDiagram-JELNMOA3-BqnazZuZ.js +267 -0
- package/dist/dashboard/dist/assets/gitGraphDiagram-V2S2FVAM-BUFcnXCj.js +65 -0
- package/dist/dashboard/dist/assets/graph-CGQIvL3r.js +1 -0
- package/dist/dashboard/dist/assets/index-CadOHtae.css +1 -0
- package/dist/dashboard/dist/assets/index-DwqfA4mc.js +777 -0
- package/dist/dashboard/dist/assets/infoDiagram-HS3SLOUP-BdylFPLI.js +2 -0
- package/dist/dashboard/dist/assets/journeyDiagram-XKPGCS4Q-BzJTBkhp.js +139 -0
- package/dist/dashboard/dist/assets/kanban-definition-3W4ZIXB7-StKomgio.js +89 -0
- package/dist/dashboard/dist/assets/katex-O9d3_IXG.js +261 -0
- package/dist/dashboard/dist/assets/layout-BnsX73QS.js +1 -0
- package/dist/dashboard/dist/assets/mindmap-definition-VGOIOE7T-HqFRhVFX.js +68 -0
- package/dist/dashboard/dist/assets/pieDiagram-ADFJNKIX-2I2tFH0C.js +30 -0
- package/dist/dashboard/dist/assets/quadrantDiagram-AYHSOK5B-PlELkdBW.js +7 -0
- package/dist/dashboard/dist/assets/requirementDiagram-UZGBJVZJ-_9eLQNcZ.js +64 -0
- package/dist/dashboard/dist/assets/sankeyDiagram-TZEHDZUN-DHl1Ss7O.js +10 -0
- package/dist/dashboard/dist/assets/sequenceDiagram-WL72ISMW-B9p0m3Uf.js +145 -0
- package/dist/dashboard/dist/assets/stateDiagram-FKZM4ZOC--rpDODjT.js +1 -0
- package/dist/dashboard/dist/assets/stateDiagram-v2-4FDKWEC3-Ca9uGk46.js +1 -0
- package/dist/dashboard/dist/assets/timeline-definition-IT6M3QCI-BCHaGBHB.js +61 -0
- package/dist/dashboard/dist/assets/treemap-GDKQZRPO-CgiqDY8M.js +162 -0
- package/dist/dashboard/dist/assets/xychartDiagram-PRI3JC2R-BMvBBbeV.js +7 -0
- package/dist/dashboard/dist/index.html +14 -0
- package/dist/dashboard/dist/reports/business-coverage.json +201 -0
- package/dist/dashboard/dist/reports/coverage-intelligence.json +728 -0
- package/dist/dashboard/dist/reports/coverage-summary.json +995 -0
- package/dist/dashboard/dist/reports/endpoint-coverage.json +336 -0
- package/dist/dashboard/dist/reports/error-coverage.json +367 -0
- package/dist/dashboard/dist/reports/missing-tests-recommendations.json +285 -0
- package/dist/dashboard/dist/reports/risk-prioritization.json +312 -0
- package/dist/dashboard/dist/reports/security-coverage.json +299 -0
- package/dist/dashboard/dist/vite.svg +1 -0
- package/dist/src/generation/context-builder.d.ts +6 -0
- package/dist/src/generation/context-builder.d.ts.map +1 -0
- package/dist/src/generation/context-builder.js +202 -0
- package/dist/src/generation/engine.d.ts +40 -0
- package/dist/src/generation/engine.d.ts.map +1 -0
- package/dist/src/generation/engine.js +378 -0
- package/dist/src/generation/file-router.d.ts +7 -0
- package/dist/src/generation/file-router.d.ts.map +1 -0
- package/dist/src/generation/file-router.js +79 -0
- package/dist/src/generation/gap-extractor.d.ts +12 -0
- package/dist/src/generation/gap-extractor.d.ts.map +1 -0
- package/dist/src/generation/gap-extractor.js +281 -0
- package/dist/src/generation/template-renderer.d.ts +10 -0
- package/dist/src/generation/template-renderer.d.ts.map +1 -0
- package/dist/src/generation/template-renderer.js +526 -0
- package/dist/src/generation/types.d.ts +73 -0
- package/dist/src/generation/types.d.ts.map +1 -0
- package/dist/src/generation/types.js +2 -0
- package/dist/src/index.js +154 -0
- package/dist/src/pipeline/detectors/expressMiddlewareDetector.d.ts +21 -0
- package/dist/src/pipeline/detectors/expressMiddlewareDetector.d.ts.map +1 -0
- package/dist/src/pipeline/detectors/expressMiddlewareDetector.js +201 -0
- package/dist/src/pipeline/detectors/flaskBlueprintDetector.d.ts +23 -0
- package/dist/src/pipeline/detectors/flaskBlueprintDetector.d.ts.map +1 -0
- package/dist/src/pipeline/detectors/flaskBlueprintDetector.js +263 -0
- package/dist/src/pipeline/detectors/springDddDetector.d.ts +23 -0
- package/dist/src/pipeline/detectors/springDddDetector.d.ts.map +1 -0
- package/dist/src/pipeline/detectors/springDddDetector.js +237 -0
- package/dist/src/pipeline/detectors/types.d.ts +97 -0
- package/dist/src/pipeline/detectors/types.d.ts.map +1 -0
- package/dist/src/pipeline/detectors/types.js +15 -0
- package/dist/src/reporting.d.ts.map +1 -1
- package/dist/src/reporting.js +2 -1
- package/dist/src/streaming/detectors/eventBridgeDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/eventBridgeDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/eventBridgeDetector.js +82 -0
- package/dist/src/streaming/detectors/kafkaDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/kafkaDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/kafkaDetector.js +97 -0
- package/dist/src/streaming/detectors/natsDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/natsDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/natsDetector.js +96 -0
- package/dist/src/streaming/detectors/pubsubDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/pubsubDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/pubsubDetector.js +82 -0
- package/dist/src/streaming/detectors/rabbitmqDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/rabbitmqDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/rabbitmqDetector.js +103 -0
- package/dist/src/streaming/detectors/redisPubsubDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/redisPubsubDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/redisPubsubDetector.js +81 -0
- package/dist/src/streaming/detectors/snsDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/snsDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/snsDetector.js +81 -0
- package/dist/src/streaming/detectors/sqsDetector.d.ts +5 -0
- package/dist/src/streaming/detectors/sqsDetector.d.ts.map +1 -0
- package/dist/src/streaming/detectors/sqsDetector.js +81 -0
- package/dist/src/streaming/eventCoverage.d.ts +46 -0
- package/dist/src/streaming/eventCoverage.d.ts.map +1 -0
- package/dist/src/streaming/eventCoverage.js +270 -0
- package/dist/src/streaming/types.d.ts +34 -0
- package/dist/src/streaming/types.d.ts.map +1 -0
- package/dist/src/streaming/types.js +2 -0
- package/dist/src/summary/markdownRenderer.d.ts.map +1 -1
- package/dist/src/summary/markdownRenderer.js +1 -0
- package/dist/src/summary/summaryTypes.d.ts.map +1 -1
- package/dist/src/summary/summaryTypes.js +1 -0
- 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 @@
|
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
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,
|
|
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,
|
|
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"}
|
package/package.json
CHANGED