@supernal/interface 1.0.9 → 1.0.12

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 (155) hide show
  1. package/dist/cjs/src/background/navigation/NavigationGraph.js +48 -0
  2. package/dist/cjs/src/background/navigation/NavigationGraph.js.map +1 -1
  3. package/dist/cjs/src/browser.js +42 -1
  4. package/dist/cjs/src/browser.js.map +1 -1
  5. package/dist/cjs/src/decorators/ContainerHelpers.js +16 -1
  6. package/dist/cjs/src/decorators/ContainerHelpers.js.map +1 -1
  7. package/dist/cjs/src/decorators/Tool.js +2 -3
  8. package/dist/cjs/src/decorators/Tool.js.map +1 -1
  9. package/dist/cjs/src/testing/graph-tester/core/GraphTester.js +339 -0
  10. package/dist/cjs/src/testing/graph-tester/core/GraphTester.js.map +1 -0
  11. package/dist/cjs/src/testing/graph-tester/core/TestFunction.js +189 -0
  12. package/dist/cjs/src/testing/graph-tester/core/TestFunction.js.map +1 -0
  13. package/dist/cjs/src/testing/graph-tester/core/types.js +24 -0
  14. package/dist/cjs/src/testing/graph-tester/core/types.js.map +1 -0
  15. package/dist/cjs/src/testing/graph-tester/fixtures/index.js +13 -0
  16. package/dist/cjs/src/testing/graph-tester/fixtures/index.js.map +1 -0
  17. package/dist/cjs/src/testing/graph-tester/fixtures/portPool.js +184 -0
  18. package/dist/cjs/src/testing/graph-tester/fixtures/portPool.js.map +1 -0
  19. package/dist/cjs/src/testing/graph-tester/index.js +98 -0
  20. package/dist/cjs/src/testing/graph-tester/index.js.map +1 -0
  21. package/dist/cjs/src/testing/graph-tester/modes/AccessibilityMode.js +230 -0
  22. package/dist/cjs/src/testing/graph-tester/modes/AccessibilityMode.js.map +1 -0
  23. package/dist/cjs/src/testing/graph-tester/modes/PerformanceMode.js +168 -0
  24. package/dist/cjs/src/testing/graph-tester/modes/PerformanceMode.js.map +1 -0
  25. package/dist/cjs/src/testing/graph-tester/modes/SEOMode.js +264 -0
  26. package/dist/cjs/src/testing/graph-tester/modes/SEOMode.js.map +1 -0
  27. package/dist/cjs/src/testing/graph-tester/modes/VisualRegressionMode.js +199 -0
  28. package/dist/cjs/src/testing/graph-tester/modes/VisualRegressionMode.js.map +1 -0
  29. package/dist/cjs/src/testing/graph-tester/modes/index.js +17 -0
  30. package/dist/cjs/src/testing/graph-tester/modes/index.js.map +1 -0
  31. package/dist/cjs/src/testing/graph-tester/reporters/HTMLReporter.js +411 -0
  32. package/dist/cjs/src/testing/graph-tester/reporters/HTMLReporter.js.map +1 -0
  33. package/dist/cjs/src/testing/graph-tester/reporters/JSONReporter.js +127 -0
  34. package/dist/cjs/src/testing/graph-tester/reporters/JSONReporter.js.map +1 -0
  35. package/dist/cjs/src/testing/graph-tester/reporters/MarkdownReporter.js +169 -0
  36. package/dist/cjs/src/testing/graph-tester/reporters/MarkdownReporter.js.map +1 -0
  37. package/dist/cjs/src/testing/graph-tester/reporters/UnifiedReporter.js +118 -0
  38. package/dist/cjs/src/testing/graph-tester/reporters/UnifiedReporter.js.map +1 -0
  39. package/dist/cjs/src/testing/graph-tester/reporters/index.js +17 -0
  40. package/dist/cjs/src/testing/graph-tester/reporters/index.js.map +1 -0
  41. package/dist/cjs/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js +47 -0
  42. package/dist/cjs/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js.map +1 -0
  43. package/dist/cjs/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js +584 -0
  44. package/dist/cjs/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js.map +1 -0
  45. package/dist/cjs/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js +376 -0
  46. package/dist/cjs/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js.map +1 -0
  47. package/dist/cjs/src/testing/graph-tester/screenshot/index.js +15 -0
  48. package/dist/cjs/src/testing/graph-tester/screenshot/index.js.map +1 -0
  49. package/dist/cjs/src/testing/graph-tester/screenshot/types.js +11 -0
  50. package/dist/cjs/src/testing/graph-tester/screenshot/types.js.map +1 -0
  51. package/dist/cjs/src/testing/selectors.js +1 -1
  52. package/dist/esm/src/background/navigation/INavigationGraph.d.ts +15 -0
  53. package/dist/esm/src/background/navigation/INavigationGraph.d.ts.map +1 -1
  54. package/dist/esm/src/background/navigation/NavigationGraph.d.ts +32 -0
  55. package/dist/esm/src/background/navigation/NavigationGraph.d.ts.map +1 -1
  56. package/dist/esm/src/background/navigation/NavigationGraph.js +48 -0
  57. package/dist/esm/src/background/navigation/NavigationGraph.js.map +1 -1
  58. package/dist/esm/src/browser.d.ts +9 -0
  59. package/dist/esm/src/browser.d.ts.map +1 -1
  60. package/dist/esm/src/browser.js +14 -0
  61. package/dist/esm/src/browser.js.map +1 -1
  62. package/dist/esm/src/decorators/ContainerHelpers.d.ts +2 -1
  63. package/dist/esm/src/decorators/ContainerHelpers.d.ts.map +1 -1
  64. package/dist/esm/src/decorators/ContainerHelpers.js +16 -1
  65. package/dist/esm/src/decorators/ContainerHelpers.js.map +1 -1
  66. package/dist/esm/src/decorators/Tool.d.ts.map +1 -1
  67. package/dist/esm/src/decorators/Tool.js +2 -3
  68. package/dist/esm/src/decorators/Tool.js.map +1 -1
  69. package/dist/esm/src/testing/graph-tester/core/GraphTester.d.ts +110 -0
  70. package/dist/esm/src/testing/graph-tester/core/GraphTester.d.ts.map +1 -0
  71. package/dist/esm/src/testing/graph-tester/core/GraphTester.js +335 -0
  72. package/dist/esm/src/testing/graph-tester/core/GraphTester.js.map +1 -0
  73. package/dist/esm/src/testing/graph-tester/core/TestFunction.d.ts +120 -0
  74. package/dist/esm/src/testing/graph-tester/core/TestFunction.d.ts.map +1 -0
  75. package/dist/esm/src/testing/graph-tester/core/TestFunction.js +184 -0
  76. package/dist/esm/src/testing/graph-tester/core/TestFunction.js.map +1 -0
  77. package/dist/esm/src/testing/graph-tester/core/types.d.ts +331 -0
  78. package/dist/esm/src/testing/graph-tester/core/types.d.ts.map +1 -0
  79. package/dist/esm/src/testing/graph-tester/core/types.js +21 -0
  80. package/dist/esm/src/testing/graph-tester/core/types.js.map +1 -0
  81. package/dist/esm/src/testing/graph-tester/fixtures/index.d.ts +8 -0
  82. package/dist/esm/src/testing/graph-tester/fixtures/index.d.ts.map +1 -0
  83. package/dist/esm/src/testing/graph-tester/fixtures/index.js +7 -0
  84. package/dist/esm/src/testing/graph-tester/fixtures/index.js.map +1 -0
  85. package/dist/esm/src/testing/graph-tester/fixtures/portPool.d.ts +40 -0
  86. package/dist/esm/src/testing/graph-tester/fixtures/portPool.d.ts.map +1 -0
  87. package/dist/esm/src/testing/graph-tester/fixtures/portPool.js +147 -0
  88. package/dist/esm/src/testing/graph-tester/fixtures/portPool.js.map +1 -0
  89. package/dist/esm/src/testing/graph-tester/index.d.ts +84 -0
  90. package/dist/esm/src/testing/graph-tester/index.d.ts.map +1 -0
  91. package/dist/esm/src/testing/graph-tester/index.js +77 -0
  92. package/dist/esm/src/testing/graph-tester/index.js.map +1 -0
  93. package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.d.ts +40 -0
  94. package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.d.ts.map +1 -0
  95. package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.js +193 -0
  96. package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.js.map +1 -0
  97. package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.d.ts +42 -0
  98. package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.d.ts.map +1 -0
  99. package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.js +131 -0
  100. package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.js.map +1 -0
  101. package/dist/esm/src/testing/graph-tester/modes/SEOMode.d.ts +39 -0
  102. package/dist/esm/src/testing/graph-tester/modes/SEOMode.d.ts.map +1 -0
  103. package/dist/esm/src/testing/graph-tester/modes/SEOMode.js +227 -0
  104. package/dist/esm/src/testing/graph-tester/modes/SEOMode.js.map +1 -0
  105. package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.d.ts +83 -0
  106. package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.d.ts.map +1 -0
  107. package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.js +162 -0
  108. package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.js.map +1 -0
  109. package/dist/esm/src/testing/graph-tester/modes/index.d.ts +14 -0
  110. package/dist/esm/src/testing/graph-tester/modes/index.d.ts.map +1 -0
  111. package/dist/esm/src/testing/graph-tester/modes/index.js +10 -0
  112. package/dist/esm/src/testing/graph-tester/modes/index.js.map +1 -0
  113. package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.d.ts +38 -0
  114. package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.d.ts.map +1 -0
  115. package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.js +374 -0
  116. package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.js.map +1 -0
  117. package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.d.ts +50 -0
  118. package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.d.ts.map +1 -0
  119. package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.js +90 -0
  120. package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.js.map +1 -0
  121. package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.d.ts +33 -0
  122. package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.d.ts.map +1 -0
  123. package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.js +132 -0
  124. package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.js.map +1 -0
  125. package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.d.ts +30 -0
  126. package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.d.ts.map +1 -0
  127. package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.js +81 -0
  128. package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.js.map +1 -0
  129. package/dist/esm/src/testing/graph-tester/reporters/index.d.ts +14 -0
  130. package/dist/esm/src/testing/graph-tester/reporters/index.d.ts.map +1 -0
  131. package/dist/esm/src/testing/graph-tester/reporters/index.js +10 -0
  132. package/dist/esm/src/testing/graph-tester/reporters/index.js.map +1 -0
  133. package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.d.ts +33 -0
  134. package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.d.ts.map +1 -0
  135. package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js +43 -0
  136. package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js.map +1 -0
  137. package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.d.ts +70 -0
  138. package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.d.ts.map +1 -0
  139. package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js +547 -0
  140. package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js.map +1 -0
  141. package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.d.ts +83 -0
  142. package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.d.ts.map +1 -0
  143. package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js +339 -0
  144. package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js.map +1 -0
  145. package/dist/esm/src/testing/graph-tester/screenshot/index.d.ts +11 -0
  146. package/dist/esm/src/testing/graph-tester/screenshot/index.d.ts.map +1 -0
  147. package/dist/esm/src/testing/graph-tester/screenshot/index.js +9 -0
  148. package/dist/esm/src/testing/graph-tester/screenshot/index.js.map +1 -0
  149. package/dist/esm/src/testing/graph-tester/screenshot/types.d.ts +331 -0
  150. package/dist/esm/src/testing/graph-tester/screenshot/types.d.ts.map +1 -0
  151. package/dist/esm/src/testing/graph-tester/screenshot/types.js +10 -0
  152. package/dist/esm/src/testing/graph-tester/screenshot/types.js.map +1 -0
  153. package/dist/esm/src/testing/selectors.d.ts +1 -1
  154. package/dist/esm/src/testing/selectors.js +1 -1
  155. package/package.json +19 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/testing/graph-tester/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAIH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,mBAAmB,cAAc,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAI/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,YAAY,EAAE,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAElF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AAEjF,mBAAmB,oBAAoB,CAAC;AAIxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,YAAY,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAE3E,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAIjD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,YAAY,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAI3E,OAAO,EAAE,IAAI,IAAI,gBAAgB,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACxF,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Graph-Based Testing Framework
