@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,162 @@
1
+ /**
2
+ * Visual regression testing mode.
3
+ *
4
+ * Captures screenshots with element annotations for visual regression testing and AI analysis.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ import { TestFunction } from '../core/TestFunction.js';
9
+ import { ScreenshotAnnotator, HTMLAnnotationRenderer, } from '../screenshot/index.js';
10
+ import * as path from 'path';
11
+ /**
12
+ * Visual regression testing mode.
13
+ *
14
+ * Captures full-page screenshots with element annotations, bounding boxes,
15
+ * and generates interactive HTML overlays for review.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const mode = new VisualRegressionMode({
20
+ * outputDir: './screenshots',
21
+ * annotate: true,
22
+ * generateHTML: true
23
+ * });
24
+ *
25
+ * const tester = new GraphTester({
26
+ * baseUrl: 'http://localhost:3000',
27
+ * routes: [{ route: '/' }],
28
+ * modes: []
29
+ * });
30
+ *
31
+ * tester.registerTestFunction(mode);
32
+ * const results = await tester.runTests();
33
+ * ```
34
+ */
35
+ export class VisualRegressionMode extends TestFunction {
36
+ constructor(config) {
37
+ super();
38
+ this.mode = 'visual';
39
+ this.name = 'Visual Regression';
40
+ this.description = 'Captures screenshots with element annotations for visual regression testing';
41
+ this.annotator = null;
42
+ this.config = {
43
+ fullPage: true,
44
+ annotate: true,
45
+ generateHTML: true,
46
+ includeInvisible: false,
47
+ minElementSize: 5,
48
+ aiAnalyze: false,
49
+ ...config,
50
+ };
51
+ }
52
+ /**
53
+ * Setup: Initialize screenshot annotator.
54
+ */
55
+ async setup(page) {
56
+ if (this.config.annotate) {
57
+ this.annotator = new ScreenshotAnnotator({
58
+ outputDir: this.config.outputDir,
59
+ fullPage: this.config.fullPage,
60
+ includeInvisible: this.config.includeInvisible,
61
+ minElementSize: this.config.minElementSize,
62
+ ...this.config.annotatorConfig,
63
+ });
64
+ }
65
+ }
66
+ /**
67
+ * Execute: Capture screenshot and annotations.
68
+ */
69
+ async execute(page, context) {
70
+ const startTime = Date.now();
71
+ const errors = [];
72
+ const metadata = {};
73
+ try {
74
+ // Capture annotated screenshot
75
+ if (this.annotator) {
76
+ const viewportLabel = context.viewport ? ` [${context.viewport.name}]` : '';
77
+ console.log(`Capturing annotated screenshot for ${context.route}${viewportLabel}...`);
78
+ const annotatedScreenshot = await this.annotator.capture(page, context.route, context.viewport?.name);
79
+ metadata.screenshot = {
80
+ path: annotatedScreenshot.screenshotPath,
81
+ annotationCount: annotatedScreenshot.annotations.length,
82
+ interactiveElementCount: annotatedScreenshot.annotations.filter((a) => a.isInteractive)
83
+ .length,
84
+ pageSize: annotatedScreenshot.pageMetadata.pageSize,
85
+ viewport: annotatedScreenshot.pageMetadata.viewport,
86
+ };
87
+ // Generate HTML overlay
88
+ if (this.config.generateHTML) {
89
+ const htmlPath = annotatedScreenshot.screenshotPath.replace('.png', '.html');
90
+ const renderer = new HTMLAnnotationRenderer({
91
+ outputPath: htmlPath,
92
+ includeSidebar: true,
93
+ enableHover: true,
94
+ enableClickToHighlight: true,
95
+ ...this.config.htmlRendererConfig,
96
+ });
97
+ const renderResult = await renderer.render(annotatedScreenshot);
98
+ metadata.htmlOverlay = {
99
+ path: renderResult.outputPath,
100
+ fileSize: renderResult.fileSize,
101
+ duration: renderResult.duration,
102
+ };
103
+ console.log(`Generated HTML overlay: ${renderResult.outputPath}`);
104
+ }
105
+ // AI analysis (enterprise only)
106
+ if (this.config.aiAnalyze) {
107
+ errors.push({
108
+ severity: 'info',
109
+ message: 'AI analysis requires @supernalintelligence/interface-enterprise',
110
+ });
111
+ }
112
+ }
113
+ else {
114
+ // Simple screenshot without annotations
115
+ const screenshotPath = path.join(this.config.outputDir, `${this.sanitizeRoute(context.route)}.png`);
116
+ await page.screenshot({
117
+ path: screenshotPath,
118
+ fullPage: this.config.fullPage,
119
+ });
120
+ metadata.screenshot = {
121
+ path: screenshotPath,
122
+ };
123
+ }
124
+ return {
125
+ passed: true,
126
+ duration: Date.now() - startTime,
127
+ errors,
128
+ metadata,
129
+ };
130
+ }
131
+ catch (error) {
132
+ errors.push({
133
+ severity: 'critical',
134
+ message: `Visual regression failed: ${error instanceof Error ? error.message : String(error)}`,
135
+ stack: error instanceof Error ? error.stack : undefined,
136
+ });
137
+ return {
138
+ passed: false,
139
+ duration: Date.now() - startTime,
140
+ errors,
141
+ metadata,
142
+ };
143
+ }
144
+ }
145
+ /**
146
+ * Sanitize route for filename.
147
+ */
148
+ sanitizeRoute(route) {
149
+ return route.replace(/^\//, '').replace(/\//g, '-') || 'home';
150
+ }
151
+ /**
152
+ * Validate configuration.
153
+ */
154
+ validate() {
155
+ const errors = super.validate();
156
+ if (!this.config.outputDir) {
157
+ errors.push('outputDir is required');
158
+ }
159
+ return errors;
160
+ }
161
+ }
162
+ //# sourceMappingURL=VisualRegressionMode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VisualRegressionMode.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/modes/VisualRegressionMode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Test modes exports.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ export { VisualRegressionMode } from './VisualRegressionMode';
7
+ export type { VisualRegressionConfig } from './VisualRegressionMode';
8
+ export { PerformanceMode } from './PerformanceMode';
9
+ export type { PerformanceConfig } from './PerformanceMode';
10
+ export { AccessibilityMode } from './AccessibilityMode';
11
+ export type { AccessibilityConfig } from './AccessibilityMode';
12
+ export { SEOMode } from './SEOMode';
13
+ export type { SEOConfig } from './SEOMode';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/modes/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Test modes exports.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ export { VisualRegressionMode } from './VisualRegressionMode.js';
7
+ export { PerformanceMode } from './PerformanceMode.js';
8
+ export { AccessibilityMode } from './AccessibilityMode.js';
9
+ export { SEOMode } from './SEOMode.js';
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/modes/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * HTML reporter (stub - to be implemented in Phase 2).
3
+ *
4
+ * Will generate interactive dashboard with charts and drill-down.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ import type { AggregatedTestResults, Reporter } from '../core/types';
9
+ /**
10
+ * Configuration for HTML reporter.
11
+ */
12
+ export interface HTMLReporterConfig {
13
+ /** Output directory */
14
+ outputDir: string;
15
+ /** Output filename (default: 'index.html') */
16
+ filename?: string;
17
+ /** Whether to include charts (default: true) */
18
+ includeCharts?: boolean;
19
+ }
20
+ /**
21
+ * HTML reporter (stub).
22
+ */
23
+ export declare class HTMLReporter implements Reporter {
24
+ readonly name = "HTML Reporter";
25
+ private config;
26
+ constructor(config: HTMLReporterConfig);
27
+ generate(results: AggregatedTestResults): Promise<void>;
28
+ private generateHTML;
29
+ private generateSummarySection;
30
+ private generateChartsSection;
31
+ private generateResultsTable;
32
+ private generateModeBreakdown;
33
+ private generateId;
34
+ private escapeHtml;
35
+ private ensureDirectory;
36
+ private writeFile;
37
+ }
38
+ //# sourceMappingURL=HTMLReporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HTMLReporter.d.ts","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/reporters/HTMLReporter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAElB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,gDAAgD;IAChD,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,YAAa,YAAW,QAAQ;IAC3C,QAAQ,CAAC,IAAI,mBAAmB;IAEhC,OAAO,CAAC,MAAM,CAAqB;gBAEvB,MAAM,EAAE,kBAAkB;IAIhC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7D,OAAO,CAAC,YAAY;IAmMpB,OAAO,CAAC,sBAAsB;IA8B9B,OAAO,CAAC,qBAAqB;IAoC7B,OAAO,CAAC,oBAAoB;IAoD5B,OAAO,CAAC,qBAAqB;IAgC7B,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,UAAU;YAWJ,eAAe;YAKf,SAAS;CAIxB"}
@@ -0,0 +1,374 @@
1
+ /**
2
+ * HTML reporter (stub - to be implemented in Phase 2).
3
+ *
4
+ * Will generate interactive dashboard with charts and drill-down.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ /**
9
+ * HTML reporter (stub).
10
+ */
11
+ export class HTMLReporter {
12
+ constructor(config) {
13
+ this.name = 'HTML Reporter';
14
+ this.config = config;
15
+ }
16
+ async generate(results) {
17
+ const html = this.generateHTML(results);
18
+ const outputPath = `${this.config.outputDir}/${this.config.filename || 'index.html'}`;
19
+ await this.ensureDirectory(this.config.outputDir);
20
+ await this.writeFile(outputPath, html);
21
+ console.log(`📊 HTML report generated: ${outputPath}`);
22
+ }
23
+ generateHTML(results) {
24
+ const includeCharts = this.config.includeCharts !== false;
25
+ return `<!DOCTYPE html>
26
+ <html lang="en">
27
+ <head>
28
+ <meta charset="UTF-8">
29
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
30
+ <title>Graph-Based Testing Report</title>
31
+ <style>
32
+ * { box-sizing: border-box; margin: 0; padding: 0; }
33
+ body {
34
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
35
+ line-height: 1.6;
36
+ color: #333;
37
+ background: #f5f5f5;
38
+ padding: 20px;
39
+ }
40
+ .container { max-width: 1400px; margin: 0 auto; }
41
+ header {
42
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
43
+ color: white;
44
+ padding: 30px;
45
+ border-radius: 8px;
46
+ margin-bottom: 30px;
47
+ box-shadow: 0 4px 6px rgba(0,0,0,0.1);
48
+ }
49
+ h1 { font-size: 2em; margin-bottom: 10px; }
50
+ .summary {
51
+ display: grid;
52
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
53
+ gap: 20px;
54
+ margin-bottom: 30px;
55
+ }
56
+ .stat-card {
57
+ background: white;
58
+ padding: 20px;
59
+ border-radius: 8px;
60
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
61
+ transition: transform 0.2s;
62
+ }
63
+ .stat-card:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0,0,0,0.15); }
64
+ .stat-card h3 { color: #666; font-size: 0.9em; text-transform: uppercase; margin-bottom: 10px; }
65
+ .stat-card .value { font-size: 2.5em; font-weight: bold; color: #667eea; }
66
+ .stat-card .label { color: #999; font-size: 0.9em; }
67
+ .pass-rate { color: #10b981 !important; }
68
+ .fail-rate { color: #ef4444 !important; }
69
+ .section {
70
+ background: white;
71
+ padding: 30px;
72
+ border-radius: 8px;
73
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
74
+ margin-bottom: 30px;
75
+ }
76
+ .section h2 {
77
+ font-size: 1.5em;
78
+ margin-bottom: 20px;
79
+ color: #667eea;
80
+ border-bottom: 2px solid #f0f0f0;
81
+ padding-bottom: 10px;
82
+ }
83
+ table {
84
+ width: 100%;
85
+ border-collapse: collapse;
86
+ margin-top: 20px;
87
+ }
88
+ th, td {
89
+ text-align: left;
90
+ padding: 12px;
91
+ border-bottom: 1px solid #e0e0e0;
92
+ }
93
+ th {
94
+ background: #f8f9fa;
95
+ font-weight: 600;
96
+ color: #666;
97
+ text-transform: uppercase;
98
+ font-size: 0.85em;
99
+ }
100
+ tr:hover { background: #f8f9fa; }
101
+ .badge {
102
+ display: inline-block;
103
+ padding: 4px 12px;
104
+ border-radius: 12px;
105
+ font-size: 0.85em;
106
+ font-weight: 600;
107
+ }
108
+ .badge-success { background: #d1fae5; color: #065f46; }
109
+ .badge-error { background: #fee2e2; color: #991b1b; }
110
+ .badge-warning { background: #fef3c7; color: #92400e; }
111
+ .mode-visual { color: #8b5cf6; }
112
+ .mode-performance { color: #f59e0b; }
113
+ .mode-accessibility { color: #10b981; }
114
+ .mode-seo { color: #3b82f6; }
115
+ .chart-container {
116
+ width: 100%;
117
+ height: 300px;
118
+ margin: 20px 0;
119
+ position: relative;
120
+ }
121
+ .bar-chart {
122
+ display: flex;
123
+ align-items: flex-end;
124
+ justify-content: space-around;
125
+ height: 250px;
126
+ gap: 10px;
127
+ padding: 20px;
128
+ background: #f8f9fa;
129
+ border-radius: 8px;
130
+ }
131
+ .bar {
132
+ flex: 1;
133
+ background: linear-gradient(180deg, #667eea 0%, #764ba2 100%);
134
+ border-radius: 4px 4px 0 0;
135
+ position: relative;
136
+ min-height: 20px;
137
+ display: flex;
138
+ align-items: flex-end;
139
+ justify-content: center;
140
+ color: white;
141
+ font-weight: bold;
142
+ padding-bottom: 5px;
143
+ }
144
+ .bar-label {
145
+ text-align: center;
146
+ margin-top: 10px;
147
+ font-size: 0.85em;
148
+ color: #666;
149
+ }
150
+ .details {
151
+ display: none;
152
+ padding: 15px;
153
+ background: #f8f9fa;
154
+ border-radius: 4px;
155
+ margin-top: 10px;
156
+ }
157
+ .details.show { display: block; }
158
+ .expand-btn {
159
+ background: none;
160
+ border: none;
161
+ color: #667eea;
162
+ cursor: pointer;
163
+ font-weight: 600;
164
+ padding: 4px 8px;
165
+ border-radius: 4px;
166
+ transition: background 0.2s;
167
+ }
168
+ .expand-btn:hover { background: #f0f0f0; }
169
+ .error-list {
170
+ list-style: none;
171
+ padding: 0;
172
+ }
173
+ .error-list li {
174
+ padding: 8px;
175
+ background: #fee2e2;
176
+ border-left: 3px solid #ef4444;
177
+ margin-bottom: 8px;
178
+ border-radius: 4px;
179
+ color: #991b1b;
180
+ }
181
+ footer {
182
+ text-align: center;
183
+ color: #999;
184
+ margin-top: 40px;
185
+ padding-top: 20px;
186
+ border-top: 1px solid #e0e0e0;
187
+ }
188
+ </style>
189
+ </head>
190
+ <body>
191
+ <div class="container">
192
+ <header>
193
+ <h1>📊 Graph-Based Testing Report</h1>
194
+ <p>Generated on ${new Date().toLocaleString()}</p>
195
+ </header>
196
+
197
+ ${this.generateSummarySection(results)}
198
+ ${includeCharts ? this.generateChartsSection(results) : ''}
199
+ ${this.generateResultsTable(results)}
200
+ ${this.generateModeBreakdown(results)}
201
+
202
+ <footer>
203
+ <p>Generated by Supernal Interface Graph-Based Testing Framework</p>
204
+ </footer>
205
+ </div>
206
+
207
+ <script>
208
+ function toggleDetails(id) {
209
+ const element = document.getElementById(id);
210
+ element.classList.toggle('show');
211
+ }
212
+ </script>
213
+ </body>
214
+ </html>`;
215
+ }
216
+ generateSummarySection(results) {
217
+ return `
218
+ <div class="summary">
219
+ <div class="stat-card">
220
+ <h3>Routes Tested</h3>
221
+ <div class="value">${results.routeCount}</div>
222
+ </div>
223
+ <div class="stat-card">
224
+ <h3>Total Tests</h3>
225
+ <div class="value">${results.testCount}</div>
226
+ </div>
227
+ <div class="stat-card">
228
+ <h3>Passed</h3>
229
+ <div class="value pass-rate">${results.passedCount}</div>
230
+ </div>
231
+ <div class="stat-card">
232
+ <h3>Failed</h3>
233
+ <div class="value fail-rate">${results.failedCount}</div>
234
+ </div>
235
+ <div class="stat-card">
236
+ <h3>Pass Rate</h3>
237
+ <div class="value ${results.passRate >= 90 ? 'pass-rate' : 'fail-rate'}">${results.passRate}%</div>
238
+ </div>
239
+ <div class="stat-card">
240
+ <h3>Duration</h3>
241
+ <div class="value">${(results.totalDuration / 1000).toFixed(1)}s</div>
242
+ </div>
243
+ </div>`;
244
+ }
245
+ generateChartsSection(results) {
246
+ const modeData = [];
247
+ for (const [mode, modeResults] of results.resultsByMode) {
248
+ const passed = modeResults.filter((r) => r.passed).length;
249
+ const failed = modeResults.filter((r) => !r.passed).length;
250
+ modeData.push({ mode, passed, failed });
251
+ }
252
+ const maxCount = Math.max(...modeData.map((d) => d.passed + d.failed));
253
+ return `
254
+ <div class="section">
255
+ <h2>Results by Test Mode</h2>
256
+ <div class="bar-chart">
257
+ ${modeData
258
+ .map((data) => {
259
+ const total = data.passed + data.failed;
260
+ const height = (total / maxCount) * 100;
261
+ return `
262
+ <div style="flex: 1;">
263
+ <div class="bar" style="height: ${height}%">
264
+ ${total}
265
+ </div>
266
+ <div class="bar-label">
267
+ <strong>${data.mode}</strong><br>
268
+ ✓ ${data.passed} / ✗ ${data.failed}
269
+ </div>
270
+ </div>
271
+ `;
272
+ })
273
+ .join('')}
274
+ </div>
275
+ </div>`;
276
+ }
277
+ generateResultsTable(results) {
278
+ const rows = [];
279
+ for (const [route, routeResults] of results.resultsByRoute) {
280
+ for (const result of routeResults) {
281
+ rows.push(`
282
+ <tr>
283
+ <td><strong>${route}</strong></td>
284
+ <td><span class="mode-${result.mode}">${result.mode}</span></td>
285
+ <td><span class="badge ${result.passed ? 'badge-success' : 'badge-error'}">${result.passed ? 'PASS' : 'FAIL'}</span></td>
286
+ <td>${result.duration}ms</td>
287
+ <td>
288
+ ${result.errors.length > 0
289
+ ? `
290
+ <button class="expand-btn" onclick="toggleDetails('errors-${this.generateId(route || 'unknown', result.mode || 'unknown')}')">
291
+ View ${result.errors.length} error(s)
292
+ </button>
293
+ <div id="errors-${this.generateId(route || 'unknown', result.mode || 'unknown')}" class="details">
294
+ <ul class="error-list">
295
+ ${result.errors.map((err) => `<li>${this.escapeHtml(typeof err === 'string' ? err : err.message)}</li>`).join('')}
296
+ </ul>
297
+ </div>
298
+ `
299
+ : '<span class="badge badge-success">No errors</span>'}
300
+ </td>
301
+ </tr>
302
+ `);
303
+ }
304
+ }
305
+ return `
306
+ <div class="section">
307
+ <h2>Test Results by Route</h2>
308
+ <table>
309
+ <thead>
310
+ <tr>
311
+ <th>Route</th>
312
+ <th>Mode</th>
313
+ <th>Status</th>
314
+ <th>Duration</th>
315
+ <th>Errors</th>
316
+ </tr>
317
+ </thead>
318
+ <tbody>
319
+ ${rows.join('')}
320
+ </tbody>
321
+ </table>
322
+ </div>`;
323
+ }
324
+ generateModeBreakdown(results) {
325
+ const sections = [];
326
+ for (const [mode, modeResults] of results.resultsByMode) {
327
+ const passed = modeResults.filter((r) => r.passed).length;
328
+ const failed = modeResults.filter((r) => !r.passed).length;
329
+ const avgDuration = modeResults.reduce((sum, r) => sum + r.duration, 0) / modeResults.length;
330
+ sections.push(`
331
+ <div class="section">
332
+ <h2><span class="mode-${mode}">${mode.toUpperCase()}</span> Mode Results</h2>
333
+ <div class="summary" style="grid-template-columns: repeat(3, 1fr);">
334
+ <div class="stat-card">
335
+ <h3>Passed</h3>
336
+ <div class="value pass-rate">${passed}</div>
337
+ </div>
338
+ <div class="stat-card">
339
+ <h3>Failed</h3>
340
+ <div class="value fail-rate">${failed}</div>
341
+ </div>
342
+ <div class="stat-card">
343
+ <h3>Avg Duration</h3>
344
+ <div class="value">${avgDuration.toFixed(0)}ms</div>
345
+ </div>
346
+ </div>
347
+ </div>
348
+ `);
349
+ }
350
+ return sections.join('');
351
+ }
352
+ generateId(route, mode) {
353
+ return `${route.replace(/\//g, '-')}-${mode}`.replace(/[^a-z0-9-]/gi, '');
354
+ }
355
+ escapeHtml(text) {
356
+ const map = {
357
+ '&': '&amp;',
358
+ '<': '&lt;',
359
+ '>': '&gt;',
360
+ '"': '&quot;',
361
+ "'": '&#039;',
362
+ };
363
+ return text.replace(/[&<>"']/g, (m) => map[m]);
364
+ }
365
+ async ensureDirectory(dir) {
366
+ const fs = await import('fs/promises');
367
+ await fs.mkdir(dir, { recursive: true });
368
+ }
369
+ async writeFile(path, content) {
370
+ const fs = await import('fs/promises');
371
+ await fs.writeFile(path, content, 'utf-8');
372
+ }
373
+ }
374
+ //# sourceMappingURL=HTMLReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HTMLReporter.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/reporters/HTMLReporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
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 type { AggregatedTestResults, Reporter } from '../core/types';
9
+ /**
10
+ * Configuration for JSON reporter.
11
+ */
12
+ export interface JSONReporterConfig {
13
+ /** Output directory */
14
+ outputDir: string;
15
+ /** Output filename (default: 'test-results.json') */
16
+ filename?: string;
17
+ /** Whether to pretty-print JSON (default: true) */
18
+ pretty?: boolean;
19
+ /** Whether to include detailed error stacks (default: true) */
20
+ includeErrorStacks?: boolean;
21
+ }
22
+ /**
23
+ * JSON reporter.
24
+ *
25
+ * Generates structured JSON output suitable for CI/CD pipelines and
26
+ * programmatic analysis.
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * const reporter = new JSONReporter({
31
+ * outputDir: './test-results',
32
+ * filename: 'results.json',
33
+ * pretty: true
34
+ * });
35
+ *
36
+ * await reporter.generate(results);
37
+ * ```
38
+ */
39
+ export declare class JSONReporter implements Reporter {
40
+ readonly name = "JSON Reporter";
41
+ private config;
42
+ constructor(config: JSONReporterConfig);
43
+ /**
44
+ * Generate JSON report.
45
+ *
46
+ * @param results - Aggregated test results
47
+ */
48
+ generate(results: AggregatedTestResults): Promise<void>;
49
+ }
50
+ //# sourceMappingURL=JSONReporter.d.ts.map