@supernal/interface 1.0.9 → 1.0.11

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 (147) hide show
  1. package/dist/cjs/src/browser.js +42 -1
  2. package/dist/cjs/src/browser.js.map +1 -1
  3. package/dist/cjs/src/decorators/ContainerHelpers.js +16 -1
  4. package/dist/cjs/src/decorators/ContainerHelpers.js.map +1 -1
  5. package/dist/cjs/src/decorators/Tool.js +2 -3
  6. package/dist/cjs/src/decorators/Tool.js.map +1 -1
  7. package/dist/cjs/src/testing/graph-tester/core/GraphTester.js +339 -0
  8. package/dist/cjs/src/testing/graph-tester/core/GraphTester.js.map +1 -0
  9. package/dist/cjs/src/testing/graph-tester/core/TestFunction.js +189 -0
  10. package/dist/cjs/src/testing/graph-tester/core/TestFunction.js.map +1 -0
  11. package/dist/cjs/src/testing/graph-tester/core/types.js +24 -0
  12. package/dist/cjs/src/testing/graph-tester/core/types.js.map +1 -0
  13. package/dist/cjs/src/testing/graph-tester/fixtures/index.js +13 -0
  14. package/dist/cjs/src/testing/graph-tester/fixtures/index.js.map +1 -0
  15. package/dist/cjs/src/testing/graph-tester/fixtures/portPool.js +184 -0
  16. package/dist/cjs/src/testing/graph-tester/fixtures/portPool.js.map +1 -0
  17. package/dist/cjs/src/testing/graph-tester/index.js +98 -0
  18. package/dist/cjs/src/testing/graph-tester/index.js.map +1 -0
  19. package/dist/cjs/src/testing/graph-tester/modes/AccessibilityMode.js +230 -0
  20. package/dist/cjs/src/testing/graph-tester/modes/AccessibilityMode.js.map +1 -0
  21. package/dist/cjs/src/testing/graph-tester/modes/PerformanceMode.js +168 -0
  22. package/dist/cjs/src/testing/graph-tester/modes/PerformanceMode.js.map +1 -0
  23. package/dist/cjs/src/testing/graph-tester/modes/SEOMode.js +264 -0
  24. package/dist/cjs/src/testing/graph-tester/modes/SEOMode.js.map +1 -0
  25. package/dist/cjs/src/testing/graph-tester/modes/VisualRegressionMode.js +199 -0
  26. package/dist/cjs/src/testing/graph-tester/modes/VisualRegressionMode.js.map +1 -0
  27. package/dist/cjs/src/testing/graph-tester/modes/index.js +17 -0
  28. package/dist/cjs/src/testing/graph-tester/modes/index.js.map +1 -0
  29. package/dist/cjs/src/testing/graph-tester/reporters/HTMLReporter.js +411 -0
  30. package/dist/cjs/src/testing/graph-tester/reporters/HTMLReporter.js.map +1 -0
  31. package/dist/cjs/src/testing/graph-tester/reporters/JSONReporter.js +127 -0
  32. package/dist/cjs/src/testing/graph-tester/reporters/JSONReporter.js.map +1 -0
  33. package/dist/cjs/src/testing/graph-tester/reporters/MarkdownReporter.js +169 -0
  34. package/dist/cjs/src/testing/graph-tester/reporters/MarkdownReporter.js.map +1 -0
  35. package/dist/cjs/src/testing/graph-tester/reporters/UnifiedReporter.js +118 -0
  36. package/dist/cjs/src/testing/graph-tester/reporters/UnifiedReporter.js.map +1 -0
  37. package/dist/cjs/src/testing/graph-tester/reporters/index.js +17 -0
  38. package/dist/cjs/src/testing/graph-tester/reporters/index.js.map +1 -0
  39. package/dist/cjs/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js +47 -0
  40. package/dist/cjs/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js.map +1 -0
  41. package/dist/cjs/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js +584 -0
  42. package/dist/cjs/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js.map +1 -0
  43. package/dist/cjs/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js +376 -0
  44. package/dist/cjs/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js.map +1 -0
  45. package/dist/cjs/src/testing/graph-tester/screenshot/index.js +15 -0
  46. package/dist/cjs/src/testing/graph-tester/screenshot/index.js.map +1 -0
  47. package/dist/cjs/src/testing/graph-tester/screenshot/types.js +11 -0
  48. package/dist/cjs/src/testing/graph-tester/screenshot/types.js.map +1 -0
  49. package/dist/cjs/src/testing/selectors.js +1 -1
  50. package/dist/esm/src/browser.d.ts +9 -0
  51. package/dist/esm/src/browser.d.ts.map +1 -1
  52. package/dist/esm/src/browser.js +14 -0
  53. package/dist/esm/src/browser.js.map +1 -1
  54. package/dist/esm/src/decorators/ContainerHelpers.d.ts +2 -1
  55. package/dist/esm/src/decorators/ContainerHelpers.d.ts.map +1 -1
  56. package/dist/esm/src/decorators/ContainerHelpers.js +16 -1
  57. package/dist/esm/src/decorators/ContainerHelpers.js.map +1 -1
  58. package/dist/esm/src/decorators/Tool.d.ts.map +1 -1
  59. package/dist/esm/src/decorators/Tool.js +2 -3
  60. package/dist/esm/src/decorators/Tool.js.map +1 -1
  61. package/dist/esm/src/testing/graph-tester/core/GraphTester.d.ts +110 -0
  62. package/dist/esm/src/testing/graph-tester/core/GraphTester.d.ts.map +1 -0
  63. package/dist/esm/src/testing/graph-tester/core/GraphTester.js +335 -0
  64. package/dist/esm/src/testing/graph-tester/core/GraphTester.js.map +1 -0
  65. package/dist/esm/src/testing/graph-tester/core/TestFunction.d.ts +120 -0
  66. package/dist/esm/src/testing/graph-tester/core/TestFunction.d.ts.map +1 -0
  67. package/dist/esm/src/testing/graph-tester/core/TestFunction.js +184 -0
  68. package/dist/esm/src/testing/graph-tester/core/TestFunction.js.map +1 -0
  69. package/dist/esm/src/testing/graph-tester/core/types.d.ts +331 -0
  70. package/dist/esm/src/testing/graph-tester/core/types.d.ts.map +1 -0
  71. package/dist/esm/src/testing/graph-tester/core/types.js +21 -0
  72. package/dist/esm/src/testing/graph-tester/core/types.js.map +1 -0
  73. package/dist/esm/src/testing/graph-tester/fixtures/index.d.ts +8 -0
  74. package/dist/esm/src/testing/graph-tester/fixtures/index.d.ts.map +1 -0
  75. package/dist/esm/src/testing/graph-tester/fixtures/index.js +7 -0
  76. package/dist/esm/src/testing/graph-tester/fixtures/index.js.map +1 -0
  77. package/dist/esm/src/testing/graph-tester/fixtures/portPool.d.ts +40 -0
  78. package/dist/esm/src/testing/graph-tester/fixtures/portPool.d.ts.map +1 -0
  79. package/dist/esm/src/testing/graph-tester/fixtures/portPool.js +147 -0
  80. package/dist/esm/src/testing/graph-tester/fixtures/portPool.js.map +1 -0
  81. package/dist/esm/src/testing/graph-tester/index.d.ts +84 -0
  82. package/dist/esm/src/testing/graph-tester/index.d.ts.map +1 -0
  83. package/dist/esm/src/testing/graph-tester/index.js +77 -0
  84. package/dist/esm/src/testing/graph-tester/index.js.map +1 -0
  85. package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.d.ts +40 -0
  86. package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.d.ts.map +1 -0
  87. package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.js +193 -0
  88. package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.js.map +1 -0
  89. package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.d.ts +42 -0
  90. package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.d.ts.map +1 -0
  91. package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.js +131 -0
  92. package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.js.map +1 -0
  93. package/dist/esm/src/testing/graph-tester/modes/SEOMode.d.ts +39 -0
  94. package/dist/esm/src/testing/graph-tester/modes/SEOMode.d.ts.map +1 -0
  95. package/dist/esm/src/testing/graph-tester/modes/SEOMode.js +227 -0
  96. package/dist/esm/src/testing/graph-tester/modes/SEOMode.js.map +1 -0
  97. package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.d.ts +83 -0
  98. package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.d.ts.map +1 -0
  99. package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.js +162 -0
  100. package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.js.map +1 -0
  101. package/dist/esm/src/testing/graph-tester/modes/index.d.ts +14 -0
  102. package/dist/esm/src/testing/graph-tester/modes/index.d.ts.map +1 -0
  103. package/dist/esm/src/testing/graph-tester/modes/index.js +10 -0
  104. package/dist/esm/src/testing/graph-tester/modes/index.js.map +1 -0
  105. package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.d.ts +38 -0
  106. package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.d.ts.map +1 -0
  107. package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.js +374 -0
  108. package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.js.map +1 -0
  109. package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.d.ts +50 -0
  110. package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.d.ts.map +1 -0
  111. package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.js +90 -0
  112. package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.js.map +1 -0
  113. package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.d.ts +33 -0
  114. package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.d.ts.map +1 -0
  115. package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.js +132 -0
  116. package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.js.map +1 -0
  117. package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.d.ts +30 -0
  118. package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.d.ts.map +1 -0
  119. package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.js +81 -0
  120. package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.js.map +1 -0
  121. package/dist/esm/src/testing/graph-tester/reporters/index.d.ts +14 -0
  122. package/dist/esm/src/testing/graph-tester/reporters/index.d.ts.map +1 -0
  123. package/dist/esm/src/testing/graph-tester/reporters/index.js +10 -0
  124. package/dist/esm/src/testing/graph-tester/reporters/index.js.map +1 -0
  125. package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.d.ts +33 -0
  126. package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.d.ts.map +1 -0
  127. package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js +43 -0
  128. package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js.map +1 -0
  129. package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.d.ts +70 -0
  130. package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.d.ts.map +1 -0
  131. package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js +547 -0
  132. package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js.map +1 -0
  133. package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.d.ts +83 -0
  134. package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.d.ts.map +1 -0
  135. package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js +339 -0
  136. package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js.map +1 -0
  137. package/dist/esm/src/testing/graph-tester/screenshot/index.d.ts +11 -0
  138. package/dist/esm/src/testing/graph-tester/screenshot/index.d.ts.map +1 -0
  139. package/dist/esm/src/testing/graph-tester/screenshot/index.js +9 -0
  140. package/dist/esm/src/testing/graph-tester/screenshot/index.js.map +1 -0
  141. package/dist/esm/src/testing/graph-tester/screenshot/types.d.ts +331 -0
  142. package/dist/esm/src/testing/graph-tester/screenshot/types.d.ts.map +1 -0
  143. package/dist/esm/src/testing/graph-tester/screenshot/types.js +10 -0
  144. package/dist/esm/src/testing/graph-tester/screenshot/types.js.map +1 -0
  145. package/dist/esm/src/testing/selectors.d.ts +1 -1
  146. package/dist/esm/src/testing/selectors.js +1 -1
  147. package/package.json +19 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSONReporter.d.ts","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/reporters/JSONReporter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAElB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,mDAAmD;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,YAAa,YAAW,QAAQ;IAC3C,QAAQ,CAAC,IAAI,mBAAmB;IAEhC,OAAO,CAAC,MAAM,CAA+B;gBAEjC,MAAM,EAAE,kBAAkB;IAStC;;;;OAIG;IACG,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;CAoD9D"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * JSON reporter for CI/CD integration.
