@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,339 @@
1
+ /**
2
+ * Core screenshot annotation capture logic.
3
+ *
4
+ * Captures full-page screenshots with element annotations including:
5
+ * - Bounding boxes (viewport and page coordinates)
6
+ * - Element metadata (testid, tag, attributes, styles)
7
+ * - Interaction capabilities
8
+ * - Element hierarchy (parent/child relationships)
9
+ * - ARIA attributes for accessibility analysis
10
+ *
11
+ * Uses single-pass DOM traversal for efficiency.
12
+ *
13
+ * @packageDocumentation
14
+ */
15
+ import * as fs from 'fs/promises';
16
+ import * as path from 'path';
17
+ /**
18
+ * Screenshot annotator.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * const annotator = new ScreenshotAnnotator({
23
+ * outputDir: './screenshots',
24
+ * fullPage: true
25
+ * });
26
+ *
27
+ * const result = await annotator.capture(page, '/dashboard');
28
+ * console.log(`Captured ${result.annotations.length} annotations`);
29
+ * ```
30
+ */
31
+ export class ScreenshotAnnotator {
32
+ constructor(config) {
33
+ this.config = {
34
+ fullPage: true,
35
+ includeInvisible: false,
36
+ minElementSize: 5,
37
+ detectNavigation: true,
38
+ captureLoadMetrics: true,
39
+ ...config,
40
+ };
41
+ }
42
+ /**
43
+ * Capture annotated screenshot for a page.
44
+ *
45
+ * @param page - Playwright page instance
46
+ * @param route - Route being captured
47
+ * @param viewportName - Optional viewport name for responsive testing
48
+ * @returns Annotated screenshot
49
+ */
50
+ async capture(page, route, viewportName) {
51
+ const startTime = Date.now();
52
+ // Ensure output directory exists
53
+ await fs.mkdir(this.config.outputDir, { recursive: true });
54
+ // Capture screenshot
55
+ const screenshotFilename = this.generateScreenshotFilename(route, viewportName);
56
+ const screenshotPath = path.join(this.config.outputDir, screenshotFilename);
57
+ const screenshot = await page.screenshot({
58
+ path: screenshotPath,
59
+ fullPage: this.config.fullPage,
60
+ type: 'png',
61
+ });
62
+ // Extract element annotations (single-pass DOM traversal)
63
+ const annotations = await this.extractAnnotations(page);
64
+ // Extract page metadata
65
+ const pageMetadata = await this.extractPageMetadata(page);
66
+ const result = {
67
+ route,
68
+ screenshot: Buffer.from(screenshot),
69
+ screenshotPath,
70
+ annotations,
71
+ pageMetadata,
72
+ timestamp: new Date(),
73
+ };
74
+ // Save annotation JSON
75
+ const annotationFilename = screenshotFilename.replace('.png', '.json');
76
+ const annotationPath = path.join(this.config.outputDir, annotationFilename);
77
+ await fs.writeFile(annotationPath, JSON.stringify(result, null, 2));
78
+ console.log(`Captured screenshot in ${Date.now() - startTime}ms: ${screenshotPath}`);
79
+ console.log(` Annotations: ${annotations.length}`);
80
+ console.log(` Annotation JSON: ${annotationPath}`);
81
+ return result;
82
+ }
83
+ /**
84
+ * Extract element annotations via single-pass DOM traversal.
85
+ *
86
+ * @param page - Playwright page instance
87
+ * @returns Array of element annotations
88
+ */
89
+ async extractAnnotations(page) {
90
+ const config = this.config;
91
+ // Single-pass DOM traversal in browser context
92
+ const rawAnnotations = await page.evaluate(({ includeInvisible, minElementSize, detectNavigation }) => {
93
+ const annotations = [];
94
+ const elementMap = new Map(); // Element -> ID mapping
95
+ let idCounter = 0;
96
+ // Get all elements
97
+ const allElements = Array.from(document.querySelectorAll('*'));
98
+ for (const element of allElements) {
99
+ // Generate unique ID
100
+ const elementId = `elem-${idCounter++}`;
101
+ elementMap.set(element, elementId);
102
+ // Get bounding box
103
+ const rect = element.getBoundingClientRect();
104
+ // Skip elements below minimum size
105
+ if (rect.width < minElementSize || rect.height < minElementSize) {
106
+ continue;
107
+ }
108
+ // Get computed styles
109
+ const computedStyle = window.getComputedStyle(element);
110
+ // Check visibility
111
+ const isVisible = computedStyle.visibility !== 'hidden' &&
112
+ computedStyle.display !== 'none' &&
113
+ parseFloat(computedStyle.opacity) > 0 &&
114
+ rect.width > 0 &&
115
+ rect.height > 0;
116
+ // Skip invisible elements if configured
117
+ if (!includeInvisible && !isVisible) {
118
+ continue;
119
+ }
120
+ // Get viewport bounding box
121
+ const boundingBox = {
122
+ x: rect.left,
123
+ y: rect.top,
124
+ width: rect.width,
125
+ height: rect.height,
126
+ };
127
+ // Get page bounding box (for full-page screenshots)
128
+ const pageBoundingBox = {
129
+ x: rect.left + window.scrollX,
130
+ y: rect.top + window.scrollY,
131
+ width: rect.width,
132
+ height: rect.height,
133
+ };
134
+ // Get attributes
135
+ const attributes = {};
136
+ for (const attr of Array.from(element.attributes)) {
137
+ attributes[attr.name] = attr.value;
138
+ }
139
+ // Get ARIA attributes
140
+ const ariaAttributes = {};
141
+ for (const attr of Array.from(element.attributes)) {
142
+ if (attr.name.startsWith('aria-')) {
143
+ ariaAttributes[attr.name] = attr.value;
144
+ }
145
+ }
146
+ // Detect interaction capabilities
147
+ const interactions = [];
148
+ const tagName = element.tagName.toLowerCase();
149
+ // Clickable elements
150
+ if (tagName === 'button' ||
151
+ tagName === 'a' ||
152
+ attributes.role === 'button' ||
153
+ attributes.onclick ||
154
+ computedStyle.cursor === 'pointer') {
155
+ interactions.push({ type: 'click', hasHandler: !!attributes.onclick });
156
+ }
157
+ // Input elements
158
+ if (tagName === 'input' ||
159
+ tagName === 'textarea' ||
160
+ attributes.contenteditable === 'true') {
161
+ interactions.push({ type: 'input', hasHandler: true });
162
+ }
163
+ // Select elements
164
+ if (tagName === 'select') {
165
+ interactions.push({ type: 'select', hasHandler: true });
166
+ }
167
+ // Focusable elements
168
+ if (element.hasAttribute('tabindex') ||
169
+ ['input', 'button', 'a', 'select', 'textarea'].includes(tagName)) {
170
+ interactions.push({ type: 'focus', hasHandler: true });
171
+ }
172
+ // Hoverable elements (with hover effects)
173
+ const hoverSelector = `:hover`;
174
+ if (attributes.onmouseover || attributes.onmouseenter) {
175
+ interactions.push({ type: 'hover', hasHandler: true });
176
+ }
177
+ // Detect navigation targets
178
+ let navigationTarget = undefined;
179
+ if (detectNavigation && tagName === 'a' && attributes.href) {
180
+ navigationTarget = {
181
+ target: attributes.href,
182
+ method: 'link',
183
+ href: attributes.href,
184
+ opensInNewTab: attributes.target === '_blank',
185
+ };
186
+ }
187
+ // Get parent ID
188
+ let parentId = undefined;
189
+ if (element.parentElement) {
190
+ parentId = elementMap.get(element.parentElement);
191
+ }
192
+ // Get child IDs
193
+ const childIds = [];
194
+ for (const child of Array.from(element.children)) {
195
+ const childId = elementMap.get(child);
196
+ if (childId) {
197
+ childIds.push(childId);
198
+ }
199
+ }
200
+ // Build annotation
201
+ const annotation = {
202
+ id: elementId,
203
+ selector: getCssSelector(element),
204
+ testId: attributes['data-testid'],
205
+ tagName,
206
+ boundingBox,
207
+ pageBoundingBox,
208
+ computedStyles: {
209
+ backgroundColor: computedStyle.backgroundColor,
210
+ color: computedStyle.color,
211
+ fontFamily: computedStyle.fontFamily,
212
+ fontSize: computedStyle.fontSize,
213
+ fontWeight: computedStyle.fontWeight,
214
+ display: computedStyle.display,
215
+ position: computedStyle.position,
216
+ opacity: computedStyle.opacity,
217
+ visibility: computedStyle.visibility,
218
+ border: computedStyle.border,
219
+ borderRadius: computedStyle.borderRadius,
220
+ padding: computedStyle.padding,
221
+ margin: computedStyle.margin,
222
+ },
223
+ textContent: element.textContent?.trim().substring(0, 200) || undefined,
224
+ attributes,
225
+ isInteractive: interactions.length > 0,
226
+ interactions,
227
+ navigationTarget,
228
+ parentId,
229
+ childIds,
230
+ ariaAttributes,
231
+ isVisible,
232
+ zIndex: parseInt(computedStyle.zIndex) || 0,
233
+ };
234
+ annotations.push(annotation);
235
+ }
236
+ // Helper: Generate CSS selector for element
237
+ function getCssSelector(element) {
238
+ if (element.id) {
239
+ return `#${element.id}`;
240
+ }
241
+ if (element.getAttribute('data-testid')) {
242
+ return `[data-testid="${element.getAttribute('data-testid')}"]`;
243
+ }
244
+ const path = [];
245
+ let current = element;
246
+ while (current && current.nodeType === Node.ELEMENT_NODE) {
247
+ let selector = current.tagName.toLowerCase();
248
+ if (current.id) {
249
+ selector += `#${current.id}`;
250
+ path.unshift(selector);
251
+ break;
252
+ }
253
+ const siblings = current.parentElement
254
+ ? Array.from(current.parentElement.children)
255
+ : [];
256
+ if (siblings.length > 1) {
257
+ const index = siblings.indexOf(current) + 1;
258
+ selector += `:nth-child(${index})`;
259
+ }
260
+ path.unshift(selector);
261
+ current = current.parentElement;
262
+ }
263
+ return path.join(' > ');
264
+ }
265
+ return annotations;
266
+ }, {
267
+ includeInvisible: this.config.includeInvisible || false,
268
+ minElementSize: this.config.minElementSize || 5,
269
+ detectNavigation: this.config.detectNavigation !== false,
270
+ });
271
+ return rawAnnotations;
272
+ }
273
+ /**
274
+ * Extract page metadata.
275
+ *
276
+ * @param page - Playwright page instance
277
+ * @returns Page metadata
278
+ */
279
+ async extractPageMetadata(page) {
280
+ const pageData = await page.evaluate(() => {
281
+ // Get meta tags
282
+ const metaTags = {};
283
+ const metaElements = Array.from(document.querySelectorAll('meta'));
284
+ for (const meta of metaElements) {
285
+ const name = meta.getAttribute('name') || meta.getAttribute('property') || '';
286
+ const content = meta.getAttribute('content') || '';
287
+ if (name) {
288
+ metaTags[name] = content;
289
+ }
290
+ }
291
+ // Get page size
292
+ const pageSize = {
293
+ width: Math.max(document.body.scrollWidth, document.documentElement.scrollWidth, document.body.offsetWidth, document.documentElement.offsetWidth, document.documentElement.clientWidth),
294
+ height: Math.max(document.body.scrollHeight, document.documentElement.scrollHeight, document.body.offsetHeight, document.documentElement.offsetHeight, document.documentElement.clientHeight),
295
+ };
296
+ // Get load metrics
297
+ const perfData = performance.getEntriesByType('navigation')[0];
298
+ const loadMetrics = perfData
299
+ ? {
300
+ domContentLoaded: perfData.domContentLoadedEventEnd - perfData.domContentLoadedEventStart,
301
+ loadComplete: perfData.loadEventEnd - perfData.loadEventStart,
302
+ }
303
+ : undefined;
304
+ return {
305
+ title: document.title,
306
+ url: window.location.href,
307
+ metaTags,
308
+ pageSize,
309
+ loadMetrics,
310
+ };
311
+ });
312
+ const viewport = page.viewportSize() || { width: 1280, height: 720 };
313
+ return {
314
+ ...pageData,
315
+ viewport,
316
+ };
317
+ }
318
+ /**
319
+ * Generate screenshot filename from route and viewport.
320
+ *
321
+ * @param route - Route path
322
+ * @param viewportName - Optional viewport name
323
+ * @returns Sanitized filename
324
+ */
325
+ generateScreenshotFilename(route, viewportName) {
326
+ // Sanitize route for filename
327
+ let filename = route.replace(/^\//, '').replace(/\//g, '-') || 'home';
328
+ // Remove query params and hash
329
+ filename = filename.split('?')[0].split('#')[0];
330
+ // Add viewport name if provided
331
+ if (viewportName) {
332
+ filename = `${filename}-${viewportName}`;
333
+ }
334
+ // Add timestamp
335
+ const timestamp = Date.now();
336
+ return `${filename}-${timestamp}.png`;
337
+ }
338
+ }
339
+ //# sourceMappingURL=ScreenshotAnnotator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScreenshotAnnotator.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/screenshot/ScreenshotAnnotator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Screenshot annotation system exports.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ export { ScreenshotAnnotator } from './ScreenshotAnnotator';
7
+ export type { ScreenshotAnnotatorConfig } from './ScreenshotAnnotator';
8
+ export { HTMLAnnotationRenderer } from './HTMLAnnotationRenderer';
9
+ export { CanvasAnnotationRenderer } from './CanvasAnnotationRenderer';
10
+ export type * from './types';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/screenshot/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAEvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,mBAAmB,SAAS,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Screenshot annotation system exports.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ export { ScreenshotAnnotator } from './ScreenshotAnnotator.js';
7
+ export { HTMLAnnotationRenderer } from './HTMLAnnotationRenderer.js';
8
+ export { CanvasAnnotationRenderer } from './CanvasAnnotationRenderer.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/screenshot/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC"}