@supernal/interface 1.0.9 → 1.0.11

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 (147) hide show
  1. package/dist/cjs/src/browser.js +42 -1
  2. package/dist/cjs/src/browser.js.map +1 -1
  3. package/dist/cjs/src/decorators/ContainerHelpers.js +16 -1
  4. package/dist/cjs/src/decorators/ContainerHelpers.js.map +1 -1
  5. package/dist/cjs/src/decorators/Tool.js +2 -3
  6. package/dist/cjs/src/decorators/Tool.js.map +1 -1
  7. package/dist/cjs/src/testing/graph-tester/core/GraphTester.js +339 -0
  8. package/dist/cjs/src/testing/graph-tester/core/GraphTester.js.map +1 -0
  9. package/dist/cjs/src/testing/graph-tester/core/TestFunction.js +189 -0
  10. package/dist/cjs/src/testing/graph-tester/core/TestFunction.js.map +1 -0
  11. package/dist/cjs/src/testing/graph-tester/core/types.js +24 -0
  12. package/dist/cjs/src/testing/graph-tester/core/types.js.map +1 -0
  13. package/dist/cjs/src/testing/graph-tester/fixtures/index.js +13 -0
  14. package/dist/cjs/src/testing/graph-tester/fixtures/index.js.map +1 -0
  15. package/dist/cjs/src/testing/graph-tester/fixtures/portPool.js +184 -0
  16. package/dist/cjs/src/testing/graph-tester/fixtures/portPool.js.map +1 -0
  17. package/dist/cjs/src/testing/graph-tester/index.js +98 -0
  18. package/dist/cjs/src/testing/graph-tester/index.js.map +1 -0
  19. package/dist/cjs/src/testing/graph-tester/modes/AccessibilityMode.js +230 -0
  20. package/dist/cjs/src/testing/graph-tester/modes/AccessibilityMode.js.map +1 -0
  21. package/dist/cjs/src/testing/graph-tester/modes/PerformanceMode.js +168 -0
  22. package/dist/cjs/src/testing/graph-tester/modes/PerformanceMode.js.map +1 -0
  23. package/dist/cjs/src/testing/graph-tester/modes/SEOMode.js +264 -0
  24. package/dist/cjs/src/testing/graph-tester/modes/SEOMode.js.map +1 -0
  25. package/dist/cjs/src/testing/graph-tester/modes/VisualRegressionMode.js +199 -0
  26. package/dist/cjs/src/testing/graph-tester/modes/VisualRegressionMode.js.map +1 -0
  27. package/dist/cjs/src/testing/graph-tester/modes/index.js +17 -0
  28. package/dist/cjs/src/testing/graph-tester/modes/index.js.map +1 -0
  29. package/dist/cjs/src/testing/graph-tester/reporters/HTMLReporter.js +411 -0
  30. package/dist/cjs/src/testing/graph-tester/reporters/HTMLReporter.js.map +1 -0
  31. package/dist/cjs/src/testing/graph-tester/reporters/JSONReporter.js +127 -0
  32. package/dist/cjs/src/testing/graph-tester/reporters/JSONReporter.js.map +1 -0
  33. package/dist/cjs/src/testing/graph-tester/reporters/MarkdownReporter.js +169 -0
  34. package/dist/cjs/src/testing/graph-tester/reporters/MarkdownReporter.js.map +1 -0
  35. package/dist/cjs/src/testing/graph-tester/reporters/UnifiedReporter.js +118 -0
  36. package/dist/cjs/src/testing/graph-tester/reporters/UnifiedReporter.js.map +1 -0
  37. package/dist/cjs/src/testing/graph-tester/reporters/index.js +17 -0
  38. package/dist/cjs/src/testing/graph-tester/reporters/index.js.map +1 -0
  39. package/dist/cjs/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js +47 -0
  40. package/dist/cjs/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js.map +1 -0
  41. package/dist/cjs/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js +584 -0
  42. package/dist/cjs/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js.map +1 -0
  43. package/dist/cjs/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js +376 -0
  44. package/dist/cjs/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js.map +1 -0
  45. package/dist/cjs/src/testing/graph-tester/screenshot/index.js +15 -0
  46. package/dist/cjs/src/testing/graph-tester/screenshot/index.js.map +1 -0
  47. package/dist/cjs/src/testing/graph-tester/screenshot/types.js +11 -0
  48. package/dist/cjs/src/testing/graph-tester/screenshot/types.js.map +1 -0
  49. package/dist/cjs/src/testing/selectors.js +1 -1
  50. package/dist/esm/src/browser.d.ts +9 -0
  51. package/dist/esm/src/browser.d.ts.map +1 -1
  52. package/dist/esm/src/browser.js +14 -0
  53. package/dist/esm/src/browser.js.map +1 -1
  54. package/dist/esm/src/decorators/ContainerHelpers.d.ts +2 -1
  55. package/dist/esm/src/decorators/ContainerHelpers.d.ts.map +1 -1
  56. package/dist/esm/src/decorators/ContainerHelpers.js +16 -1
  57. package/dist/esm/src/decorators/ContainerHelpers.js.map +1 -1
  58. package/dist/esm/src/decorators/Tool.d.ts.map +1 -1
  59. package/dist/esm/src/decorators/Tool.js +2 -3
  60. package/dist/esm/src/decorators/Tool.js.map +1 -1
  61. package/dist/esm/src/testing/graph-tester/core/GraphTester.d.ts +110 -0
  62. package/dist/esm/src/testing/graph-tester/core/GraphTester.d.ts.map +1 -0
  63. package/dist/esm/src/testing/graph-tester/core/GraphTester.js +335 -0
  64. package/dist/esm/src/testing/graph-tester/core/GraphTester.js.map +1 -0
  65. package/dist/esm/src/testing/graph-tester/core/TestFunction.d.ts +120 -0
  66. package/dist/esm/src/testing/graph-tester/core/TestFunction.d.ts.map +1 -0
  67. package/dist/esm/src/testing/graph-tester/core/TestFunction.js +184 -0
  68. package/dist/esm/src/testing/graph-tester/core/TestFunction.js.map +1 -0
  69. package/dist/esm/src/testing/graph-tester/core/types.d.ts +331 -0
  70. package/dist/esm/src/testing/graph-tester/core/types.d.ts.map +1 -0
  71. package/dist/esm/src/testing/graph-tester/core/types.js +21 -0
  72. package/dist/esm/src/testing/graph-tester/core/types.js.map +1 -0
  73. package/dist/esm/src/testing/graph-tester/fixtures/index.d.ts +8 -0
  74. package/dist/esm/src/testing/graph-tester/fixtures/index.d.ts.map +1 -0
  75. package/dist/esm/src/testing/graph-tester/fixtures/index.js +7 -0
  76. package/dist/esm/src/testing/graph-tester/fixtures/index.js.map +1 -0
  77. package/dist/esm/src/testing/graph-tester/fixtures/portPool.d.ts +40 -0
  78. package/dist/esm/src/testing/graph-tester/fixtures/portPool.d.ts.map +1 -0
  79. package/dist/esm/src/testing/graph-tester/fixtures/portPool.js +147 -0
  80. package/dist/esm/src/testing/graph-tester/fixtures/portPool.js.map +1 -0
  81. package/dist/esm/src/testing/graph-tester/index.d.ts +84 -0
  82. package/dist/esm/src/testing/graph-tester/index.d.ts.map +1 -0
  83. package/dist/esm/src/testing/graph-tester/index.js +77 -0
  84. package/dist/esm/src/testing/graph-tester/index.js.map +1 -0
  85. package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.d.ts +40 -0
  86. package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.d.ts.map +1 -0
  87. package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.js +193 -0
  88. package/dist/esm/src/testing/graph-tester/modes/AccessibilityMode.js.map +1 -0
  89. package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.d.ts +42 -0
  90. package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.d.ts.map +1 -0
  91. package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.js +131 -0
  92. package/dist/esm/src/testing/graph-tester/modes/PerformanceMode.js.map +1 -0
  93. package/dist/esm/src/testing/graph-tester/modes/SEOMode.d.ts +39 -0
  94. package/dist/esm/src/testing/graph-tester/modes/SEOMode.d.ts.map +1 -0
  95. package/dist/esm/src/testing/graph-tester/modes/SEOMode.js +227 -0
  96. package/dist/esm/src/testing/graph-tester/modes/SEOMode.js.map +1 -0
  97. package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.d.ts +83 -0
  98. package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.d.ts.map +1 -0
  99. package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.js +162 -0
  100. package/dist/esm/src/testing/graph-tester/modes/VisualRegressionMode.js.map +1 -0
  101. package/dist/esm/src/testing/graph-tester/modes/index.d.ts +14 -0
  102. package/dist/esm/src/testing/graph-tester/modes/index.d.ts.map +1 -0
  103. package/dist/esm/src/testing/graph-tester/modes/index.js +10 -0
  104. package/dist/esm/src/testing/graph-tester/modes/index.js.map +1 -0
  105. package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.d.ts +38 -0
  106. package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.d.ts.map +1 -0
  107. package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.js +374 -0
  108. package/dist/esm/src/testing/graph-tester/reporters/HTMLReporter.js.map +1 -0
  109. package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.d.ts +50 -0
  110. package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.d.ts.map +1 -0
  111. package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.js +90 -0
  112. package/dist/esm/src/testing/graph-tester/reporters/JSONReporter.js.map +1 -0
  113. package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.d.ts +33 -0
  114. package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.d.ts.map +1 -0
  115. package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.js +132 -0
  116. package/dist/esm/src/testing/graph-tester/reporters/MarkdownReporter.js.map +1 -0
  117. package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.d.ts +30 -0
  118. package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.d.ts.map +1 -0
  119. package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.js +81 -0
  120. package/dist/esm/src/testing/graph-tester/reporters/UnifiedReporter.js.map +1 -0
  121. package/dist/esm/src/testing/graph-tester/reporters/index.d.ts +14 -0
  122. package/dist/esm/src/testing/graph-tester/reporters/index.d.ts.map +1 -0
  123. package/dist/esm/src/testing/graph-tester/reporters/index.js +10 -0
  124. package/dist/esm/src/testing/graph-tester/reporters/index.js.map +1 -0
  125. package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.d.ts +33 -0
  126. package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.d.ts.map +1 -0
  127. package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js +43 -0
  128. package/dist/esm/src/testing/graph-tester/screenshot/CanvasAnnotationRenderer.js.map +1 -0
  129. package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.d.ts +70 -0
  130. package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.d.ts.map +1 -0
  131. package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js +547 -0
  132. package/dist/esm/src/testing/graph-tester/screenshot/HTMLAnnotationRenderer.js.map +1 -0
  133. package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.d.ts +83 -0
  134. package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.d.ts.map +1 -0
  135. package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js +339 -0
  136. package/dist/esm/src/testing/graph-tester/screenshot/ScreenshotAnnotator.js.map +1 -0
  137. package/dist/esm/src/testing/graph-tester/screenshot/index.d.ts +11 -0
  138. package/dist/esm/src/testing/graph-tester/screenshot/index.d.ts.map +1 -0
  139. package/dist/esm/src/testing/graph-tester/screenshot/index.js +9 -0
  140. package/dist/esm/src/testing/graph-tester/screenshot/index.js.map +1 -0
  141. package/dist/esm/src/testing/graph-tester/screenshot/types.d.ts +331 -0
  142. package/dist/esm/src/testing/graph-tester/screenshot/types.d.ts.map +1 -0
  143. package/dist/esm/src/testing/graph-tester/screenshot/types.js +10 -0
  144. package/dist/esm/src/testing/graph-tester/screenshot/types.js.map +1 -0
  145. package/dist/esm/src/testing/selectors.d.ts +1 -1
  146. package/dist/esm/src/testing/selectors.js +1 -1
  147. package/package.json +19 -6
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ /**
3
+ * Abstract base class for all test functions.
4
+ *
5
+ * Test functions implement specific testing modes (visual regression, performance, accessibility, etc.).
6
+ * Each test function:
7
+ * 1. Receives a Playwright page and test context
8
+ * 2. Performs its testing logic
9
+ * 3. Returns a TestResult with pass/fail status and metadata
10
+ *
11
+ * @packageDocumentation
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.TestFunction = void 0;
15
+ exports.isTestFunction = isTestFunction;
16
+ /**
17
+ * Abstract base class for test functions.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * class VisualRegressionMode extends TestFunction {
22
+ * mode = 'visual';
23
+ *
24
+ * async execute(page: Page, context: TestContext): Promise<TestResult> {
25
+ * const startTime = Date.now();
26
+ * const screenshot = await page.screenshot({ fullPage: true });
27
+ *
28
+ * return {
29
+ * passed: true,
30
+ * duration: Date.now() - startTime,
31
+ * errors: [],
32
+ * metadata: {
33
+ * screenshot,
34
+ * screenshotPath: './screenshots/example.png'
35
+ * }
36
+ * };
37
+ * }
38
+ * }
39
+ * ```
40
+ */
41
+ class TestFunction {
42
+ /**
43
+ * Execute the full test lifecycle: setup, execute, teardown.
44
+ * This method handles the orchestration and error handling.
45
+ *
46
+ * @param page - Playwright page instance
47
+ * @param context - Test context
48
+ * @returns Test result
49
+ */
50
+ async run(page, context) {
51
+ const startTime = Date.now();
52
+ const errors = [];
53
+ try {
54
+ // Check if we should test this route
55
+ if (this.shouldTest && !this.shouldTest(context)) {
56
+ return {
57
+ passed: true,
58
+ duration: Date.now() - startTime,
59
+ errors: [],
60
+ metadata: {
61
+ skipped: true,
62
+ reason: 'Skipped by shouldTest() predicate',
63
+ },
64
+ mode: this.mode,
65
+ route: context.route,
66
+ };
67
+ }
68
+ // Setup
69
+ if (this.setup) {
70
+ try {
71
+ await this.setup(page);
72
+ }
73
+ catch (error) {
74
+ errors.push({
75
+ severity: 'critical',
76
+ message: `Setup failed: ${error instanceof Error ? error.message : String(error)}`,
77
+ stack: error instanceof Error ? error.stack : undefined,
78
+ });
79
+ return {
80
+ passed: false,
81
+ duration: Date.now() - startTime,
82
+ errors,
83
+ metadata: {},
84
+ mode: this.mode,
85
+ route: context.route,
86
+ };
87
+ }
88
+ }
89
+ // Execute
90
+ let result;
91
+ try {
92
+ result = await this.execute(page, context);
93
+ }
94
+ catch (error) {
95
+ errors.push({
96
+ severity: 'critical',
97
+ message: `Execution failed: ${error instanceof Error ? error.message : String(error)}`,
98
+ stack: error instanceof Error ? error.stack : undefined,
99
+ });
100
+ result = {
101
+ passed: false,
102
+ duration: Date.now() - startTime,
103
+ errors,
104
+ metadata: {},
105
+ };
106
+ }
107
+ // Teardown
108
+ if (this.teardown) {
109
+ try {
110
+ await this.teardown(page);
111
+ }
112
+ catch (error) {
113
+ errors.push({
114
+ severity: 'warning',
115
+ message: `Teardown failed: ${error instanceof Error ? error.message : String(error)}`,
116
+ stack: error instanceof Error ? error.stack : undefined,
117
+ });
118
+ }
119
+ }
120
+ // Merge errors and add metadata
121
+ return {
122
+ ...result,
123
+ errors: [...errors, ...result.errors],
124
+ mode: this.mode,
125
+ route: context.route,
126
+ };
127
+ }
128
+ catch (error) {
129
+ // Catch-all for unexpected errors
130
+ return {
131
+ passed: false,
132
+ duration: Date.now() - startTime,
133
+ errors: [
134
+ ...errors,
135
+ {
136
+ severity: 'critical',
137
+ message: `Unexpected error: ${error instanceof Error ? error.message : String(error)}`,
138
+ stack: error instanceof Error ? error.stack : undefined,
139
+ },
140
+ ],
141
+ metadata: {},
142
+ mode: this.mode,
143
+ route: context.route,
144
+ };
145
+ }
146
+ }
147
+ /**
148
+ * Validate test function configuration.
149
+ * Override to add custom validation logic.
150
+ *
151
+ * @returns Array of validation errors (empty if valid)
152
+ */
153
+ validate() {
154
+ const errors = [];
155
+ if (!this.mode) {
156
+ errors.push('mode is required');
157
+ }
158
+ if (!this.name) {
159
+ errors.push('name is required');
160
+ }
161
+ if (!this.description) {
162
+ errors.push('description is required');
163
+ }
164
+ return errors;
165
+ }
166
+ /**
167
+ * Get test function info for reporting.
168
+ */
169
+ getInfo() {
170
+ return {
171
+ mode: this.mode,
172
+ name: this.name,
173
+ description: this.description,
174
+ };
175
+ }
176
+ }
177
+ exports.TestFunction = TestFunction;
178
+ /**
179
+ * Type guard to check if an object is a TestFunction.
180
+ */
181
+ function isTestFunction(obj) {
182
+ return (obj &&
183
+ typeof obj === 'object' &&
184
+ typeof obj.mode === 'string' &&
185
+ typeof obj.name === 'string' &&
186
+ typeof obj.description === 'string' &&
187
+ typeof obj.execute === 'function');
188
+ }
189
+ //# sourceMappingURL=TestFunction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestFunction.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/core/TestFunction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /**
3
+ * Core types for the graph-based testing framework.
4
+ *
5
+ * This file is the contract between all packages - changes require consensus.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.ViewportPresets = void 0;
11
+ /**
12
+ * Predefined viewport presets.
13
+ */
14
+ exports.ViewportPresets = {
15
+ Desktop: { name: 'desktop', width: 1920, height: 1080 },
16
+ DesktopSmall: { name: 'desktop-small', width: 1366, height: 768 },
17
+ Laptop: { name: 'laptop', width: 1280, height: 720 },
18
+ TabletLandscape: { name: 'tablet-landscape', width: 1024, height: 768, isMobile: true, hasTouch: true },
19
+ TabletPortrait: { name: 'tablet-portrait', width: 768, height: 1024, isMobile: true, hasTouch: true },
20
+ MobileLarge: { name: 'mobile-large', width: 414, height: 896, isMobile: true, hasTouch: true },
21
+ Mobile: { name: 'mobile', width: 375, height: 812, isMobile: true, hasTouch: true },
22
+ MobileSmall: { name: 'mobile-small', width: 320, height: 568, isMobile: true, hasTouch: true },
23
+ };
24
+ //# 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;AACU,QAAA,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,13 @@
1
+ "use strict";
2
+ /**
3
+ * Fixtures exports.
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.cleanupPortPool = exports.expect = exports.test = void 0;
9
+ var portPool_1 = require("./portPool");
10
+ Object.defineProperty(exports, "test", { enumerable: true, get: function () { return portPool_1.test; } });
11
+ Object.defineProperty(exports, "expect", { enumerable: true, get: function () { return portPool_1.expect; } });
12
+ Object.defineProperty(exports, "cleanupPortPool", { enumerable: true, get: function () { return portPool_1.cleanupPortPool; } });
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/fixtures/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,uCAA2D;AAAlD,gGAAA,IAAI,OAAA;AAAE,kGAAA,MAAM,OAAA;AAAE,2GAAA,eAAe,OAAA"}
@@ -0,0 +1,184 @@
1
+ "use strict";
2
+ /**
3
+ * Port pool fixture for parallel testing.
4
+ *
5
+ * Automatically assigns unique ports to each test worker to avoid conflicts.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.expect = exports.test = void 0;
44
+ exports.cleanupPortPool = cleanupPortPool;
45
+ const test_1 = require("@playwright/test");
46
+ const fs = __importStar(require("fs"));
47
+ const path = __importStar(require("path"));
48
+ const os = __importStar(require("os"));
49
+ /**
50
+ * Port pool manager (singleton across workers).
51
+ */
52
+ class PortPoolManager {
53
+ constructor(startPort = 3020, poolSize = 10) {
54
+ this.availablePorts = [];
55
+ this.usedPorts = new Set();
56
+ this.lockFile = path.join(os.tmpdir(), 'supernal-port-pool.lock');
57
+ this.lockFd = null;
58
+ // Initialize pool: 3020-3029 by default
59
+ for (let i = 0; i < poolSize; i++) {
60
+ this.availablePorts.push(startPort + i);
61
+ }
62
+ }
63
+ /**
64
+ * Acquire a port from the pool (with cross-worker coordination).
65
+ */
66
+ async acquirePort() {
67
+ await this.acquireLock();
68
+ try {
69
+ if (this.availablePorts.length === 0) {
70
+ throw new Error('No available ports in pool. Increase pool size or reduce parallel workers.');
71
+ }
72
+ const port = this.availablePorts.shift();
73
+ this.usedPorts.add(port);
74
+ return port;
75
+ }
76
+ finally {
77
+ await this.releaseLock();
78
+ }
79
+ }
80
+ /**
81
+ * Release a port back to the pool.
82
+ */
83
+ async releasePort(port) {
84
+ await this.acquireLock();
85
+ try {
86
+ if (this.usedPorts.has(port)) {
87
+ this.usedPorts.delete(port);
88
+ this.availablePorts.push(port);
89
+ }
90
+ }
91
+ finally {
92
+ await this.releaseLock();
93
+ }
94
+ }
95
+ /**
96
+ * Acquire file-based lock for cross-worker coordination.
97
+ */
98
+ async acquireLock() {
99
+ const maxRetries = 100;
100
+ const retryDelay = 50; // ms
101
+ for (let i = 0; i < maxRetries; i++) {
102
+ try {
103
+ // Try to create lock file with exclusive flag
104
+ this.lockFd = fs.openSync(this.lockFile, fs.constants.O_CREAT | fs.constants.O_EXCL | fs.constants.O_RDWR);
105
+ return; // Lock acquired
106
+ }
107
+ catch (error) {
108
+ if (error.code === 'EEXIST') {
109
+ // Lock file exists, wait and retry
110
+ await new Promise((resolve) => setTimeout(resolve, retryDelay));
111
+ }
112
+ else {
113
+ throw error;
114
+ }
115
+ }
116
+ }
117
+ throw new Error('Failed to acquire port pool lock after retries');
118
+ }
119
+ /**
120
+ * Release file-based lock.
121
+ */
122
+ async releaseLock() {
123
+ if (this.lockFd !== null) {
124
+ try {
125
+ fs.closeSync(this.lockFd);
126
+ fs.unlinkSync(this.lockFile);
127
+ }
128
+ catch (error) {
129
+ // Ignore errors (file might already be deleted)
130
+ }
131
+ this.lockFd = null;
132
+ }
133
+ }
134
+ /**
135
+ * Cleanup all resources.
136
+ */
137
+ async cleanup() {
138
+ try {
139
+ if (fs.existsSync(this.lockFile)) {
140
+ fs.unlinkSync(this.lockFile);
141
+ }
142
+ }
143
+ catch {
144
+ // Ignore
145
+ }
146
+ }
147
+ }
148
+ // Global port pool instance
149
+ const portPool = new PortPoolManager();
150
+ /**
151
+ * Playwright test fixture with automatic port assignment.
152
+ *
153
+ * @example
154
+ * ```typescript
155
+ * import { test, expect } from '@supernal/interface/testing/graph-tester/fixtures';
156
+ *
157
+ * test('visual regression', async ({ page, port, baseURL }) => {
158
+ * console.log(`Test running on port ${port}`);
159
+ * await page.goto(baseURL);
160
+ * // Test automatically gets unique port!
161
+ * });
162
+ * ```
163
+ */
164
+ exports.test = test_1.test.extend({
165
+ port: async ({}, use) => {
166
+ const port = await portPool.acquirePort();
167
+ await use(port);
168
+ await portPool.releasePort(port);
169
+ },
170
+ baseURL: async ({ port }, use) => {
171
+ await use(`http://localhost:${port}`);
172
+ },
173
+ });
174
+ /**
175
+ * Re-export expect from Playwright.
176
+ */
177
+ exports.expect = test_1.expect;
178
+ /**
179
+ * Cleanup port pool (call at end of test suite).
180
+ */
181
+ async function cleanupPortPool() {
182
+ await portPool.cleanup();
183
+ }
184
+ //# sourceMappingURL=portPool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portPool.js","sourceRoot":"","sources":["../../../../../../src/testing/graph-tester/fixtures/portPool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ /**
3
+ * Graph-Based Testing Framework
4
+ *
5
+ * A comprehensive testing framework that systematically applies different testing functions
6
+ * (visual regression, performance, accessibility, SEO) to all routes in your application.
7
+ *
8
+ * ## Features
9
+ *
10
+ * - **Screenshot Annotation**: Capture screenshots with element bounding boxes, testids, and interaction capabilities
11
+ * - **Multiple Test Modes**: Visual regression, performance, accessibility, SEO
12
+ * - **AI-Ready Output**: JSON + PNG format optimized for multimodal AI analysis
13
+ * - **Multi-Format Reporting**: HTML (interactive), JSON (CI/CD), Markdown (docs)
14
+ * - **Parallel Testing**: Port pool fixture for running tests in parallel
15
+ * - **Pluggable Architecture**: Create custom test modes by extending TestFunction
16
+ *
17
+ * ## Usage
18
+ *
19
+ * ```typescript
20
+ * import { GraphTester, VisualRegressionMode, JSONReporter } from '@supernal/interface/testing/graph-tester';
21
+ *
22
+ * const tester = new GraphTester({
23
+ * baseUrl: 'http://localhost:3000',
24
+ * routes: [
25
+ * { route: '/', metadata: { name: 'Home' } },
26
+ * { route: '/dashboard', metadata: { name: 'Dashboard' } }
27
+ * ],
28
+ * modes: ['visual'],
29
+ * output: {
30
+ * dir: './test-results',
31
+ * formats: ['json', 'html']
32
+ * }
33
+ * });
34
+ *
35
+ * // Register test modes
36
+ * tester.registerTestFunction(new VisualRegressionMode({
37
+ * outputDir: './screenshots',
38
+ * annotate: true,
39
+ * generateHTML: true
40
+ * }));
41
+ *
42
+ * // Run tests
43
+ * const results = await tester.runTests();
44
+ * console.log(`Pass rate: ${results.passRate}%`);
45
+ *
46
+ * // Generate reports
47
+ * const reporter = new JSONReporter({ outputDir: './test-results' });
48
+ * await reporter.generate(results);
49
+ * ```
50
+ *
51
+ * ## Enterprise Features
52
+ *
53
+ * For automatic route discovery via NavigationGraph, CLI commands, and AI analysis,
54
+ * see `@supernalintelligence/interface-enterprise/testing/graph-tester`.
55
+ *
56
+ * @packageDocumentation
57
+ */
58
+ Object.defineProperty(exports, "__esModule", { value: true });
59
+ exports.cleanupPortPool = exports.expect = exports.testWithPortPool = exports.MarkdownReporter = exports.HTMLReporter = exports.JSONReporter = exports.UnifiedReporter = exports.SEOMode = exports.AccessibilityMode = exports.PerformanceMode = exports.VisualRegressionMode = exports.CanvasAnnotationRenderer = exports.HTMLAnnotationRenderer = exports.ScreenshotAnnotator = exports.ViewportPresets = exports.GraphTester = exports.isTestFunction = exports.TestFunction = void 0;
60
+ // ==================== Core ====================
61
+ var TestFunction_1 = require("./core/TestFunction");
62
+ Object.defineProperty(exports, "TestFunction", { enumerable: true, get: function () { return TestFunction_1.TestFunction; } });
63
+ Object.defineProperty(exports, "isTestFunction", { enumerable: true, get: function () { return TestFunction_1.isTestFunction; } });
64
+ var GraphTester_1 = require("./core/GraphTester");
65
+ Object.defineProperty(exports, "GraphTester", { enumerable: true, get: function () { return GraphTester_1.GraphTester; } });
66
+ var types_1 = require("./core/types");
67
+ Object.defineProperty(exports, "ViewportPresets", { enumerable: true, get: function () { return types_1.ViewportPresets; } });
68
+ // ==================== Screenshot Annotation ====================
69
+ var ScreenshotAnnotator_1 = require("./screenshot/ScreenshotAnnotator");
70
+ Object.defineProperty(exports, "ScreenshotAnnotator", { enumerable: true, get: function () { return ScreenshotAnnotator_1.ScreenshotAnnotator; } });
71
+ var HTMLAnnotationRenderer_1 = require("./screenshot/HTMLAnnotationRenderer");
72
+ Object.defineProperty(exports, "HTMLAnnotationRenderer", { enumerable: true, get: function () { return HTMLAnnotationRenderer_1.HTMLAnnotationRenderer; } });
73
+ var CanvasAnnotationRenderer_1 = require("./screenshot/CanvasAnnotationRenderer");
74
+ Object.defineProperty(exports, "CanvasAnnotationRenderer", { enumerable: true, get: function () { return CanvasAnnotationRenderer_1.CanvasAnnotationRenderer; } });
75
+ // ==================== Test Modes ====================
76
+ var VisualRegressionMode_1 = require("./modes/VisualRegressionMode");
77
+ Object.defineProperty(exports, "VisualRegressionMode", { enumerable: true, get: function () { return VisualRegressionMode_1.VisualRegressionMode; } });
78
+ var PerformanceMode_1 = require("./modes/PerformanceMode");
79
+ Object.defineProperty(exports, "PerformanceMode", { enumerable: true, get: function () { return PerformanceMode_1.PerformanceMode; } });
80
+ var AccessibilityMode_1 = require("./modes/AccessibilityMode");
81
+ Object.defineProperty(exports, "AccessibilityMode", { enumerable: true, get: function () { return AccessibilityMode_1.AccessibilityMode; } });
82
+ var SEOMode_1 = require("./modes/SEOMode");
83
+ Object.defineProperty(exports, "SEOMode", { enumerable: true, get: function () { return SEOMode_1.SEOMode; } });
84
+ // ==================== Reporters ====================
85
+ var UnifiedReporter_1 = require("./reporters/UnifiedReporter");
86
+ Object.defineProperty(exports, "UnifiedReporter", { enumerable: true, get: function () { return UnifiedReporter_1.UnifiedReporter; } });
87
+ var JSONReporter_1 = require("./reporters/JSONReporter");
88
+ Object.defineProperty(exports, "JSONReporter", { enumerable: true, get: function () { return JSONReporter_1.JSONReporter; } });
89
+ var HTMLReporter_1 = require("./reporters/HTMLReporter");
90
+ Object.defineProperty(exports, "HTMLReporter", { enumerable: true, get: function () { return HTMLReporter_1.HTMLReporter; } });
91
+ var MarkdownReporter_1 = require("./reporters/MarkdownReporter");
92
+ Object.defineProperty(exports, "MarkdownReporter", { enumerable: true, get: function () { return MarkdownReporter_1.MarkdownReporter; } });
93
+ // ==================== Fixtures ====================
94
+ var portPool_1 = require("./fixtures/portPool");
95
+ Object.defineProperty(exports, "testWithPortPool", { enumerable: true, get: function () { return portPool_1.test; } });
96
+ Object.defineProperty(exports, "expect", { enumerable: true, get: function () { return portPool_1.expect; } });
97
+ Object.defineProperty(exports, "cleanupPortPool", { enumerable: true, get: function () { return portPool_1.cleanupPortPool; } });
98
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/testing/graph-tester/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;;;AAEH,iDAAiD;AAEjD,oDAAmE;AAA1D,4GAAA,YAAY,OAAA;AAAE,8GAAA,cAAc,OAAA;AACrC,kDAAiD;AAAxC,0GAAA,WAAW,OAAA;AAEpB,sCAA+C;AAAtC,wGAAA,eAAe,OAAA;AAExB,kEAAkE;AAElE,wEAAuE;AAA9D,0HAAA,mBAAmB,OAAA;AAG5B,8EAA6E;AAApE,gIAAA,sBAAsB,OAAA;AAC/B,kFAAiF;AAAxE,oIAAA,wBAAwB,OAAA;AAIjC,uDAAuD;AAEvD,qEAAoE;AAA3D,4HAAA,oBAAoB,OAAA;AAG7B,2DAA0D;AAAjD,kHAAA,eAAe,OAAA;AAGxB,+DAA8D;AAArD,sHAAA,iBAAiB,OAAA;AAG1B,2CAA0C;AAAjC,kGAAA,OAAO,OAAA;AAGhB,sDAAsD;AAEtD,+DAA8D;AAArD,kHAAA,eAAe,OAAA;AAGxB,yDAAwD;AAA/C,4GAAA,YAAY,OAAA;AAGrB,yDAAwD;AAA/C,4GAAA,YAAY,OAAA;AAGrB,iEAAgE;AAAvD,oHAAA,gBAAgB,OAAA;AAGzB,qDAAqD;AAErD,gDAAwF;AAA/E,4GAAA,IAAI,OAAoB;AAAE,kGAAA,MAAM,OAAA;AAAE,2GAAA,eAAe,OAAA"}