@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,184 @@
1
+ "use strict";
2
+ /**
3
+ * Port pool fixture for parallel testing.
4
+ *
5
+ * Automatically assigns unique ports to each test worker to avoid conflicts.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.expect = exports.test = void 0;
44
+ exports.cleanupPortPool = cleanupPortPool;
45
+ const test_1 = require("@playwright/test");
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ const os = __importStar(require("os"));
49
+ /**
50
+ * Port pool manager (singleton across workers).
51
+ */
52
+ class PortPoolManager {
53
+ constructor(startPort = 3020, poolSize = 10) {
54
+ this.availablePorts = [];
55
+ this.usedPorts = new Set();
56
+ this.lockFile = path.join(os.tmpdir(), 'supernal-port-pool.lock');
57
+ this.lockFd = null;
58
+ // Initialize pool: 3020-3029 by default
59
+ for (let i = 0; i < poolSize; i++) {
60
+ this.availablePorts.push(startPort + i);
61
+ }
62
+ }
63
+ /**
64
+ * Acquire a port from the pool (with cross-worker coordination).
65
+ */
66
+ async acquirePort() {
67
+ await this.acquireLock();
68
+ try {
69
+ if (this.availablePorts.length === 0) {
70
+ throw new Error('No available ports in pool. Increase pool size or reduce parallel workers.');
71
+ }
72
+ const port = this.availablePorts.shift();
73
+ this.usedPorts.add(port);
74
+ return port;
75
+ }
76
+ finally {
77
+ await this.releaseLock();
78
+ }
79
+ }
80
+ /**
81
+ * Release a port back to the pool.
82
+ */
83
+ async releasePort(port) {
84
+ await this.acquireLock();
85
+ try {
86
+ if (this.usedPorts.has(port)) {
87
+ this.usedPorts.delete(port);
88
+ this.availablePorts.push(port);
89
+ }
90
+ }
91
+ finally {
92
+ await this.releaseLock();
93
+ }
94
+ }
95
+ /**
96
+ * Acquire file-based lock for cross-worker coordination.
97
+ */
98
+ async acquireLock() {
99
+ const maxRetries = 100;
100
+ const retryDelay = 50; // ms
101
+ for (let i = 0; i < maxRetries; i++) {
102
+ try {
103
+ // Try to create lock file with exclusive flag
104
+ this.lockFd = fs.openSync(this.lockFile, fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_RDWR);
105
+ return; // Lock acquired
106
+ }
107
+ catch (error) {
108
+ if (error.code === 'EEXIST') {
109
+ // Lock file exists, wait and retry
110
+ await new Promise((resolve) => setTimeout(resolve, retryDelay));
111
+ }
112
+ else {
113
+ throw error;
114
+ }
115
+ }
116
+ }
117
+ throw new Error('Failed to acquire port pool lock after retries');
118
+ }
119
+ /**
120
+ * Release file-based lock.
121
+ */
122
+ async releaseLock() {
123
+ if (this.lockFd !== null) {
124
+ try {
125
+ fs.closeSync(this.lockFd);
126
+ fs.unlinkSync(this.lockFile);
127
+ }
128
+ catch (error) {
129
+ // Ignore errors (file might already be deleted)
130
+ }
131
+ this.lockFd = null;
132
+ }
133
+ }
134
+ /**
135
+ * Cleanup all resources.
136
+ */
137
+ async cleanup() {
138
+ try {
139
+ if (fs.existsSync(this.lockFile)) {
140
+ fs.unlinkSync(this.lockFile);
141
+ }
142
+ }
143
+ catch {
144
+ // Ignore
145
+ }
146
+ }
147
+ }
148
+ // Global port pool instance
149
+ const portPool = new PortPoolManager();
150
+ /**
151
+ * Playwright test fixture with automatic port assignment.
152
+ *
153
+ * @example
154
+ * ```typescript
155
+ * import { test, expect } from '@supernal/interface/testing/graph-tester/fixtures';
156
+ *
157
+ * test('visual regression', async ({ page, port, baseURL }) => {
158
+ * console.log(`Test running on port ${port}`);
159
+ * await page.goto(baseURL);
160
+ * // Test automatically gets unique port!
161
+ * });
162
+ * ```
163
+ */
164
+ exports.test = test_1.test.extend({
165
+ port: async ({}, use) => {
166
+ const port = await portPool.acquirePort();
167
+ await use(port);
168
+ await portPool.releasePort(port);
169
+ },
170
+ baseURL: async ({ port }, use) => {
171
+ await use(`http://localhost:${port}`);
172
+ },
173
+ });
174
+ /**
175
+ * Re-export expect from Playwright.
176
+ */
177
+ exports.expect = test_1.expect;
178
+ /**
179
+ * Cleanup port pool (call at end of test suite).
180
+ */
181
+ async function cleanupPortPool() {
182
+ await portPool.cleanup();
183
+ }
184
+ //# sourceMappingURL=portPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portPool.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/fixtures/portPool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ /**
3
+ * Graph-Based Testing Framework
4
+ *
5
+ * A comprehensive testing framework that systematically applies different testing functions
6
+ * (visual regression, performance, accessibility, SEO) to all routes in your application.
7
+ *
8
+ * ## Features
9
+ *
10
+ * - **Screenshot Annotation**: Capture screenshots with element bounding boxes, testids, and interaction capabilities
11
+ * - **Multiple Test Modes**: Visual regression, performance, accessibility, SEO
12
+ * - **AI-Ready Output**: JSON + PNG format optimized for multimodal AI analysis
13
+ * - **Multi-Format Reporting**: HTML (interactive), JSON (CI/CD), Markdown (docs)
14
+ * - **Parallel Testing**: Port pool fixture for running tests in parallel
15
+ * - **Pluggable Architecture**: Create custom test modes by extending TestFunction
16
+ *
17
+ * ## Usage
18
+ *
19
+ * ```typescript
20
+ * import { GraphTester, VisualRegressionMode, JSONReporter } from '@supernal/interface/testing/graph-tester';
21
+ *
22
+ * const tester = new GraphTester({
23
+ * baseUrl: 'http://localhost:3000',
24
+ * routes: [
25
+ * { route: '/', metadata: { name: 'Home' } },
26
+ * { route: '/dashboard', metadata: { name: 'Dashboard' } }
27
+ * ],
28
+ * modes: ['visual'],
29
+ * output: {
30
+ * dir: './test-results',
31
+ * formats: ['json', 'html']
32
+ * }
33
+ * });
34
+ *
35
+ * // Register test modes
36
+ * tester.registerTestFunction(new VisualRegressionMode({
37
+ * outputDir: './screenshots',
38
+ * annotate: true,
39
+ * generateHTML: true
40
+ * }));
41
+ *
42
+ * // Run tests
43
+ * const results = await tester.runTests();
44
+ * console.log(`Pass rate: ${results.passRate}%`);
45
+ *
46
+ * // Generate reports
47
+ * const reporter = new JSONReporter({ outputDir: './test-results' });
48
+ * await reporter.generate(results);
49
+ * ```
50
+ *
51
+ * ## Enterprise Features
52
+ *
53
+ * For automatic route discovery via NavigationGraph, CLI commands, and AI analysis,
54
+ * see `@supernalintelligence/interface-enterprise/testing/graph-tester`.
55
+ *
56
+ * @packageDocumentation
57
+ */
58
+ Object.defineProperty(exports, "__esModule", { value: true });
59
+ exports.cleanupPortPool = exports.expect = exports.testWithPortPool = exports.MarkdownReporter = exports.HTMLReporter = exports.JSONReporter = exports.UnifiedReporter = exports.SEOMode = exports.AccessibilityMode = exports.PerformanceMode = exports.VisualRegressionMode = exports.CanvasAnnotationRenderer = exports.HTMLAnnotationRenderer = exports.ScreenshotAnnotator = exports.ViewportPresets = exports.GraphTester = exports.isTestFunction = exports.TestFunction = void 0;
60
+ // ==================== Core ====================
61
+ var TestFunction_1 = require("./core/TestFunction");
62
+ Object.defineProperty(exports, "TestFunction", { enumerable: true, get: function () { return TestFunction_1.TestFunction; } });
63
+ Object.defineProperty(exports, "isTestFunction", { enumerable: true, get: function () { return TestFunction_1.isTestFunction; } });
64
+ var GraphTester_1 = require("./core/GraphTester");
65
+ Object.defineProperty(exports, "GraphTester", { enumerable: true, get: function () { return GraphTester_1.GraphTester; } });
66
+ var types_1 = require("./core/types");
67
+ Object.defineProperty(exports, "ViewportPresets", { enumerable: true, get: function () { return types_1.ViewportPresets; } });
68
+ // ==================== Screenshot Annotation ====================
69
+ var ScreenshotAnnotator_1 = require("./screenshot/ScreenshotAnnotator");
70
+ Object.defineProperty(exports, "ScreenshotAnnotator", { enumerable: true, get: function () { return ScreenshotAnnotator_1.ScreenshotAnnotator; } });
71
+ var HTMLAnnotationRenderer_1 = require("./screenshot/HTMLAnnotationRenderer");
72
+ Object.defineProperty(exports, "HTMLAnnotationRenderer", { enumerable: true, get: function () { return HTMLAnnotationRenderer_1.HTMLAnnotationRenderer; } });
73
+ var CanvasAnnotationRenderer_1 = require("./screenshot/CanvasAnnotationRenderer");
74
+ Object.defineProperty(exports, "CanvasAnnotationRenderer", { enumerable: true, get: function () { return CanvasAnnotationRenderer_1.CanvasAnnotationRenderer; } });
75
+ // ==================== Test Modes ====================
76
+ var VisualRegressionMode_1 = require("./modes/VisualRegressionMode");
77
+ Object.defineProperty(exports, "VisualRegressionMode", { enumerable: true, get: function () { return VisualRegressionMode_1.VisualRegressionMode; } });
78
+ var PerformanceMode_1 = require("./modes/PerformanceMode");
79
+ Object.defineProperty(exports, "PerformanceMode", { enumerable: true, get: function () { return PerformanceMode_1.PerformanceMode; } });
80
+ var AccessibilityMode_1 = require("./modes/AccessibilityMode");
81
+ Object.defineProperty(exports, "AccessibilityMode", { enumerable: true, get: function () { return AccessibilityMode_1.AccessibilityMode; } });
82
+ var SEOMode_1 = require("./modes/SEOMode");
83
+ Object.defineProperty(exports, "SEOMode", { enumerable: true, get: function () { return SEOMode_1.SEOMode; } });
84
+ // ==================== Reporters ====================
85
+ var UnifiedReporter_1 = require("./reporters/UnifiedReporter");
86
+ Object.defineProperty(exports, "UnifiedReporter", { enumerable: true, get: function () { return UnifiedReporter_1.UnifiedReporter; } });
87
+ var JSONReporter_1 = require("./reporters/JSONReporter");
88
+ Object.defineProperty(exports, "JSONReporter", { enumerable: true, get: function () { return JSONReporter_1.JSONReporter; } });
89
+ var HTMLReporter_1 = require("./reporters/HTMLReporter");
90
+ Object.defineProperty(exports, "HTMLReporter", { enumerable: true, get: function () { return HTMLReporter_1.HTMLReporter; } });
91
+ var MarkdownReporter_1 = require("./reporters/MarkdownReporter");
92
+ Object.defineProperty(exports, "MarkdownReporter", { enumerable: true, get: function () { return MarkdownReporter_1.MarkdownReporter; } });
93
+ // ==================== Fixtures ====================
94
+ var portPool_1 = require("./fixtures/portPool");
95
+ Object.defineProperty(exports, "testWithPortPool", { enumerable: true, get: function () { return portPool_1.test; } });
96
+ Object.defineProperty(exports, "expect", { enumerable: true, get: function () { return portPool_1.expect; } });
97
+ Object.defineProperty(exports, "cleanupPortPool", { enumerable: true, get: function () { return portPool_1.cleanupPortPool; } });
98
+ //# 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,oDAAmE;AAA1D,4GAAA,YAAY,OAAA;AAAE,8GAAA,cAAc,OAAA;AACrC,kDAAiD;AAAxC,0GAAA,WAAW,OAAA;AAEpB,sCAA+C;AAAtC,wGAAA,eAAe,OAAA;AAExB,kEAAkE;AAElE,wEAAuE;AAA9D,0HAAA,mBAAmB,OAAA;AAG5B,8EAA6E;AAApE,gIAAA,sBAAsB,OAAA;AAC/B,kFAAiF;AAAxE,oIAAA,wBAAwB,OAAA;AAIjC,uDAAuD;AAEvD,qEAAoE;AAA3D,4HAAA,oBAAoB,OAAA;AAG7B,2DAA0D;AAAjD,kHAAA,eAAe,OAAA;AAGxB,+DAA8D;AAArD,sHAAA,iBAAiB,OAAA;AAG1B,2CAA0C;AAAjC,kGAAA,OAAO,OAAA;AAGhB,sDAAsD;AAEtD,+DAA8D;AAArD,kHAAA,eAAe,OAAA;AAGxB,yDAAwD;AAA/C,4GAAA,YAAY,OAAA;AAGrB,yDAAwD;AAA/C,4GAAA,YAAY,OAAA;AAGrB,iEAAgE;AAAvD,oHAAA,gBAAgB,OAAA;AAGzB,qDAAqD;AAErD,gDAAwF;AAA/E,4GAAA,IAAI,OAAoB;AAAE,kGAAA,MAAM,OAAA;AAAE,2GAAA,eAAe,OAAA"}
@@ -0,0 +1,230 @@
1
+ "use strict";
2
+ /**
3
+ * Accessibility testing mode (stub - to be implemented in Phase 2).
4
+ *
5
+ * Will integrate axe-core for WCAG compliance testing.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.AccessibilityMode = void 0;
44
+ const TestFunction_1 = require("../core/TestFunction");
45
+ /**
46
+ * Accessibility testing mode (stub).
47
+ */
48
+ class AccessibilityMode extends TestFunction_1.TestFunction {
49
+ constructor(config) {
50
+ super();
51
+ this.mode = 'accessibility';
52
+ this.name = 'Accessibility';
53
+ this.description = 'Tests WCAG compliance using axe-core';
54
+ this.config = config;
55
+ }
56
+ async execute(page, context) {
57
+ const startTime = Date.now();
58
+ const errors = [];
59
+ try {
60
+ // Inject axe-core
61
+ await this.injectAxe(page);
62
+ // Run axe analysis with WCAG tags
63
+ const wcagTags = this.getWCAGTags();
64
+ const results = await page.evaluate((tags) => {
65
+ return new Promise((resolve) => {
66
+ // @ts-ignore - axe is injected globally
67
+ if (typeof window.axe === 'undefined') {
68
+ resolve({ violations: [], passes: [], incomplete: [], inapplicable: [] });
69
+ return;
70
+ }
71
+ // @ts-ignore
72
+ window.axe
73
+ .run({
74
+ runOnly: {
75
+ type: 'tag',
76
+ values: tags,
77
+ },
78
+ })
79
+ .then((results) => {
80
+ resolve(results);
81
+ })
82
+ .catch((error) => {
83
+ resolve({ violations: [], passes: [], incomplete: [], inapplicable: [], error: error.message });
84
+ });
85
+ });
86
+ }, wcagTags);
87
+ // Process violations
88
+ const violations = results.violations || [];
89
+ const warnings = results.incomplete || [];
90
+ // Build detailed violation reports
91
+ const violationReports = violations.map((v) => ({
92
+ id: v.id,
93
+ impact: v.impact,
94
+ description: v.description,
95
+ help: v.help,
96
+ helpUrl: v.helpUrl,
97
+ nodes: v.nodes.map((node) => ({
98
+ html: node.html,
99
+ target: node.target,
100
+ failureSummary: node.failureSummary,
101
+ })),
102
+ }));
103
+ const warningReports = warnings.map((w) => ({
104
+ id: w.id,
105
+ impact: w.impact,
106
+ description: w.description,
107
+ help: w.help,
108
+ helpUrl: w.helpUrl,
109
+ nodes: w.nodes.length,
110
+ }));
111
+ // Determine if test passed
112
+ const hasViolations = violations.length > 0;
113
+ const hasWarnings = warnings.length > 0;
114
+ const passed = this.config.strict ? !hasViolations && !hasWarnings : !hasViolations;
115
+ // Collect error messages
116
+ if (hasViolations) {
117
+ violations.forEach((v) => {
118
+ errors.push({
119
+ severity: v.impact === 'critical' ? 'critical' : 'warning',
120
+ message: `[${v.impact}] ${v.help} (${v.nodes.length} instances)`,
121
+ location: v.helpUrl,
122
+ });
123
+ });
124
+ }
125
+ if (this.config.strict && hasWarnings) {
126
+ warnings.forEach((w) => {
127
+ errors.push({
128
+ severity: 'info',
129
+ message: `[warning] ${w.help} (${w.nodes.length} instances)`,
130
+ location: w.helpUrl,
131
+ });
132
+ });
133
+ }
134
+ // Save results
135
+ const outputPath = `${this.config.outputDir}/${this.sanitizeRoute(context.route)}-accessibility.json`;
136
+ await this.ensureDirectory(this.config.outputDir);
137
+ await this.writeFile(outputPath, JSON.stringify({
138
+ route: context.route,
139
+ wcagVersion: this.config.wcagVersion || '2.1',
140
+ wcagLevel: this.config.wcagLevel || 'AA',
141
+ summary: {
142
+ violations: violations.length,
143
+ warnings: warnings.length,
144
+ passes: results.passes?.length || 0,
145
+ incomplete: results.incomplete?.length || 0,
146
+ },
147
+ violations: violationReports,
148
+ warnings: warningReports,
149
+ }, null, 2));
150
+ const duration = Date.now() - startTime;
151
+ return {
152
+ passed,
153
+ duration,
154
+ errors,
155
+ metadata: {
156
+ accessibility: {
157
+ violationCount: violations.length,
158
+ warningCount: warnings.length,
159
+ passCount: results.passes?.length || 0,
160
+ },
161
+ outputPath,
162
+ },
163
+ };
164
+ }
165
+ catch (error) {
166
+ errors.push({
167
+ severity: 'critical',
168
+ message: `Accessibility testing failed: ${error instanceof Error ? error.message : String(error)}`,
169
+ stack: error instanceof Error ? error.stack : undefined,
170
+ });
171
+ return {
172
+ passed: false,
173
+ duration: Date.now() - startTime,
174
+ errors,
175
+ metadata: {},
176
+ };
177
+ }
178
+ }
179
+ async injectAxe(page) {
180
+ try {
181
+ // Try to load axe-core from CDN
182
+ await page.addScriptTag({
183
+ url: 'https://cdnjs.cloudflare.com/ajax/libs/axe-core/4.8.3/axe.min.js',
184
+ });
185
+ }
186
+ catch (error) {
187
+ throw new Error('Failed to inject axe-core from CDN. Please check your network connection or use a local axe-core installation.');
188
+ }
189
+ }
190
+ getWCAGTags() {
191
+ const version = this.config.wcagVersion || '2.1';
192
+ const level = this.config.wcagLevel || 'AA';
193
+ const tags = ['wcag2a'];
194
+ if (level === 'AA' || level === 'AAA') {
195
+ tags.push('wcag2aa');
196
+ }
197
+ if (level === 'AAA') {
198
+ tags.push('wcag2aaa');
199
+ }
200
+ // Add version-specific tags
201
+ if (version === '2.1') {
202
+ tags.push('wcag21a');
203
+ if (level === 'AA' || level === 'AAA')
204
+ tags.push('wcag21aa');
205
+ if (level === 'AAA')
206
+ tags.push('wcag21aaa');
207
+ }
208
+ if (version === '2.2') {
209
+ tags.push('wcag21a', 'wcag22a');
210
+ if (level === 'AA' || level === 'AAA')
211
+ tags.push('wcag21aa', 'wcag22aa');
212
+ if (level === 'AAA')
213
+ tags.push('wcag21aaa', 'wcag22aaa');
214
+ }
215
+ return tags;
216
+ }
217
+ sanitizeRoute(route) {
218
+ return route.replace(/^\//, '').replace(/\//g, '-') || 'home';
219
+ }
220
+ async ensureDirectory(dir) {
221
+ const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
222
+ await fs.mkdir(dir, { recursive: true });
223
+ }
224
+ async writeFile(path, content) {
225
+ const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
226
+ await fs.writeFile(path, content, 'utf-8');
227
+ }
228
+ }
229
+ exports.AccessibilityMode = AccessibilityMode;
230
+ //# 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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"}