3
+ *
4
+ * Generates machine-readable JSON output with complete test results.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ import * as fs from 'fs/promises';
9
+ import * as path from 'path';
10
+ /**
11
+ * JSON reporter.
12
+ *
13
+ * Generates structured JSON output suitable for CI/CD pipelines and
14
+ * programmatic analysis.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const reporter = new JSONReporter({
19
+ * outputDir: './test-results',
20
+ * filename: 'results.json',
21
+ * pretty: true
22
+ * });
23
+ *
24
+ * await reporter.generate(results);
25
+ * ```
26
+ */
27
+ export class JSONReporter {
28
+ constructor(config) {
29
+ this.name = 'JSON Reporter';
30
+ this.config = {
31
+ filename: 'test-results.json',
32
+ pretty: true,
33
+ includeErrorStacks: true,
34
+ ...config,
35
+ };
36
+ }
37
+ /**
38
+ * Generate JSON report.
39
+ *
40
+ * @param results - Aggregated test results
41
+ */
42
+ async generate(results) {
43
+ const startTime = Date.now();
44
+ // Ensure output directory exists
45
+ await fs.mkdir(this.config.outputDir, { recursive: true });
46
+ // Convert Map to plain objects for JSON serialization
47
+ const serializable = {
48
+ summary: {
49
+ routeCount: results.routeCount,
50
+ testCount: results.testCount,
51
+ passedCount: results.passedCount,
52
+ failedCount: results.failedCount,
53
+ passRate: results.passRate,
54
+ totalDuration: results.totalDuration,
55
+ timestamp: results.timestamp.toISOString(),
56
+ },
57
+ config: results.config,
58
+ resultsByRoute: Array.from(results.resultsByRoute.entries()).map(([route, testResults]) => ({
59
+ route,
60
+ results: testResults.map((r) => ({
61
+ ...r,
62
+ errors: this.config.includeErrorStacks
63
+ ? r.errors
64
+ : r.errors.map((e) => ({ ...e, stack: undefined })),
65
+ })),
66
+ })),
67
+ resultsByMode: Array.from(results.resultsByMode.entries()).map(([mode, testResults]) => ({
68
+ mode,
69
+ results: testResults.map((r) => ({
70
+ ...r,
71
+ errors: this.config.includeErrorStacks
72
+ ? r.errors
73
+ : r.errors.map((e) => ({ ...e, stack: undefined })),
74
+ })),
75
+ })),
76
+ errors: this.config.includeErrorStacks
77
+ ? results.errors
78
+ : results.errors.map((e) => ({ ...e, stack: undefined })),
79
+ };
80
+ // Write JSON file
81
+ const outputPath = path.join(this.config.outputDir, this.config.filename);
82
+ const json = this.config.pretty
83
+ ? JSON.stringify(serializable, null, 2)
84
+ : JSON.stringify(serializable);
85
+ await fs.writeFile(outputPath, json, 'utf-8');
86
+ const duration = Date.now() - startTime;
87
+ console.log(`JSON report generated in ${duration}ms: ${outputPath}`);
88
+ }
89
+ }
90
+ //# sourceMappingURL=JSONReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSONReporter.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/reporters/JSONReporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Markdown reporter (stub - to be implemented in Phase 2).
3
+ *
4
+ * Will generate GitHub-friendly markdown reports.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ import type { AggregatedTestResults, Reporter } from '../core/types';
9
+ /**
10
+ * Configuration for Markdown reporter.
11
+ */
12
+ export interface MarkdownReporterConfig {
13
+ /** Output directory */
14
+ outputDir: string;
15
+ /** Output filename (default: 'TEST_RESULTS.md') */
16
+ filename?: string;
17
+ /** Whether to include detailed error stacks */
18
+ includeErrorStacks?: boolean;
19
+ }
20
+ /**
21
+ * Markdown reporter (stub).
22
+ */
23
+ export declare class MarkdownReporter implements Reporter {
24
+ readonly name = "Markdown Reporter";
25
+ private config;
26
+ constructor(config: MarkdownReporterConfig);
27
+ generate(results: AggregatedTestResults): Promise<void>;
28
+ private generateMarkdown;
29
+ private getModeIcon;
30
+ private ensureDirectory;
31
+ private writeFile;
32
+ }
33
+ //# sourceMappingURL=MarkdownReporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownReporter.d.ts","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/reporters/MarkdownReporter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAElB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,QAAQ;IAC/C,QAAQ,CAAC,IAAI,uBAAuB;IAEpC,OAAO,CAAC,MAAM,CAAyB;gBAE3B,MAAM,EAAE,sBAAsB;IAIpC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7D,OAAO,CAAC,gBAAgB;IA4GxB,OAAO,CAAC,WAAW;YAUL,eAAe;YAKf,SAAS;CAIxB"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Markdown reporter (stub - to be implemented in Phase 2).
3
+ *
4
+ * Will generate GitHub-friendly markdown reports.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ /**
9
+ * Markdown reporter (stub).
10
+ */
11
+ export class MarkdownReporter {
12
+ constructor(config) {
13
+ this.name = 'Markdown Reporter';
14
+ this.config = config;
15
+ }
16
+ async generate(results) {
17
+ const markdown = this.generateMarkdown(results);
18
+ const outputPath = `${this.config.outputDir}/${this.config.filename || 'TEST_RESULTS.md'}`;
19
+ await this.ensureDirectory(this.config.outputDir);
20
+ await this.writeFile(outputPath, markdown);
21
+ console.log(`📝 Markdown report generated: ${outputPath}`);
22
+ }
23
+ generateMarkdown(results) {
24
+ const sections = [];
25
+ // Header
26
+ sections.push('# Graph-Based Testing Report\n');
27
+ sections.push(`> Generated on ${new Date().toLocaleString()}\n`);
28
+ // Summary
29
+ sections.push('## Summary\n');
30
+ sections.push('| Metric | Value |');
31
+ sections.push('|--------|-------|');
32
+ sections.push(`| Routes Tested | ${results.routeCount} |`);
33
+ sections.push(`| Total Tests | ${results.testCount} |`);
34
+ sections.push(`| Passed | ${results.passedCount} ✅ |`);
35
+ sections.push(`| Failed | ${results.failedCount} ❌ |`);
36
+ sections.push(`| Pass Rate | ${results.passRate}% |`);
37
+ sections.push(`| Total Duration | ${(results.totalDuration / 1000).toFixed(2)}s |`);
38
+ sections.push('');
39
+ // Status badge
40
+ const status = results.passRate === 100 ? '✅ All tests passed' : `⚠️ ${results.failedCount} test(s) failed`;
41
+ sections.push(`**Status:** ${status}\n`);
42
+ // Results by mode
43
+ sections.push('## Results by Test Mode\n');
44
+ for (const [mode, modeResults] of results.resultsByMode) {
45
+ const passed = modeResults.filter((r) => r.passed).length;
46
+ const failed = modeResults.filter((r) => !r.passed).length;
47
+ const icon = this.getModeIcon(mode);
48
+ sections.push(`### ${icon} ${mode.toUpperCase()}\n`);
49
+ sections.push(`- **Passed:** ${passed} ✅`);
50
+ sections.push(`- **Failed:** ${failed} ❌`);
51
+ sections.push(`- **Total:** ${modeResults.length}`);
52
+ sections.push('');
53
+ }
54
+ // Results by route
55
+ sections.push('## Test Results by Route\n');
56
+ for (const [route, routeResults] of results.resultsByRoute) {
57
+ sections.push(`### \`${route}\`\n`);
58
+ sections.push('| Mode | Status | Duration | Errors |');
59
+ sections.push('|------|--------|----------|--------|');
60
+ for (const result of routeResults) {
61
+ const status = result.passed ? '✅ PASS' : '❌ FAIL';
62
+ const errors = result.errors.length > 0 ? result.errors.length : '-';
63
+ sections.push(`| ${result.mode} | ${status} | ${result.duration}ms | ${errors} |`);
64
+ }
65
+ // Show errors if any
66
+ const failedResults = routeResults.filter((r) => !r.passed);
67
+ if (failedResults.length > 0) {
68
+ sections.push('\n**Errors:**\n');
69
+ for (const result of failedResults) {
70
+ if (result.errors.length > 0) {
71
+ sections.push(`<details>`);
72
+ sections.push(`<summary><strong>${result.mode}</strong> - ${result.errors.length} error(s)</summary>\n`);
73
+ sections.push('```');
74
+ result.errors.forEach((err) => sections.push(typeof err === 'string' ? err : err.message));
75
+ sections.push('```');
76
+ sections.push('</details>\n');
77
+ }
78
+ }
79
+ }
80
+ sections.push('');
81
+ }
82
+ // Detailed mode breakdown
83
+ sections.push('## Detailed Mode Analysis\n');
84
+ for (const [mode, modeResults] of results.resultsByMode) {
85
+ const icon = this.getModeIcon(mode);
86
+ sections.push(`### ${icon} ${mode.toUpperCase()} Mode\n`);
87
+ const passed = modeResults.filter((r) => r.passed).length;
88
+ const failed = modeResults.filter((r) => !r.passed).length;
89
+ const avgDuration = modeResults.reduce((sum, r) => sum + r.duration, 0) / modeResults.length;
90
+ sections.push(`**Performance:**`);
91
+ sections.push(`- Average Duration: ${avgDuration.toFixed(2)}ms`);
92
+ sections.push(`- Success Rate: ${((passed / modeResults.length) * 100).toFixed(1)}%`);
93
+ sections.push('');
94
+ // Show failed routes for this mode
95
+ const failures = modeResults.filter((r) => !r.passed);
96
+ if (failures.length > 0) {
97
+ sections.push('**Failed Routes:**\n');
98
+ for (const result of failures) {
99
+ sections.push(`- \`${result.route || 'unknown'}\``);
100
+ if (this.config.includeErrorStacks && result.errors.length > 0) {
101
+ sections.push(' ```');
102
+ result.errors.forEach((err) => sections.push(` ${typeof err === 'string' ? err : err.message}`));
103
+ sections.push(' ```');
104
+ }
105
+ }
106
+ sections.push('');
107
+ }
108
+ }
109
+ // Footer
110
+ sections.push('---\n');
111
+ sections.push('_Generated by Supernal Interface Graph-Based Testing Framework_');
112
+ return sections.join('\n');
113
+ }
114
+ getModeIcon(mode) {
115
+ const icons = {
116
+ visual: '👁️',
117
+ performance: '⚡',
118
+ accessibility: '♿',
119
+ seo: '🔍',
120
+ };
121
+ return icons[mode] || '📊';
122
+ }
123
+ async ensureDirectory(dir) {
124
+ const fs = await import('fs/promises');
125
+ await fs.mkdir(dir, { recursive: true });
126
+ }
127
+ async writeFile(path, content) {
128
+ const fs = await import('fs/promises');
129
+ await fs.writeFile(path, content, 'utf-8');
130
+ }
131
+ }
132
+ //# sourceMappingURL=MarkdownReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownReporter.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/reporters/MarkdownReporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Unified reporter - orchestrates multiple reporters and correlates results across modes.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ import type { AggregatedTestResults, Reporter } from '../core/types';
7
+ /**
8
+ * Configuration for unified reporter.
9
+ */
10
+ export interface UnifiedReporterConfig {
11
+ /** Output directory */
12
+ outputDir: string;
13
+ /** Report formats to generate */
14
+ formats: ('json' | 'html' | 'markdown' | 'csv')[];
15
+ /** Whether to include detailed logs */
16
+ includeDetailedLogs?: boolean;
17
+ }
18
+ /**
19
+ * Unified reporter (stub).
20
+ */
21
+ export declare class UnifiedReporter implements Reporter {
22
+ readonly name = "Unified Reporter";
23
+ private config;
24
+ constructor(config: UnifiedReporterConfig);
25
+ generate(results: AggregatedTestResults): Promise<void>;
26
+ private generateCSV;
27
+ private ensureDirectory;
28
+ private writeFile;
29
+ }
30
+ //# sourceMappingURL=UnifiedReporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnifiedReporter.d.ts","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/reporters/UnifiedReporter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAKrE;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAElB,iCAAiC;IACjC,OAAO,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC;IAElD,uCAAuC;IACvC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,QAAQ,CAAC,IAAI,sBAAsB;IAEnC,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,EAAE,qBAAqB;IAInC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;YAmD/C,WAAW;YAwBX,eAAe;YAKf,SAAS;CAIxB"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Unified reporter - orchestrates multiple reporters and correlates results across modes.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ import { JSONReporter } from './JSONReporter.js';
7
+ import { HTMLReporter } from './HTMLReporter.js';
8
+ import { MarkdownReporter } from './MarkdownReporter.js';
9
+ /**
10
+ * Unified reporter (stub).
11
+ */
12
+ export class UnifiedReporter {
13
+ constructor(config) {
14
+ this.name = 'Unified Reporter';
15
+ this.config = config;
16
+ }
17
+ async generate(results) {
18
+ console.log(`\n📊 Generating unified reports in ${this.config.formats.length} format(s)...\n`);
19
+ const reporters = [];
20
+ // Create reporters based on requested formats
21
+ if (this.config.formats.includes('json')) {
22
+ reporters.push(new JSONReporter({
23
+ outputDir: this.config.outputDir,
24
+ filename: 'results.json',
25
+ pretty: true,
26
+ }));
27
+ }
28
+ if (this.config.formats.includes('html')) {
29
+ reporters.push(new HTMLReporter({
30
+ outputDir: this.config.outputDir,
31
+ filename: 'index.html',
32
+ includeCharts: true,
33
+ }));
34
+ }
35
+ if (this.config.formats.includes('markdown')) {
36
+ reporters.push(new MarkdownReporter({
37
+ outputDir: this.config.outputDir,
38
+ filename: 'TEST_RESULTS.md',
39
+ includeErrorStacks: this.config.includeDetailedLogs,
40
+ }));
41
+ }
42
+ if (this.config.formats.includes('csv')) {
43
+ reporters.push({
44
+ name: 'CSV Reporter',
45
+ generate: async (results) => {
46
+ await this.generateCSV(results);
47
+ },
48
+ });
49
+ }
50
+ // Generate all reports in parallel
51
+ await Promise.all(reporters.map((reporter) => reporter.generate(results)));
52
+ console.log(`✅ Unified report generation complete\n`);
53
+ }
54
+ async generateCSV(results) {
55
+ const rows = [];
56
+ // CSV header
57
+ rows.push('Route,Mode,Status,Duration (ms),Errors');
58
+ // CSV data
59
+ for (const [route, routeResults] of results.resultsByRoute) {
60
+ for (const result of routeResults) {
61
+ const status = result.passed ? 'PASS' : 'FAIL';
62
+ const errors = result.errors.length > 0 ? `"${result.errors.join('; ')}"` : '';
63
+ rows.push(`"${route}",${result.mode},${status},${result.duration},${errors}`);
64
+ }
65
+ }
66
+ const csv = rows.join('\n');
67
+ const outputPath = `${this.config.outputDir}/results.csv`;
68
+ await this.ensureDirectory(this.config.outputDir);
69
+ await this.writeFile(outputPath, csv);
70
+ console.log(`📊 CSV report generated: ${outputPath}`);
71
+ }
72
+ async ensureDirectory(dir) {
73
+ const fs = await import('fs/promises');
74
+ await fs.mkdir(dir, { recursive: true });
75
+ }
76
+ async writeFile(path, content) {
77
+ const fs = await import('fs/promises');
78
+ await fs.writeFile(path, content, 'utf-8');
79
+ }
80
+ }
81
+ //# sourceMappingURL=UnifiedReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnifiedReporter.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/reporters/UnifiedReporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Reporters exports.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ export { UnifiedReporter } from './UnifiedReporter';
7
+ export type { UnifiedReporterConfig } from './UnifiedReporter';
8
+ export { JSONReporter } from './JSONReporter';
9
+ export type { JSONReporterConfig } from './JSONReporter';
10
+ export { HTMLReporter } from './HTMLReporter';
11
+ export type { HTMLReporterConfig } from './HTMLReporter';
12
+ export { MarkdownReporter } from './MarkdownReporter';
13
+ export type { MarkdownReporterConfig } from './MarkdownReporter';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/reporters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Reporters exports.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ export { UnifiedReporter } from './UnifiedReporter.js';
7
+ export { JSONReporter } from './JSONReporter.js';
8
+ export { HTMLReporter } from './HTMLReporter.js';
9
+ export { MarkdownReporter } from './MarkdownReporter.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/reporters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Canvas annotation renderer (stub - to be implemented in Phase 3).
3
+ *
4
+ * Will render bounding boxes directly on screenshot canvas.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ import type { AnnotatedScreenshot, CanvasRendererConfig, AnnotationRenderResult } from './types';
9
+ /**
10
+ * Canvas annotation renderer (stub).
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const renderer = new CanvasAnnotationRenderer({
15
+ * drawLabels: true,
16
+ * outputPath: './screenshots/dashboard-annotated.png'
17
+ * });
18
+ *
19
+ * const result = await renderer.render(annotatedScreenshot);
20
+ * ```
21
+ */
22
+ export declare class CanvasAnnotationRenderer {
23
+ private config;
24
+ constructor(config: CanvasRendererConfig);
25
+ /**
26
+ * Render annotated screenshot with canvas overlay.
27
+ *
28
+ * @param screenshot - Annotated screenshot
29
+ * @returns Render result
30
+ */
31
+ render(screenshot: AnnotatedScreenshot): Promise<AnnotationRenderResult>;
32
+ }
33
+ //# sourceMappingURL=CanvasAnnotationRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CanvasAnnotationRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACvB,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;GAYG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,MAAM,CAAuB;gBAEzB,MAAM,EAAE,oBAAoB;IAUxC;;;;;OAKG;IACG,MAAM,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,sBAAsB,CAAC;CAK/E"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Canvas annotation renderer (stub - to be implemented in Phase 3).
3
+ *
4
+ * Will render bounding boxes directly on screenshot canvas.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ /**
9
+ * Canvas annotation renderer (stub).
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * const renderer = new CanvasAnnotationRenderer({
14
+ * drawLabels: true,
15
+ * outputPath: './screenshots/dashboard-annotated.png'
16
+ * });
17
+ *
18
+ * const result = await renderer.render(annotatedScreenshot);
19
+ * ```
20
+ */
21
+ export class CanvasAnnotationRenderer {
22
+ constructor(config) {
23
+ this.config = {
24
+ drawLabels: true,
25
+ labelFontSize: 12,
26
+ boundingBoxColor: '#00ff00',
27
+ boundingBoxWidth: 2,
28
+ ...config,
29
+ };
30
+ }
31
+ /**
32
+ * Render annotated screenshot with canvas overlay.
33
+ *
34
+ * @param screenshot - Annotated screenshot
35
+ * @returns Render result
36
+ */
37
+ async render(screenshot) {
38
+ // TODO: Implement in Phase 3
39
+ // Will use canvas/sharp to draw bounding boxes on screenshot
40
+ throw new Error('CanvasAnnotationRenderer not yet implemented (Phase 3)');
41
+ }
42
+ }
43
+ //# sourceMappingURL=CanvasAnnotationRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CanvasAnnotationRenderer.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,wBAAwB;IAGnC,YAAY,MAA4B;QACtC,IAAI,CAAC,MAAM,GAAG;YACZ,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,EAAE;YACjB,gBAAgB,EAAE,SAAS;YAC3B,gBAAgB,EAAE,CAAC;YACnB,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,UAA+B;QAC1C,6BAA6B;QAC7B,6DAA6D;QAC7D,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;CACF"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * HTML annotation renderer.
3
+ *
4
+ * Generates interactive HTML overlay with:
5
+ * - Hoverable bounding boxes
6
+ * - Sidebar with annotation details
7
+ * - Click-to-highlight functionality
8
+ * - Search/filter capabilities
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ import type { AnnotatedScreenshot, HTMLRendererConfig, AnnotationRenderResult } from './types';
13
+ /**
14
+ * HTML annotation renderer.
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * const renderer = new HTMLAnnotationRenderer({
19
+ * includeSidebar: true,
20
+ * enableHover: true,
21
+ * outputPath: './screenshots/dashboard.html'
22
+ * });
23
+ *
24
+ * const result = await renderer.render(annotatedScreenshot);
25
+ * console.log(`HTML rendered: ${result.outputPath}`);
26
+ * ```
27
+ */
28
+ export declare class HTMLAnnotationRenderer {
29
+ private config;
30
+ constructor(config: HTMLRendererConfig);
31
+ /**
32
+ * Render annotated screenshot as interactive HTML.
33
+ *
34
+ * @param screenshot - Annotated screenshot
35
+ * @returns Render result
36
+ */
37
+ render(screenshot: AnnotatedScreenshot): Promise<AnnotationRenderResult>;
38
+ /**
39
+ * Generate complete HTML document.
40
+ *
41
+ * @param screenshot - Annotated screenshot
42
+ * @returns HTML string
43
+ */
44
+ private generateHTML;
45
+ /**
46
+ * Get sidebar CSS styles.
47
+ */
48
+ private getSidebarStyles;
49
+ /**
50
+ * Render annotation bounding boxes.
51
+ */
52
+ private renderAnnotationBoxes;
53
+ /**
54
+ * Render sidebar with annotation list.
55
+ */
56
+ private renderSidebar;
57
+ /**
58
+ * Render annotation item for sidebar.
59
+ */
60
+ private renderAnnotationItem;
61
+ /**
62
+ * Generate JavaScript for interactivity.
63
+ */
64
+ private generateJavaScript;
65
+ /**
66
+ * Escape HTML entities.
67
+ */
68
+ private escapeHtml;
69
+ }
70
+ //# sourceMappingURL=HTMLAnnotationRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HTMLAnnotationRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EACV,mBAAmB,EAEnB,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;;GAcG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,EAAE,kBAAkB;IAWtC;;;;;OAKG;IACG,MAAM,CAAC,UAAU,EAAE,mBAAmB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAmB9E;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IA8GpB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA+JxB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA4B7B;;OAEG;IACH,OAAO,CAAC,aAAa;IAoCrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA0C5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkG1B;;OAEG;IACH,OAAO,CAAC,UAAU;CAUnB"}