3
+ *
4
+ * A comprehensive testing framework that systematically applies different testing functions
5
+ * (visual regression, performance, accessibility, SEO) to all routes in your application.
6
+ *
7
+ * ## Features
8
+ *
9
+ * - **Screenshot Annotation**: Capture screenshots with element bounding boxes, testids, and interaction capabilities
10
+ * - **Multiple Test Modes**: Visual regression, performance, accessibility, SEO
11
+ * - **AI-Ready Output**: JSON + PNG format optimized for multimodal AI analysis
12
+ * - **Multi-Format Reporting**: HTML (interactive), JSON (CI/CD), Markdown (docs)
13
+ * - **Parallel Testing**: Port pool fixture for running tests in parallel
14
+ * - **Pluggable Architecture**: Create custom test modes by extending TestFunction
15
+ *
16
+ * ## Usage
17
+ *
18
+ * ```typescript
19
+ * import { GraphTester, VisualRegressionMode, JSONReporter } from '@supernal/interface/testing/graph-tester';
20
+ *
21
+ * const tester = new GraphTester({
22
+ * baseUrl: 'http://localhost:3000',
23
+ * routes: [
24
+ * { route: '/', metadata: { name: 'Home' } },
25
+ * { route: '/dashboard', metadata: { name: 'Dashboard' } }
26
+ * ],
27
+ * modes: ['visual'],
28
+ * output: {
29
+ * dir: './test-results',
30
+ * formats: ['json', 'html']
31
+ * }
32
+ * });
33
+ *
34
+ * // Register test modes
35
+ * tester.registerTestFunction(new VisualRegressionMode({
36
+ * outputDir: './screenshots',
37
+ * annotate: true,
38
+ * generateHTML: true
39
+ * }));
40
+ *
41
+ * // Run tests
42
+ * const results = await tester.runTests();
43
+ * console.log(`Pass rate: ${results.passRate}%`);
44
+ *
45
+ * // Generate reports
46
+ * const reporter = new JSONReporter({ outputDir: './test-results' });
47
+ * await reporter.generate(results);
48
+ * ```
49
+ *
50
+ * ## Enterprise Features
51
+ *
52
+ * For automatic route discovery via NavigationGraph, CLI commands, and AI analysis,
53
+ * see `@supernalintelligence/interface-enterprise/testing/graph-tester`.
54
+ *
55
+ * @packageDocumentation
56
+ */
57
+ // ==================== Core ====================
58
+ export { TestFunction, isTestFunction } from './core/TestFunction.js';
59
+ export { GraphTester } from './core/GraphTester.js';
60
+ export { ViewportPresets } from './core/types.js';
61
+ // ==================== Screenshot Annotation ====================
62
+ export { ScreenshotAnnotator } from './screenshot/ScreenshotAnnotator.js';
63
+ export { HTMLAnnotationRenderer } from './screenshot/HTMLAnnotationRenderer.js';
64
+ export { CanvasAnnotationRenderer } from './screenshot/CanvasAnnotationRenderer.js';
65
+ // ==================== Test Modes ====================
66
+ export { VisualRegressionMode } from './modes/VisualRegressionMode.js';
67
+ export { PerformanceMode } from './modes/PerformanceMode.js';
68
+ export { AccessibilityMode } from './modes/AccessibilityMode.js';
69
+ export { SEOMode } from './modes/SEOMode.js';
70
+ // ==================== Reporters ====================
71
+ export { UnifiedReporter } from './reporters/UnifiedReporter.js';
72
+ export { JSONReporter } from './reporters/JSONReporter.js';
73
+ export { HTMLReporter } from './reporters/HTMLReporter.js';
74
+ export { MarkdownReporter } from './reporters/MarkdownReporter.js';
75
+ // ==================== Fixtures ====================
76
+ export { test as testWithPortPool, expect, cleanupPortPool } from './fixtures/portPool.js';
77
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/testing/graph-tester/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,iDAAiD;AAEjD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,kEAAkE;AAElE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAGvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AAIjF,uDAAuD;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAG9D,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG1C,sDAAsD;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAGhE,qDAAqD;AAErD,OAAO,EAAE,IAAI,IAAI,gBAAgB,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Accessibility testing mode (stub - to be implemented in Phase 2).
3
+ *
4
+ * Will integrate axe-core for WCAG compliance testing.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ import type { Page } from '@playwright/test';
9
+ import { TestFunction } from '../core/TestFunction';
10
+ import type { TestContext, TestResult } from '../core/types';
11
+ /**
12
+ * Configuration for accessibility mode.
13
+ */
14
+ export interface AccessibilityConfig {
15
+ /** Output directory */
16
+ outputDir: string;
17
+ /** WCAG version (default: '2.1') */
18
+ wcagVersion?: '2.0' | '2.1' | '2.2';
19
+ /** WCAG level (default: 'AA') */
20
+ wcagLevel?: 'A' | 'AA' | 'AAA';
21
+ /** Whether to fail on warnings (default: false) */
22
+ strict?: boolean;
23
+ }
24
+ /**
25
+ * Accessibility testing mode (stub).
26
+ */
27
+ export declare class AccessibilityMode extends TestFunction {
28
+ readonly mode = "accessibility";
29
+ readonly name = "Accessibility";
30
+ readonly description = "Tests WCAG compliance using axe-core";
31
+ private config;
32
+ constructor(config: AccessibilityConfig);
33
+ execute(page: Page, context: TestContext): Promise<TestResult>;
34
+ private injectAxe;
35
+ private getWCAGTags;
36
+ private sanitizeRoute;
37
+ private ensureDirectory;
38
+ private writeFile;
39
+ }
40
+ //# sourceMappingURL=AccessibilityMode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessibilityMode.d.ts","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/modes/AccessibilityMode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAElB,oCAAoC;IACpC,WAAW,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAEpC,iCAAiC;IACjC,SAAS,CAAC,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC;IAE/B,mDAAmD;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,IAAI,mBAAmB;IAChC,QAAQ,CAAC,WAAW,0CAA0C;IAE9D,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAKjC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;YA8ItD,SAAS;IAWvB,OAAO,CAAC,WAAW;IA8BnB,OAAO,CAAC,aAAa;YAIP,eAAe;YAKf,SAAS;CAIxB"}
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Accessibility testing mode (stub - to be implemented in Phase 2).
3
+ *
4
+ * Will integrate axe-core for WCAG compliance testing.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ import { TestFunction } from '../core/TestFunction.js';
9
+ /**
10
+ * Accessibility testing mode (stub).
11
+ */
12
+ export class AccessibilityMode extends TestFunction {
13
+ constructor(config) {
14
+ super();
15
+ this.mode = 'accessibility';
16
+ this.name = 'Accessibility';
17
+ this.description = 'Tests WCAG compliance using axe-core';
18
+ this.config = config;
19
+ }
20
+ async execute(page, context) {
21
+ const startTime = Date.now();
22
+ const errors = [];
23
+ try {
24
+ // Inject axe-core
25
+ await this.injectAxe(page);
26
+ // Run axe analysis with WCAG tags
27
+ const wcagTags = this.getWCAGTags();
28
+ const results = await page.evaluate((tags) => {
29
+ return new Promise((resolve) => {
30
+ // @ts-ignore - axe is injected globally
31
+ if (typeof window.axe === 'undefined') {
32
+ resolve({ violations: [], passes: [], incomplete: [], inapplicable: [] });
33
+ return;
34
+ }
35
+ // @ts-ignore
36
+ window.axe
37
+ .run({
38
+ runOnly: {
39
+ type: 'tag',
40
+ values: tags,
41
+ },
42
+ })
43
+ .then((results) => {
44
+ resolve(results);
45
+ })
46
+ .catch((error) => {
47
+ resolve({ violations: [], passes: [], incomplete: [], inapplicable: [], error: error.message });
48
+ });
49
+ });
50
+ }, wcagTags);
51
+ // Process violations
52
+ const violations = results.violations || [];
53
+ const warnings = results.incomplete || [];
54
+ // Build detailed violation reports
55
+ const violationReports = violations.map((v) => ({
56
+ id: v.id,
57
+ impact: v.impact,
58
+ description: v.description,
59
+ help: v.help,
60
+ helpUrl: v.helpUrl,
61
+ nodes: v.nodes.map((node) => ({
62
+ html: node.html,
63
+ target: node.target,
64
+ failureSummary: node.failureSummary,
65
+ })),
66
+ }));
67
+ const warningReports = warnings.map((w) => ({
68
+ id: w.id,
69
+ impact: w.impact,
70
+ description: w.description,
71
+ help: w.help,
72
+ helpUrl: w.helpUrl,
73
+ nodes: w.nodes.length,
74
+ }));
75
+ // Determine if test passed
76
+ const hasViolations = violations.length > 0;
77
+ const hasWarnings = warnings.length > 0;
78
+ const passed = this.config.strict ? !hasViolations && !hasWarnings : !hasViolations;
79
+ // Collect error messages
80
+ if (hasViolations) {
81
+ violations.forEach((v) => {
82
+ errors.push({
83
+ severity: v.impact === 'critical' ? 'critical' : 'warning',
84
+ message: `[${v.impact}] ${v.help} (${v.nodes.length} instances)`,
85
+ location: v.helpUrl,
86
+ });
87
+ });
88
+ }
89
+ if (this.config.strict && hasWarnings) {
90
+ warnings.forEach((w) => {
91
+ errors.push({
92
+ severity: 'info',
93
+ message: `[warning] ${w.help} (${w.nodes.length} instances)`,
94
+ location: w.helpUrl,
95
+ });
96
+ });
97
+ }
98
+ // Save results
99
+ const outputPath = `${this.config.outputDir}/${this.sanitizeRoute(context.route)}-accessibility.json`;
100
+ await this.ensureDirectory(this.config.outputDir);
101
+ await this.writeFile(outputPath, JSON.stringify({
102
+ route: context.route,
103
+ wcagVersion: this.config.wcagVersion || '2.1',
104
+ wcagLevel: this.config.wcagLevel || 'AA',
105
+ summary: {
106
+ violations: violations.length,
107
+ warnings: warnings.length,
108
+ passes: results.passes?.length || 0,
109
+ incomplete: results.incomplete?.length || 0,
110
+ },
111
+ violations: violationReports,
112
+ warnings: warningReports,
113
+ }, null, 2));
114
+ const duration = Date.now() - startTime;
115
+ return {
116
+ passed,
117
+ duration,
118
+ errors,
119
+ metadata: {
120
+ accessibility: {
121
+ violationCount: violations.length,
122
+ warningCount: warnings.length,
123
+ passCount: results.passes?.length || 0,
124
+ },
125
+ outputPath,
126
+ },
127
+ };
128
+ }
129
+ catch (error) {
130
+ errors.push({
131
+ severity: 'critical',
132
+ message: `Accessibility testing failed: ${error instanceof Error ? error.message : String(error)}`,
133
+ stack: error instanceof Error ? error.stack : undefined,
134
+ });
135
+ return {
136
+ passed: false,
137
+ duration: Date.now() - startTime,
138
+ errors,
139
+ metadata: {},
140
+ };
141
+ }
142
+ }
143
+ async injectAxe(page) {
144
+ try {
145
+ // Try to load axe-core from CDN
146
+ await page.addScriptTag({
147
+ url: 'https://cdnjs.cloudflare.com/ajax/libs/axe-core/4.8.3/axe.min.js',
148
+ });
149
+ }
150
+ catch (error) {
151
+ throw new Error('Failed to inject axe-core from CDN. Please check your network connection or use a local axe-core installation.');
152
+ }
153
+ }
154
+ getWCAGTags() {
155
+ const version = this.config.wcagVersion || '2.1';
156
+ const level = this.config.wcagLevel || 'AA';
157
+ const tags = ['wcag2a'];
158
+ if (level === 'AA' || level === 'AAA') {
159
+ tags.push('wcag2aa');
160
+ }
161
+ if (level === 'AAA') {
162
+ tags.push('wcag2aaa');
163
+ }
164
+ // Add version-specific tags
165
+ if (version === '2.1') {
166
+ tags.push('wcag21a');
167
+ if (level === 'AA' || level === 'AAA')
168
+ tags.push('wcag21aa');
169
+ if (level === 'AAA')
170
+ tags.push('wcag21aaa');
171
+ }
172
+ if (version === '2.2') {
173
+ tags.push('wcag21a', 'wcag22a');
174
+ if (level === 'AA' || level === 'AAA')
175
+ tags.push('wcag21aa', 'wcag22aa');
176
+ if (level === 'AAA')
177
+ tags.push('wcag21aaa', 'wcag22aaa');
178
+ }
179
+ return tags;
180
+ }
181
+ sanitizeRoute(route) {
182
+ return route.replace(/^\//, '').replace(/\//g, '-') || 'home';
183
+ }
184
+ async ensureDirectory(dir) {
185
+ const fs = await import('fs/promises');
186
+ await fs.mkdir(dir, { recursive: true });
187
+ }
188
+ async writeFile(path, content) {
189
+ const fs = await import('fs/promises');
190
+ await fs.writeFile(path, content, 'utf-8');
191
+ }
192
+ }
193
+ //# sourceMappingURL=AccessibilityMode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccessibilityMode.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/modes/AccessibilityMode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Performance testing mode (stub - to be implemented in Phase 2).
3
+ *
4
+ * Will collect Core Web Vitals and Lighthouse metrics.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ import type { Page } from '@playwright/test';
9
+ import { TestFunction } from '../core/TestFunction';
10
+ import type { TestContext, TestResult } from '../core/types';
11
+ /**
12
+ * Configuration for performance mode.
13
+ */
14
+ export interface PerformanceConfig {
15
+ /** Output directory */
16
+ outputDir: string;
17
+ /** Whether to run Lighthouse (default: false) */
18
+ lighthouse?: boolean;
19
+ /** Performance thresholds */
20
+ thresholds?: {
21
+ fcp?: number;
22
+ lcp?: number;
23
+ cls?: number;
24
+ tti?: number;
25
+ tbt?: number;
26
+ };
27
+ }
28
+ /**
29
+ * Performance testing mode (stub).
30
+ */
31
+ export declare class PerformanceMode extends TestFunction {
32
+ readonly mode = "performance";
33
+ readonly name = "Performance";
34
+ readonly description = "Collects Core Web Vitals and performance metrics";
35
+ private config;
36
+ constructor(config: PerformanceConfig);
37
+ execute(page: Page, context: TestContext): Promise<TestResult>;
38
+ private sanitizeRoute;
39
+ private ensureDirectory;
40
+ private writeFile;
41
+ }
42
+ //# sourceMappingURL=PerformanceMode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PerformanceMode.d.ts","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/modes/PerformanceMode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAElB,iDAAiD;IACjD,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,6BAA6B;IAC7B,UAAU,CAAC,EAAE;QACX,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,WAAW,sDAAsD;IAE1E,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,iBAAiB;IAK/B,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAgHpE,OAAO,CAAC,aAAa;YAIP,eAAe;YAKf,SAAS;CAIxB"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Performance testing mode (stub - to be implemented in Phase 2).
3
+ *
4
+ * Will collect Core Web Vitals and Lighthouse metrics.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ import { TestFunction } from '../core/TestFunction.js';
9
+ /**
10
+ * Performance testing mode (stub).
11
+ */
12
+ export class PerformanceMode extends TestFunction {
13
+ constructor(config) {
14
+ super();
15
+ this.mode = 'performance';
16
+ this.name = 'Performance';
17
+ this.description = 'Collects Core Web Vitals and performance metrics';
18
+ this.config = config;
19
+ }
20
+ async execute(page, context) {
21
+ const startTime = Date.now();
22
+ const errors = [];
23
+ try {
24
+ // Collect Core Web Vitals and performance metrics
25
+ const metrics = await page.evaluate(() => {
26
+ return new Promise((resolve) => {
27
+ const observer = new PerformanceObserver((list) => {
28
+ const entries = list.getEntries();
29
+ // Process entries as they come
30
+ });
31
+ // Use performance API to get navigation timing
32
+ const perfData = performance.getEntriesByType('navigation')[0];
33
+ const paintEntries = performance.getEntriesByType('paint');
34
+ const fcp = paintEntries.find((entry) => entry.name === 'first-contentful-paint')?.startTime;
35
+ // Get layout shift metrics
36
+ const layoutShifts = performance.getEntriesByType('layout-shift');
37
+ const cls = layoutShifts.reduce((sum, entry) => sum + (entry.value || 0), 0);
38
+ // Calculate TTI approximation (when main thread is idle)
39
+ const tti = perfData ? perfData.domInteractive : 0;
40
+ // Get resource timing
41
+ const resources = performance.getEntriesByType('resource');
42
+ const totalSize = resources.reduce((sum, r) => sum + (r.transferSize || 0), 0);
43
+ resolve({
44
+ // Core Web Vitals
45
+ fcp: fcp || 0,
46
+ lcp: 0, // Will be collected via observer
47
+ cls: cls || 0,
48
+ tti: tti || 0,
49
+ tbt: 0, // Total Blocking Time - approximation
50
+ // Additional metrics
51
+ domContentLoaded: perfData?.domContentLoadedEventEnd || 0,
52
+ loadComplete: perfData?.loadEventEnd || 0,
53
+ totalResourceSize: totalSize,
54
+ resourceCount: resources.length,
55
+ // Timing breakdown
56
+ dns: perfData ? perfData.domainLookupEnd - perfData.domainLookupStart : 0,
57
+ tcp: perfData ? perfData.connectEnd - perfData.connectStart : 0,
58
+ ttfb: perfData ? perfData.responseStart - perfData.requestStart : 0,
59
+ });
60
+ });
61
+ });
62
+ // Check thresholds
63
+ const thresholdViolations = [];
64
+ if (this.config.thresholds) {
65
+ if (this.config.thresholds.fcp && metrics.fcp > this.config.thresholds.fcp) {
66
+ thresholdViolations.push({
67
+ severity: 'warning',
68
+ message: `FCP ${metrics.fcp.toFixed(2)}ms exceeds threshold ${this.config.thresholds.fcp}ms`,
69
+ });
70
+ }
71
+ if (this.config.thresholds.lcp && metrics.lcp > this.config.thresholds.lcp) {
72
+ thresholdViolations.push({
73
+ severity: 'warning',
74
+ message: `LCP ${metrics.lcp.toFixed(2)}ms exceeds threshold ${this.config.thresholds.lcp}ms`,
75
+ });
76
+ }
77
+ if (this.config.thresholds.cls && metrics.cls > this.config.thresholds.cls) {
78
+ thresholdViolations.push({
79
+ severity: 'warning',
80
+ message: `CLS ${metrics.cls.toFixed(3)} exceeds threshold ${this.config.thresholds.cls}`,
81
+ });
82
+ }
83
+ if (this.config.thresholds.tti && metrics.tti > this.config.thresholds.tti) {
84
+ thresholdViolations.push({
85
+ severity: 'warning',
86
+ message: `TTI ${metrics.tti.toFixed(2)}ms exceeds threshold ${this.config.thresholds.tti}ms`,
87
+ });
88
+ }
89
+ }
90
+ // Save results
91
+ const outputPath = `${this.config.outputDir}/${this.sanitizeRoute(context.route)}-performance.json`;
92
+ await this.ensureDirectory(this.config.outputDir);
93
+ await this.writeFile(outputPath, JSON.stringify({ route: context.route, metrics, thresholdViolations }, null, 2));
94
+ const duration = Date.now() - startTime;
95
+ return {
96
+ passed: thresholdViolations.length === 0,
97
+ duration,
98
+ errors: thresholdViolations,
99
+ metadata: {
100
+ performance: metrics,
101
+ outputPath,
102
+ },
103
+ };
104
+ }
105
+ catch (error) {
106
+ errors.push({
107
+ severity: 'critical',
108
+ message: `Performance collection failed: ${error instanceof Error ? error.message : String(error)}`,
109
+ stack: error instanceof Error ? error.stack : undefined,
110
+ });
111
+ return {
112
+ passed: false,
113
+ duration: Date.now() - startTime,
114
+ errors,
115
+ metadata: {},
116
+ };
117
+ }
118
+ }
119
+ sanitizeRoute(route) {
120
+ return route.replace(/^\//, '').replace(/\//g, '-') || 'home';
121
+ }
122
+ async ensureDirectory(dir) {
123
+ const fs = await import('fs/promises');
124
+ await fs.mkdir(dir, { recursive: true });
125
+ }
126
+ async writeFile(path, content) {
127
+ const fs = await import('fs/promises');
128
+ await fs.writeFile(path, content, 'utf-8');
129
+ }
130
+ }
131
+ //# sourceMappingURL=PerformanceMode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PerformanceMode.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/modes/PerformanceMode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAuBpD;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAO/C,YAAY,MAAyB;QACnC,KAAK,EAAE,CAAC;QAPD,SAAI,GAAG,aAAa,CAAC;QACrB,SAAI,GAAG,aAAa,CAAC;QACrB,gBAAW,GAAG,kDAAkD,CAAC;QAMxE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAU,EAAE,OAAoB;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAwC,EAAE,CAAC;QAEvD,IAAI,CAAC;YACH,kDAAkD;YAClD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAiB,EAAE;gBACrD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBAC7B,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,CAAC,IAAI,EAAE,EAAE;wBAChD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;wBAClC,+BAA+B;oBACjC,CAAC,CAAC,CAAC;oBAEH,+CAA+C;oBAC/C,MAAM,QAAQ,GAAG,WAAW,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,CAA4C,CAAC;oBAC1G,MAAM,YAAY,GAAG,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;oBAE3D,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,wBAAwB,CAAC,EAAE,SAAS,CAAC;oBAE7F,2BAA2B;oBAC3B,MAAM,YAAY,GAAG,WAAW,CAAC,gBAAgB,CAAC,cAAc,CAAU,CAAC;oBAC3E,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAE7E,yDAAyD;oBACzD,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;oBAEnD,sBAAsB;oBACtB,MAAM,SAAS,GAAG,WAAW,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;oBAC3D,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,GAAW,EAAE,CAAM,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAE5F,OAAO,CAAC;wBACN,kBAAkB;wBAClB,GAAG,EAAE,GAAG,IAAI,CAAC;wBACb,GAAG,EAAE,CAAC,EAAE,iCAAiC;wBACzC,GAAG,EAAE,GAAG,IAAI,CAAC;wBACb,GAAG,EAAE,GAAG,IAAI,CAAC;wBACb,GAAG,EAAE,CAAC,EAAE,sCAAsC;wBAE9C,qBAAqB;wBACrB,gBAAgB,EAAE,QAAQ,EAAE,wBAAwB,IAAI,CAAC;wBACzD,YAAY,EAAE,QAAQ,EAAE,YAAY,IAAI,CAAC;wBACzC,iBAAiB,EAAE,SAAS;wBAC5B,aAAa,EAAE,SAAS,CAAC,MAAM;wBAE/B,mBAAmB;wBACnB,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;wBACzE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;wBAC/D,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;qBACpE,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,mBAAmB;YACnB,MAAM,mBAAmB,GAAwC,EAAE,CAAC;YACpE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC3B,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;oBAC3E,mBAAmB,CAAC,IAAI,CAAC;wBACvB,QAAQ,EAAE,SAAS;wBACnB,OAAO,EAAE,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI;qBAC7F,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;oBAC3E,mBAAmB,CAAC,IAAI,CAAC;wBACvB,QAAQ,EAAE,SAAS;wBACnB,OAAO,EAAE,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI;qBAC7F,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;oBAC3E,mBAAmB,CAAC,IAAI,CAAC;wBACvB,QAAQ,EAAE,SAAS;wBACnB,OAAO,EAAE,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;qBACzF,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;oBAC3E,mBAAmB,CAAC,IAAI,CAAC;wBACvB,QAAQ,EAAE,SAAS;wBACnB,OAAO,EAAE,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI;qBAC7F,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,eAAe;YACf,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC;YACpG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAElH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAExC,OAAO;gBACL,MAAM,EAAE,mBAAmB,CAAC,MAAM,KAAK,CAAC;gBACxC,QAAQ;gBACR,MAAM,EAAE,mBAAmB;gBAC3B,QAAQ,EAAE;oBACR,WAAW,EAAE,OAAO;oBACpB,UAAU;iBACX;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBACnG,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;aACxD,CAAC,CAAC;YACH,OAAO;gBACL,MAAM,EAAE,KAAK;gBACb,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBAChC,MAAM;gBACN,QAAQ,EAAE,EAAE;aACb,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,KAAa;QACjC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC;IAChE,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,GAAW;QACvC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,OAAe;QACnD,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;CACF"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * SEO testing mode (stub - to be implemented in Phase 2).
3
+ *
4
+ * Will validate meta tags, OpenGraph, and structured data.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ import type { Page } from '@playwright/test';
9
+ import { TestFunction } from '../core/TestFunction';
10
+ import type { TestContext, TestResult } from '../core/types';
11
+ /**
12
+ * Configuration for SEO mode.
13
+ */
14
+ export interface SEOConfig {
15
+ /** Output directory */
16
+ outputDir: string;
17
+ /** Required meta tags */
18
+ requiredMetaTags?: string[];
19
+ /** Whether to validate OpenGraph (default: true) */
20
+ validateOpenGraph?: boolean;
21
+ /** Whether to validate Twitter Cards (default: true) */
22
+ validateTwitterCards?: boolean;
23
+ }
24
+ /**
25
+ * SEO testing mode (stub).
26
+ */
27
+ export declare class SEOMode extends TestFunction {
28
+ readonly mode = "seo";
29
+ readonly name = "SEO";
30
+ readonly description = "Validates meta tags and SEO elements";
31
+ private config;
32
+ constructor(config: SEOConfig);
33
+ execute(page: Page, context: TestContext): Promise<TestResult>;
34
+ private calculateScore;
35
+ private sanitizeRoute;
36
+ private ensureDirectory;
37
+ private writeFile;
38
+ }
39
+ //# sourceMappingURL=SEOMode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SEOMode.d.ts","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/modes/SEOMode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,uBAAuB;IACvB,SAAS,EAAE,MAAM,CAAC;IAElB,yBAAyB;IACzB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE5B,oDAAoD;IACpD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,wDAAwD;IACxD,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED;;GAEG;AACH,qBAAa,OAAQ,SAAQ,YAAY;IACvC,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,IAAI,SAAS;IACtB,QAAQ,CAAC,WAAW,0CAA0C;IAE9D,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAKvB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAqNpE,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,aAAa;YAIP,eAAe;YAKf,SAAS;CAIxB"}