@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.
- package/dist/cjs/src/background/navigation/NavigationGraph.js +48 -0
- package/dist/cjs/src/background/navigation/NavigationGraph.js.map +1 -1
- package/dist/cjs/src/browser.js +42 -1
- package/dist/cjs/src/browser.js.map +1 -1
- package/dist/cjs/src/decorators/ContainerHelpers.js +16 -1
- package/dist/cjs/src/decorators/ContainerHelpers.js.map +1 -1
- package/dist/cjs/src/decorators/Tool.js +2 -3
- package/dist/cjs/src/decorators/Tool.js.map +1 -1
- package/dist/cjs/src/testing/graph-tester/core/GraphTester.js +339 -0
- package/dist/cjs/src/testing/graph-tester/core/GraphTester.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/core/TestFunction.js +189 -0
- package/dist/cjs/src/testing/graph-tester/core/TestFunction.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/core/types.js +24 -0
- package/dist/cjs/src/testing/graph-tester/core/types.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/fixtures/index.js +13 -0
- package/dist/cjs/src/testing/graph-tester/fixtures/index.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/fixtures/portPool.js +184 -0
- package/dist/cjs/src/testing/graph-tester/fixtures/portPool.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/index.js +98 -0
- package/dist/cjs/src/testing/graph-tester/index.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/modes/AccessibilityMode.js +230 -0
- package/dist/cjs/src/testing/graph-tester/modes/AccessibilityMode.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/modes/PerformanceMode.js +168 -0
- package/dist/cjs/src/testing/graph-tester/modes/PerformanceMode.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/modes/SEOMode.js +264 -0
- package/dist/cjs/src/testing/graph-tester/modes/SEOMode.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/modes/VisualRegressionMode.js +199 -0
- package/dist/cjs/src/testing/graph-tester/modes/VisualRegressionMode.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/modes/index.js +17 -0
- package/dist/cjs/src/testing/graph-tester/modes/index.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/reporters/HTMLReporter.js +411 -0
- package/dist/cjs/src/testing/graph-tester/reporters/HTMLReporter.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/reporters/JSONReporter.js +127 -0
- package/dist/cjs/src/testing/graph-tester/reporters/JSONReporter.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/reporters/MarkdownReporter.js +169 -0
- package/dist/cjs/src/testing/graph-tester/reporters/MarkdownReporter.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/reporters/UnifiedReporter.js +118 -0
- package/dist/cjs/src/testing/graph-tester/reporters/UnifiedReporter.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/reporters/index.js +17 -0
- package/dist/cjs/src/testing/graph-tester/reporters/index.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js +47 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js +584 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js +376 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/index.js +15 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/index.js.map +1 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/types.js +11 -0
- package/dist/cjs/src/testing/graph-tester/screenshot/types.js.map +1 -0
- package/dist/cjs/src/testing/selectors.js +1 -1
- package/dist/esm/src/background/navigation/INavigationGraph.d.ts +15 -0
- package/dist/esm/src/background/navigation/INavigationGraph.d.ts.map +1 -1
- package/dist/esm/src/background/navigation/NavigationGraph.d.ts +32 -0
- package/dist/esm/src/background/navigation/NavigationGraph.d.ts.map +1 -1
- package/dist/esm/src/background/navigation/NavigationGraph.js +48 -0
- package/dist/esm/src/background/navigation/NavigationGraph.js.map +1 -1
- package/dist/esm/src/browser.d.ts +9 -0
- package/dist/esm/src/browser.d.ts.map +1 -1
- package/dist/esm/src/browser.js +14 -0
- package/dist/esm/src/browser.js.map +1 -1
- package/dist/esm/src/decorators/ContainerHelpers.d.ts +2 -1
- package/dist/esm/src/decorators/ContainerHelpers.d.ts.map +1 -1
- package/dist/esm/src/decorators/ContainerHelpers.js +16 -1
- package/dist/esm/src/decorators/ContainerHelpers.js.map +1 -1
- package/dist/esm/src/decorators/Tool.d.ts.map +1 -1
- package/dist/esm/src/decorators/Tool.js +2 -3
- package/dist/esm/src/decorators/Tool.js.map +1 -1
- package/dist/esm/src/testing/graph-tester/core/GraphTester.d.ts +110 -0
- package/dist/esm/src/testing/graph-tester/core/GraphTester.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/core/GraphTester.js +335 -0
- package/dist/esm/src/testing/graph-tester/core/GraphTester.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/core/TestFunction.d.ts +120 -0
- package/dist/esm/src/testing/graph-tester/core/TestFunction.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/core/TestFunction.js +184 -0
- package/dist/esm/src/testing/graph-tester/core/TestFunction.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/core/types.d.ts +331 -0
- package/dist/esm/src/testing/graph-tester/core/types.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/core/types.js +21 -0
- package/dist/esm/src/testing/graph-tester/core/types.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/fixtures/index.d.ts +8 -0
- package/dist/esm/src/testing/graph-tester/fixtures/index.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/fixtures/index.js +7 -0
- package/dist/esm/src/testing/graph-tester/fixtures/index.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/fixtures/portPool.d.ts +40 -0
- package/dist/esm/src/testing/graph-tester/fixtures/portPool.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/fixtures/portPool.js +147 -0
- package/dist/esm/src/testing/graph-tester/fixtures/portPool.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/index.d.ts +84 -0
- package/dist/esm/src/testing/graph-tester/index.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/index.js +77 -0
- package/dist/esm/src/testing/graph-tester/index.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.d.ts +40 -0
- package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.js +193 -0
- package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.d.ts +42 -0
- package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.js +131 -0
- package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/SEOMode.d.ts +39 -0
- package/dist/esm/src/testing/graph-tester/modes/SEOMode.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/SEOMode.js +227 -0
- package/dist/esm/src/testing/graph-tester/modes/SEOMode.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.d.ts +83 -0
- package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.js +162 -0
- package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/index.d.ts +14 -0
- package/dist/esm/src/testing/graph-tester/modes/index.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/modes/index.js +10 -0
- package/dist/esm/src/testing/graph-tester/modes/index.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.d.ts +38 -0
- package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.js +374 -0
- package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.d.ts +50 -0
- package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.js +90 -0
- package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.d.ts +33 -0
- package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.js +132 -0
- package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.d.ts +30 -0
- package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.js +81 -0
- package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/index.d.ts +14 -0
- package/dist/esm/src/testing/graph-tester/reporters/index.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/reporters/index.js +10 -0
- package/dist/esm/src/testing/graph-tester/reporters/index.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.d.ts +33 -0
- package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js +43 -0
- package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.d.ts +70 -0
- package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js +547 -0
- package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.d.ts +83 -0
- package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js +339 -0
- package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/index.d.ts +11 -0
- package/dist/esm/src/testing/graph-tester/screenshot/index.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/index.js +9 -0
- package/dist/esm/src/testing/graph-tester/screenshot/index.js.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/types.d.ts +331 -0
- package/dist/esm/src/testing/graph-tester/screenshot/types.d.ts.map +1 -0
- package/dist/esm/src/testing/graph-tester/screenshot/types.js +10 -0
- package/dist/esm/src/testing/graph-tester/screenshot/types.js.map +1 -0
- package/dist/esm/src/testing/selectors.d.ts +1 -1
- package/dist/esm/src/testing/selectors.js +1 -1
- package/package.json +19 -6
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for the graph-based testing framework.
|
|
3
|
+
*
|
|
4
|
+
* This file is the contract between all packages - changes require consensus.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
import type { Page } from '@playwright/test';
|
|
9
|
+
/**
|
|
10
|
+
* Context provided to test functions during execution.
|
|
11
|
+
* Contains route information and optional metadata.
|
|
12
|
+
*/
|
|
13
|
+
export interface TestContext {
|
|
14
|
+
/** The route being tested (e.g., '/', '/dashboard', '/blog/:slug') */
|
|
15
|
+
route: string;
|
|
16
|
+
/** Unique identifier for this navigation context (enterprise only) */
|
|
17
|
+
contextId?: string;
|
|
18
|
+
/** Additional metadata about the route (tools, parent/child, custom data) */
|
|
19
|
+
metadata?: RouteMetadata;
|
|
20
|
+
/** Base URL for the application under test */
|
|
21
|
+
baseUrl?: string;
|
|
22
|
+
/** Current viewport being tested (for responsive testing) */
|
|
23
|
+
viewport?: ViewportConfig;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Metadata associated with a route.
|
|
27
|
+
* Enterprise users get richer metadata via NavigationGraph.
|
|
28
|
+
*/
|
|
29
|
+
export interface RouteMetadata {
|
|
30
|
+
/** Human-readable name for the route */
|
|
31
|
+
name?: string;
|
|
32
|
+
/** Tools available on this route (enterprise only) */
|
|
33
|
+
tools?: string[];
|
|
34
|
+
/** Parent route in navigation hierarchy (enterprise only) */
|
|
35
|
+
parent?: string;
|
|
36
|
+
/** Child routes (enterprise only) */
|
|
37
|
+
children?: string[];
|
|
38
|
+
/** Navigation paths to other routes (enterprise only) */
|
|
39
|
+
navigationPaths?: NavigationPath[];
|
|
40
|
+
/** Custom user-defined metadata */
|
|
41
|
+
[key: string]: any;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Navigation path between routes (enterprise only).
|
|
45
|
+
*/
|
|
46
|
+
export interface NavigationPath {
|
|
47
|
+
/** Target route */
|
|
48
|
+
target: string;
|
|
49
|
+
/** Navigation method (link, button, programmatic) */
|
|
50
|
+
method: 'link' | 'button' | 'programmatic' | 'other';
|
|
51
|
+
/** Element selector that triggers navigation (if applicable) */
|
|
52
|
+
selector?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Result of a test function execution.
|
|
56
|
+
*/
|
|
57
|
+
export interface TestResult {
|
|
58
|
+
/** Whether the test passed */
|
|
59
|
+
passed: boolean;
|
|
60
|
+
/** Duration in milliseconds */
|
|
61
|
+
duration: number;
|
|
62
|
+
/** Errors encountered during testing */
|
|
63
|
+
errors: TestError[];
|
|
64
|
+
/** Additional test-specific metadata (screenshots, metrics, violations, etc.) */
|
|
65
|
+
metadata: Record<string, any>;
|
|
66
|
+
/** Test mode that produced this result */
|
|
67
|
+
mode?: TestMode;
|
|
68
|
+
/** Route that was tested */
|
|
69
|
+
route?: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Error encountered during testing.
|
|
73
|
+
*/
|
|
74
|
+
export interface TestError {
|
|
75
|
+
/** Error severity */
|
|
76
|
+
severity: 'critical' | 'warning' | 'info';
|
|
77
|
+
/** Error message */
|
|
78
|
+
message: string;
|
|
79
|
+
/** Location where error occurred (file:line, selector, etc.) */
|
|
80
|
+
location?: string;
|
|
81
|
+
/** Stack trace (if available) */
|
|
82
|
+
stack?: string;
|
|
83
|
+
/** Additional error context */
|
|
84
|
+
context?: Record<string, any>;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Descriptor for a route to be tested.
|
|
88
|
+
* Open-source users provide these manually.
|
|
89
|
+
* Enterprise users get these automatically via NavigationGraph.
|
|
90
|
+
*/
|
|
91
|
+
export interface RouteDescriptor {
|
|
92
|
+
/** The route path */
|
|
93
|
+
route: string;
|
|
94
|
+
/** Unique identifier (enterprise only) */
|
|
95
|
+
contextId?: string;
|
|
96
|
+
/** Route metadata */
|
|
97
|
+
metadata?: RouteMetadata;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Configuration for route discovery.
|
|
101
|
+
*/
|
|
102
|
+
export interface RouteDiscoveryConfig {
|
|
103
|
+
/** Discovery strategy ('manual', 'navigation-graph', 'custom') */
|
|
104
|
+
strategy: 'manual' | 'navigation-graph' | 'custom';
|
|
105
|
+
/** Routes to include (glob patterns) */
|
|
106
|
+
include?: string[];
|
|
107
|
+
/** Routes to exclude (glob patterns) */
|
|
108
|
+
exclude?: string[];
|
|
109
|
+
/** Custom discovery function */
|
|
110
|
+
discoveryFn?: () => Promise<RouteDescriptor[]>;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Available test modes.
|
|
114
|
+
*/
|
|
115
|
+
export type TestMode = 'visual' | 'performance' | 'accessibility' | 'seo' | string;
|
|
116
|
+
/**
|
|
117
|
+
* Configuration for a test mode.
|
|
118
|
+
*/
|
|
119
|
+
export interface TestModeConfig {
|
|
120
|
+
/** Mode identifier */
|
|
121
|
+
mode: TestMode;
|
|
122
|
+
/** Whether this mode is enabled */
|
|
123
|
+
enabled?: boolean;
|
|
124
|
+
/** Mode-specific options */
|
|
125
|
+
options?: Record<string, any>;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Configuration for GraphTester.
|
|
129
|
+
*/
|
|
130
|
+
export interface GraphTesterConfig {
|
|
131
|
+
/** Base URL for the application under test */
|
|
132
|
+
baseUrl: string;
|
|
133
|
+
/** Routes to test (manual mode) or discovery config */
|
|
134
|
+
routes?: RouteDescriptor[] | RouteDiscoveryConfig;
|
|
135
|
+
/** Test modes to run */
|
|
136
|
+
modes: TestMode[] | TestModeConfig[];
|
|
137
|
+
/** Output configuration */
|
|
138
|
+
output?: OutputConfig;
|
|
139
|
+
/** Execution configuration */
|
|
140
|
+
execution?: ExecutionConfig;
|
|
141
|
+
/** Browser configuration */
|
|
142
|
+
browser?: BrowserConfig;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Output configuration.
|
|
146
|
+
*/
|
|
147
|
+
export interface OutputConfig {
|
|
148
|
+
/** Output directory */
|
|
149
|
+
dir: string;
|
|
150
|
+
/** Output formats ('json', 'html', 'markdown', 'csv') */
|
|
151
|
+
formats?: ('json' | 'html' | 'markdown' | 'csv')[];
|
|
152
|
+
/** Whether to include screenshots */
|
|
153
|
+
includeScreenshots?: boolean;
|
|
154
|
+
/** Whether to include detailed logs */
|
|
155
|
+
includeDetailedLogs?: boolean;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Execution configuration.
|
|
159
|
+
*/
|
|
160
|
+
export interface ExecutionConfig {
|
|
161
|
+
/** Number of parallel workers */
|
|
162
|
+
parallel?: number;
|
|
163
|
+
/** Timeout per test (ms) */
|
|
164
|
+
timeout?: number;
|
|
165
|
+
/** Number of retries on failure */
|
|
166
|
+
retries?: number;
|
|
167
|
+
/** Whether to fail fast on first error */
|
|
168
|
+
failFast?: boolean;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Viewport configuration for responsive testing.
|
|
172
|
+
*/
|
|
173
|
+
export interface ViewportConfig {
|
|
174
|
+
/** Viewport name (e.g., 'desktop', 'tablet', 'mobile') */
|
|
175
|
+
name: string;
|
|
176
|
+
/** Width in pixels */
|
|
177
|
+
width: number;
|
|
178
|
+
/** Height in pixels */
|
|
179
|
+
height: number;
|
|
180
|
+
/** Device scale factor (default: 1) */
|
|
181
|
+
deviceScaleFactor?: number;
|
|
182
|
+
/** Whether this is a mobile device (default: false) */
|
|
183
|
+
isMobile?: boolean;
|
|
184
|
+
/** Whether device has touch support (default: false) */
|
|
185
|
+
hasTouch?: boolean;
|
|
186
|
+
/** User agent override */
|
|
187
|
+
userAgent?: string;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Predefined viewport presets.
|
|
191
|
+
*/
|
|
192
|
+
export declare const ViewportPresets: {
|
|
193
|
+
readonly Desktop: {
|
|
194
|
+
readonly name: "desktop";
|
|
195
|
+
readonly width: 1920;
|
|
196
|
+
readonly height: 1080;
|
|
197
|
+
};
|
|
198
|
+
readonly DesktopSmall: {
|
|
199
|
+
readonly name: "desktop-small";
|
|
200
|
+
readonly width: 1366;
|
|
201
|
+
readonly height: 768;
|
|
202
|
+
};
|
|
203
|
+
readonly Laptop: {
|
|
204
|
+
readonly name: "laptop";
|
|
205
|
+
readonly width: 1280;
|
|
206
|
+
readonly height: 720;
|
|
207
|
+
};
|
|
208
|
+
readonly TabletLandscape: {
|
|
209
|
+
readonly name: "tablet-landscape";
|
|
210
|
+
readonly width: 1024;
|
|
211
|
+
readonly height: 768;
|
|
212
|
+
readonly isMobile: true;
|
|
213
|
+
readonly hasTouch: true;
|
|
214
|
+
};
|
|
215
|
+
readonly TabletPortrait: {
|
|
216
|
+
readonly name: "tablet-portrait";
|
|
217
|
+
readonly width: 768;
|
|
218
|
+
readonly height: 1024;
|
|
219
|
+
readonly isMobile: true;
|
|
220
|
+
readonly hasTouch: true;
|
|
221
|
+
};
|
|
222
|
+
readonly MobileLarge: {
|
|
223
|
+
readonly name: "mobile-large";
|
|
224
|
+
readonly width: 414;
|
|
225
|
+
readonly height: 896;
|
|
226
|
+
readonly isMobile: true;
|
|
227
|
+
readonly hasTouch: true;
|
|
228
|
+
};
|
|
229
|
+
readonly Mobile: {
|
|
230
|
+
readonly name: "mobile";
|
|
231
|
+
readonly width: 375;
|
|
232
|
+
readonly height: 812;
|
|
233
|
+
readonly isMobile: true;
|
|
234
|
+
readonly hasTouch: true;
|
|
235
|
+
};
|
|
236
|
+
readonly MobileSmall: {
|
|
237
|
+
readonly name: "mobile-small";
|
|
238
|
+
readonly width: 320;
|
|
239
|
+
readonly height: 568;
|
|
240
|
+
readonly isMobile: true;
|
|
241
|
+
readonly hasTouch: true;
|
|
242
|
+
};
|
|
243
|
+
};
|
|
244
|
+
/**
|
|
245
|
+
* Browser configuration.
|
|
246
|
+
*/
|
|
247
|
+
export interface BrowserConfig {
|
|
248
|
+
/** Browser type ('chromium', 'firefox', 'webkit') */
|
|
249
|
+
browserType?: 'chromium' | 'firefox' | 'webkit';
|
|
250
|
+
/** Single viewport size (legacy - use viewports for responsive testing) */
|
|
251
|
+
viewport?: {
|
|
252
|
+
width: number;
|
|
253
|
+
height: number;
|
|
254
|
+
};
|
|
255
|
+
/** Multiple viewports for responsive testing */
|
|
256
|
+
viewports?: ViewportConfig[];
|
|
257
|
+
/** Whether to run headless */
|
|
258
|
+
headless?: boolean;
|
|
259
|
+
/** Additional launch options */
|
|
260
|
+
launchOptions?: Record<string, any>;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Aggregated results from all test executions.
|
|
264
|
+
*/
|
|
265
|
+
export interface AggregatedTestResults {
|
|
266
|
+
/** Total number of routes tested */
|
|
267
|
+
routeCount: number;
|
|
268
|
+
/** Total number of tests run */
|
|
269
|
+
testCount: number;
|
|
270
|
+
/** Number of passed tests */
|
|
271
|
+
passedCount: number;
|
|
272
|
+
/** Number of failed tests */
|
|
273
|
+
failedCount: number;
|
|
274
|
+
/** Pass rate percentage */
|
|
275
|
+
passRate: number;
|
|
276
|
+
/** Total duration (ms) */
|
|
277
|
+
totalDuration: number;
|
|
278
|
+
/** Results grouped by route */
|
|
279
|
+
resultsByRoute: Map<string, TestResult[]>;
|
|
280
|
+
/** Results grouped by mode */
|
|
281
|
+
resultsByMode: Map<TestMode, TestResult[]>;
|
|
282
|
+
/** All errors */
|
|
283
|
+
errors: TestError[];
|
|
284
|
+
/** Timestamp */
|
|
285
|
+
timestamp: Date;
|
|
286
|
+
/** Configuration used */
|
|
287
|
+
config: GraphTesterConfig;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Reporter interface.
|
|
291
|
+
*/
|
|
292
|
+
export interface Reporter {
|
|
293
|
+
/** Generate report from aggregated results */
|
|
294
|
+
generate(results: AggregatedTestResults): Promise<void>;
|
|
295
|
+
/** Reporter name */
|
|
296
|
+
name: string;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Report format options.
|
|
300
|
+
*/
|
|
301
|
+
export type ReportFormat = 'json' | 'html' | 'markdown' | 'csv';
|
|
302
|
+
/**
|
|
303
|
+
* Test function execution options.
|
|
304
|
+
*/
|
|
305
|
+
export interface ExecuteOptions {
|
|
306
|
+
/** Playwright page instance */
|
|
307
|
+
page: Page;
|
|
308
|
+
/** Test context */
|
|
309
|
+
context: TestContext;
|
|
310
|
+
/** Timeout (ms) */
|
|
311
|
+
timeout?: number;
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Test function setup options.
|
|
315
|
+
*/
|
|
316
|
+
export interface SetupOptions {
|
|
317
|
+
/** Playwright page instance */
|
|
318
|
+
page: Page;
|
|
319
|
+
/** Test context */
|
|
320
|
+
context?: TestContext;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Test function teardown options.
|
|
324
|
+
*/
|
|
325
|
+
export interface TeardownOptions {
|
|
326
|
+
/** Playwright page instance */
|
|
327
|
+
page: Page;
|
|
328
|
+
/** Test context */
|
|
329
|
+
context?: TestContext;
|
|
330
|
+
}
|
|
331
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for the graph-based testing framework.
|
|
3
|
+
*
|
|
4
|
+
* This file is the contract between all packages - changes require consensus.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Predefined viewport presets.
|
|
10
|
+
*/
|
|
11
|
+
export const ViewportPresets = {
|
|
12
|
+
Desktop: { name: 'desktop', width: 1920, height: 1080 },
|
|
13
|
+
DesktopSmall: { name: 'desktop-small', width: 1366, height: 768 },
|
|
14
|
+
Laptop: { name: 'laptop', width: 1280, height: 720 },
|
|
15
|
+
TabletLandscape: { name: 'tablet-landscape', width: 1024, height: 768, isMobile: true, hasTouch: true },
|
|
16
|
+
TabletPortrait: { name: 'tablet-portrait', width: 768, height: 1024, isMobile: true, hasTouch: true },
|
|
17
|
+
MobileLarge: { name: 'mobile-large', width: 414, height: 896, isMobile: true, hasTouch: true },
|
|
18
|
+
Mobile: { name: 'mobile', width: 375, height: 812, isMobile: true, hasTouch: true },
|
|
19
|
+
MobileSmall: { name: 'mobile-small', width: 320, height: 568, isMobile: true, hasTouch: true },
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/core/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyPH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACvD,YAAY,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IACjE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;IACpD,eAAe,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;IACvG,cAAc,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;IACrG,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;IAC9F,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;IACnF,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;CACtF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/fixtures/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/fixtures/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port pool fixture for parallel testing.
|
|
3
|
+
*
|
|
4
|
+
* Automatically assigns unique ports to each test worker to avoid conflicts.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Port pool fixture interface.
|
|
10
|
+
*/
|
|
11
|
+
export interface PortPoolFixture {
|
|
12
|
+
/** Assigned port for this test */
|
|
13
|
+
port: number;
|
|
14
|
+
/** Base URL with assigned port */
|
|
15
|
+
baseURL: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Playwright test fixture with automatic port assignment.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* import { test, expect } from '@supernal/interface/testing/graph-tester/fixtures';
|
|
23
|
+
*
|
|
24
|
+
* test('visual regression', async ({ page, port, baseURL }) => {
|
|
25
|
+
* console.log(`Test running on port ${port}`);
|
|
26
|
+
* await page.goto(baseURL);
|
|
27
|
+
* // Test automatically gets unique port!
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare const test: import("@playwright/test").TestType<import("@playwright/test").PlaywrightTestArgs & import("@playwright/test").PlaywrightTestOptions & PortPoolFixture, import("@playwright/test").PlaywrightWorkerArgs & import("@playwright/test").PlaywrightWorkerOptions>;
|
|
32
|
+
/**
|
|
33
|
+
* Re-export expect from Playwright.
|
|
34
|
+
*/
|
|
35
|
+
export declare const expect: import("@playwright/test").Expect<{}>;
|
|
36
|
+
/**
|
|
37
|
+
* Cleanup port pool (call at end of test suite).
|
|
38
|
+
*/
|
|
39
|
+
export declare function cleanupPortPool(): Promise<void>;
|
|
40
|
+
//# sourceMappingURL=portPool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portPool.d.ts","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/fixtures/portPool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IAEb,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AA2GD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,IAAI,+PAUf,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM,uCAAa,CAAC;AAEjC;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAErD"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Port pool fixture for parallel testing.
|
|
3
|
+
*
|
|
4
|
+
* Automatically assigns unique ports to each test worker to avoid conflicts.
|
|
5
|
+
*
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
*/
|
|
8
|
+
import { test as base, expect as baseExpect } from '@playwright/test';
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import * as os from 'os';
|
|
12
|
+
/**
|
|
13
|
+
* Port pool manager (singleton across workers).
|
|
14
|
+
*/
|
|
15
|
+
class PortPoolManager {
|
|
16
|
+
constructor(startPort = 3020, poolSize = 10) {
|
|
17
|
+
this.availablePorts = [];
|
|
18
|
+
this.usedPorts = new Set();
|
|
19
|
+
this.lockFile = path.join(os.tmpdir(), 'supernal-port-pool.lock');
|
|
20
|
+
this.lockFd = null;
|
|
21
|
+
// Initialize pool: 3020-3029 by default
|
|
22
|
+
for (let i = 0; i < poolSize; i++) {
|
|
23
|
+
this.availablePorts.push(startPort + i);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Acquire a port from the pool (with cross-worker coordination).
|
|
28
|
+
*/
|
|
29
|
+
async acquirePort() {
|
|
30
|
+
await this.acquireLock();
|
|
31
|
+
try {
|
|
32
|
+
if (this.availablePorts.length === 0) {
|
|
33
|
+
throw new Error('No available ports in pool. Increase pool size or reduce parallel workers.');
|
|
34
|
+
}
|
|
35
|
+
const port = this.availablePorts.shift();
|
|
36
|
+
this.usedPorts.add(port);
|
|
37
|
+
return port;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
await this.releaseLock();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Release a port back to the pool.
|
|
45
|
+
*/
|
|
46
|
+
async releasePort(port) {
|
|
47
|
+
await this.acquireLock();
|
|
48
|
+
try {
|
|
49
|
+
if (this.usedPorts.has(port)) {
|
|
50
|
+
this.usedPorts.delete(port);
|
|
51
|
+
this.availablePorts.push(port);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
await this.releaseLock();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Acquire file-based lock for cross-worker coordination.
|
|
60
|
+
*/
|
|
61
|
+
async acquireLock() {
|
|
62
|
+
const maxRetries = 100;
|
|
63
|
+
const retryDelay = 50; // ms
|
|
64
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
65
|
+
try {
|
|
66
|
+
// Try to create lock file with exclusive flag
|
|
67
|
+
this.lockFd = fs.openSync(this.lockFile, fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_RDWR);
|
|
68
|
+
return; // Lock acquired
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (error.code === 'EEXIST') {
|
|
72
|
+
// Lock file exists, wait and retry
|
|
73
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelay));
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
throw new Error('Failed to acquire port pool lock after retries');
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Release file-based lock.
|
|
84
|
+
*/
|
|
85
|
+
async releaseLock() {
|
|
86
|
+
if (this.lockFd !== null) {
|
|
87
|
+
try {
|
|
88
|
+
fs.closeSync(this.lockFd);
|
|
89
|
+
fs.unlinkSync(this.lockFile);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
// Ignore errors (file might already be deleted)
|
|
93
|
+
}
|
|
94
|
+
this.lockFd = null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Cleanup all resources.
|
|
99
|
+
*/
|
|
100
|
+
async cleanup() {
|
|
101
|
+
try {
|
|
102
|
+
if (fs.existsSync(this.lockFile)) {
|
|
103
|
+
fs.unlinkSync(this.lockFile);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Ignore
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Global port pool instance
|
|
112
|
+
const portPool = new PortPoolManager();
|
|
113
|
+
/**
|
|
114
|
+
* Playwright test fixture with automatic port assignment.
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* import { test, expect } from '@supernal/interface/testing/graph-tester/fixtures';
|
|
119
|
+
*
|
|
120
|
+
* test('visual regression', async ({ page, port, baseURL }) => {
|
|
121
|
+
* console.log(`Test running on port ${port}`);
|
|
122
|
+
* await page.goto(baseURL);
|
|
123
|
+
* // Test automatically gets unique port!
|
|
124
|
+
* });
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export const test = base.extend({
|
|
128
|
+
port: async ({}, use) => {
|
|
129
|
+
const port = await portPool.acquirePort();
|
|
130
|
+
await use(port);
|
|
131
|
+
await portPool.releasePort(port);
|
|
132
|
+
},
|
|
133
|
+
baseURL: async ({ port }, use) => {
|
|
134
|
+
await use(`http://localhost:${port}`);
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
/**
|
|
138
|
+
* Re-export expect from Playwright.
|
|
139
|
+
*/
|
|
140
|
+
export const expect = baseExpect;
|
|
141
|
+
/**
|
|
142
|
+
* Cleanup port pool (call at end of test suite).
|
|
143
|
+
*/
|
|
144
|
+
export async function cleanupPortPool() {
|
|
145
|
+
await portPool.cleanup();
|
|
146
|
+
}
|
|
147
|
+
//# 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,84 @@
|
|
|
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
|
+
export { TestFunction, isTestFunction } from './core/TestFunction';
|
|
58
|
+
export { GraphTester } from './core/GraphTester';
|
|
59
|
+
export type * from './core/types';
|
|
60
|
+
export { ViewportPresets } from './core/types';
|
|
61
|
+
export { ScreenshotAnnotator } from './screenshot/ScreenshotAnnotator';
|
|
62
|
+
export type { ScreenshotAnnotatorConfig } from './screenshot/ScreenshotAnnotator';
|
|
63
|
+
export { HTMLAnnotationRenderer } from './screenshot/HTMLAnnotationRenderer';
|
|
64
|
+
export { CanvasAnnotationRenderer } from './screenshot/CanvasAnnotationRenderer';
|
|
65
|
+
export type * from './screenshot/types';
|
|
66
|
+
export { VisualRegressionMode } from './modes/VisualRegressionMode';
|
|
67
|
+
export type { VisualRegressionConfig } from './modes/VisualRegressionMode';
|
|
68
|
+
export { PerformanceMode } from './modes/PerformanceMode';
|
|
69
|
+
export type { PerformanceConfig } from './modes/PerformanceMode';
|
|
70
|
+
export { AccessibilityMode } from './modes/AccessibilityMode';
|
|
71
|
+
export type { AccessibilityConfig } from './modes/AccessibilityMode';
|
|
72
|
+
export { SEOMode } from './modes/SEOMode';
|
|
73
|
+
export type { SEOConfig } from './modes/SEOMode';
|
|
74
|
+
export { UnifiedReporter } from './reporters/UnifiedReporter';
|
|
75
|
+
export type { UnifiedReporterConfig } from './reporters/UnifiedReporter';
|
|
76
|
+
export { JSONReporter } from './reporters/JSONReporter';
|
|
77
|
+
export type { JSONReporterConfig } from './reporters/JSONReporter';
|
|
78
|
+
export { HTMLReporter } from './reporters/HTMLReporter';
|
|
79
|
+
export type { HTMLReporterConfig } from './reporters/HTMLReporter';
|
|
80
|
+
export { MarkdownReporter } from './reporters/MarkdownReporter';
|
|
81
|
+
export type { MarkdownReporterConfig } from './reporters/MarkdownReporter';
|
|
82
|
+
export { test as testWithPortPool, expect, cleanupPortPool } from './fixtures/portPool';
|
|
83
|
+
export type { PortPoolFixture } from './fixtures/portPool';
|
|
84
|
+
//# sourceMappingURL=index.d.ts.map
|