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