test-genie-mcp 2.0.0

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 (102) hide show
  1. package/README.md +219 -0
  2. package/dist/analyzers/astAnalyzer.d.ts +108 -0
  3. package/dist/analyzers/astAnalyzer.d.ts.map +1 -0
  4. package/dist/analyzers/astAnalyzer.js +800 -0
  5. package/dist/analyzers/astAnalyzer.js.map +1 -0
  6. package/dist/analyzers/performanceAnalyzer.d.ts +90 -0
  7. package/dist/analyzers/performanceAnalyzer.d.ts.map +1 -0
  8. package/dist/analyzers/performanceAnalyzer.js +647 -0
  9. package/dist/analyzers/performanceAnalyzer.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +683 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/platforms/android/index.d.ts +90 -0
  15. package/dist/platforms/android/index.d.ts.map +1 -0
  16. package/dist/platforms/android/index.js +519 -0
  17. package/dist/platforms/android/index.js.map +1 -0
  18. package/dist/platforms/flutter/index.d.ts +105 -0
  19. package/dist/platforms/flutter/index.d.ts.map +1 -0
  20. package/dist/platforms/flutter/index.js +533 -0
  21. package/dist/platforms/flutter/index.js.map +1 -0
  22. package/dist/platforms/ios/index.d.ts +79 -0
  23. package/dist/platforms/ios/index.d.ts.map +1 -0
  24. package/dist/platforms/ios/index.js +393 -0
  25. package/dist/platforms/ios/index.js.map +1 -0
  26. package/dist/platforms/react-native/index.d.ts +160 -0
  27. package/dist/platforms/react-native/index.d.ts.map +1 -0
  28. package/dist/platforms/react-native/index.js +602 -0
  29. package/dist/platforms/react-native/index.js.map +1 -0
  30. package/dist/platforms/web/index.d.ts +177 -0
  31. package/dist/platforms/web/index.d.ts.map +1 -0
  32. package/dist/platforms/web/index.js +637 -0
  33. package/dist/platforms/web/index.js.map +1 -0
  34. package/dist/storage/index.d.ts +35 -0
  35. package/dist/storage/index.d.ts.map +1 -0
  36. package/dist/storage/index.js +351 -0
  37. package/dist/storage/index.js.map +1 -0
  38. package/dist/tools/analysis/analyzeAppStructure.d.ts +9 -0
  39. package/dist/tools/analysis/analyzeAppStructure.d.ts.map +1 -0
  40. package/dist/tools/analysis/analyzeAppStructure.js +289 -0
  41. package/dist/tools/analysis/analyzeAppStructure.js.map +1 -0
  42. package/dist/tools/analysis/createTestPlan.d.ts +21 -0
  43. package/dist/tools/analysis/createTestPlan.d.ts.map +1 -0
  44. package/dist/tools/analysis/createTestPlan.js +214 -0
  45. package/dist/tools/analysis/createTestPlan.js.map +1 -0
  46. package/dist/tools/analysis/generateScenarios.d.ts +21 -0
  47. package/dist/tools/analysis/generateScenarios.d.ts.map +1 -0
  48. package/dist/tools/analysis/generateScenarios.js +567 -0
  49. package/dist/tools/analysis/generateScenarios.js.map +1 -0
  50. package/dist/tools/automation/cicdIntegration.d.ts +41 -0
  51. package/dist/tools/automation/cicdIntegration.d.ts.map +1 -0
  52. package/dist/tools/automation/cicdIntegration.js +825 -0
  53. package/dist/tools/automation/cicdIntegration.js.map +1 -0
  54. package/dist/tools/automation/generateReport.d.ts +16 -0
  55. package/dist/tools/automation/generateReport.d.ts.map +1 -0
  56. package/dist/tools/automation/generateReport.js +406 -0
  57. package/dist/tools/automation/generateReport.js.map +1 -0
  58. package/dist/tools/automation/runFullAutomation.d.ts +25 -0
  59. package/dist/tools/automation/runFullAutomation.d.ts.map +1 -0
  60. package/dist/tools/automation/runFullAutomation.js +296 -0
  61. package/dist/tools/automation/runFullAutomation.js.map +1 -0
  62. package/dist/tools/detection/detectLogicErrors.d.ts +18 -0
  63. package/dist/tools/detection/detectLogicErrors.d.ts.map +1 -0
  64. package/dist/tools/detection/detectLogicErrors.js +470 -0
  65. package/dist/tools/detection/detectLogicErrors.js.map +1 -0
  66. package/dist/tools/detection/detectMemoryLeaks.d.ts +23 -0
  67. package/dist/tools/detection/detectMemoryLeaks.d.ts.map +1 -0
  68. package/dist/tools/detection/detectMemoryLeaks.js +453 -0
  69. package/dist/tools/detection/detectMemoryLeaks.js.map +1 -0
  70. package/dist/tools/execution/runScenarioTest.d.ts +34 -0
  71. package/dist/tools/execution/runScenarioTest.d.ts.map +1 -0
  72. package/dist/tools/execution/runScenarioTest.js +334 -0
  73. package/dist/tools/execution/runScenarioTest.js.map +1 -0
  74. package/dist/tools/execution/runSimulation.d.ts +17 -0
  75. package/dist/tools/execution/runSimulation.d.ts.map +1 -0
  76. package/dist/tools/execution/runSimulation.js +250 -0
  77. package/dist/tools/execution/runSimulation.js.map +1 -0
  78. package/dist/tools/execution/runStressTest.d.ts +52 -0
  79. package/dist/tools/execution/runStressTest.d.ts.map +1 -0
  80. package/dist/tools/execution/runStressTest.js +176 -0
  81. package/dist/tools/execution/runStressTest.js.map +1 -0
  82. package/dist/tools/fixing/applyFix.d.ts +44 -0
  83. package/dist/tools/fixing/applyFix.d.ts.map +1 -0
  84. package/dist/tools/fixing/applyFix.js +399 -0
  85. package/dist/tools/fixing/applyFix.js.map +1 -0
  86. package/dist/tools/fixing/confirmFix.d.ts +31 -0
  87. package/dist/tools/fixing/confirmFix.d.ts.map +1 -0
  88. package/dist/tools/fixing/confirmFix.js +136 -0
  89. package/dist/tools/fixing/confirmFix.js.map +1 -0
  90. package/dist/tools/fixing/suggestFixes.d.ts +23 -0
  91. package/dist/tools/fixing/suggestFixes.d.ts.map +1 -0
  92. package/dist/tools/fixing/suggestFixes.js +349 -0
  93. package/dist/tools/fixing/suggestFixes.js.map +1 -0
  94. package/dist/types.d.ts +322 -0
  95. package/dist/types.d.ts.map +1 -0
  96. package/dist/types.js +6 -0
  97. package/dist/types.js.map +1 -0
  98. package/dist/utils/codeParser.d.ts +12 -0
  99. package/dist/utils/codeParser.d.ts.map +1 -0
  100. package/dist/utils/codeParser.js +487 -0
  101. package/dist/utils/codeParser.js.map +1 -0
  102. package/package.json +68 -0
@@ -0,0 +1,637 @@
1
+ "use strict";
2
+ // ============================================
3
+ // Web Test Platform Integration
4
+ // Playwright, Puppeteer, Cypress
5
+ // ============================================
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.listBrowsers = listBrowsers;
41
+ exports.installBrowsers = installBrowsers;
42
+ exports.runPlaywrightTests = runPlaywrightTests;
43
+ exports.runVisualTests = runVisualTests;
44
+ exports.runCypressTests = runCypressTests;
45
+ exports.runLighthouse = runLighthouse;
46
+ exports.runAccessibilityTests = runAccessibilityTests;
47
+ exports.runAPITests = runAPITests;
48
+ exports.runLoadTest = runLoadTest;
49
+ const child_process_1 = require("child_process");
50
+ const util_1 = require("util");
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
54
+ // ============================================
55
+ // Browser Management
56
+ // ============================================
57
+ async function listBrowsers() {
58
+ const browsers = [];
59
+ try {
60
+ // Check Playwright browsers
61
+ const { stdout } = await execAsync('npx playwright --version');
62
+ if (stdout) {
63
+ browsers.push({ name: 'chromium', version: 'latest', executablePath: '' }, { name: 'firefox', version: 'latest', executablePath: '' }, { name: 'webkit', version: 'latest', executablePath: '' });
64
+ }
65
+ }
66
+ catch {
67
+ // Playwright not available
68
+ }
69
+ return browsers;
70
+ }
71
+ async function installBrowsers() {
72
+ try {
73
+ await execAsync('npx playwright install', { timeout: 300000 });
74
+ return true;
75
+ }
76
+ catch {
77
+ return false;
78
+ }
79
+ }
80
+ // ============================================
81
+ // Playwright Tests
82
+ // ============================================
83
+ async function runPlaywrightTests(config) {
84
+ const { projectPath, testPath, browser = 'chromium', headless = true, workers = 1, reporter = 'json', timeout = 600000, } = config;
85
+ const outputDir = path.join(projectPath, '.test-genie', 'playwright', Date.now().toString());
86
+ const jsonReportPath = path.join(outputDir, 'results.json');
87
+ if (!fs.existsSync(outputDir)) {
88
+ fs.mkdirSync(outputDir, { recursive: true });
89
+ }
90
+ const args = [
91
+ `--project=${browser}`,
92
+ `--workers=${workers}`,
93
+ `--reporter=json`,
94
+ `--output=${outputDir}`,
95
+ ];
96
+ if (headless)
97
+ args.push('--headed=false');
98
+ if (testPath)
99
+ args.push(testPath);
100
+ const command = `cd "${projectPath}" && PLAYWRIGHT_JSON_OUTPUT_NAME="${jsonReportPath}" npx playwright test ${args.join(' ')} 2>&1`;
101
+ try {
102
+ const { stdout } = await execAsync(command, { timeout, maxBuffer: 50 * 1024 * 1024 });
103
+ const results = parsePlaywrightResults(jsonReportPath);
104
+ const artifacts = collectPlaywrightArtifacts(outputDir);
105
+ return {
106
+ success: results.failed === 0,
107
+ output: stdout,
108
+ results,
109
+ artifacts,
110
+ };
111
+ }
112
+ catch (error) {
113
+ const results = parsePlaywrightResults(jsonReportPath);
114
+ const artifacts = collectPlaywrightArtifacts(outputDir);
115
+ return {
116
+ success: false,
117
+ output: error.stdout || error.message,
118
+ results,
119
+ artifacts,
120
+ };
121
+ }
122
+ }
123
+ function parsePlaywrightResults(jsonPath) {
124
+ const defaultResult = {
125
+ total: 0,
126
+ passed: 0,
127
+ failed: 0,
128
+ skipped: 0,
129
+ flaky: 0,
130
+ duration: 0,
131
+ tests: [],
132
+ };
133
+ if (!fs.existsSync(jsonPath)) {
134
+ return defaultResult;
135
+ }
136
+ try {
137
+ const report = JSON.parse(fs.readFileSync(jsonPath, 'utf-8'));
138
+ const tests = [];
139
+ for (const suite of report.suites || []) {
140
+ for (const spec of suite.specs || []) {
141
+ for (const test of spec.tests || []) {
142
+ const result = test.results?.[0];
143
+ tests.push({
144
+ title: spec.title,
145
+ file: suite.file,
146
+ status: result?.status || 'skipped',
147
+ duration: result?.duration || 0,
148
+ error: result?.error?.message,
149
+ retry: result?.retry,
150
+ });
151
+ }
152
+ }
153
+ }
154
+ return {
155
+ total: tests.length,
156
+ passed: tests.filter(t => t.status === 'passed').length,
157
+ failed: tests.filter(t => t.status === 'failed').length,
158
+ skipped: tests.filter(t => t.status === 'skipped').length,
159
+ flaky: tests.filter(t => (t.retry || 0) > 0 && t.status === 'passed').length,
160
+ duration: report.stats?.duration || 0,
161
+ tests,
162
+ };
163
+ }
164
+ catch {
165
+ return defaultResult;
166
+ }
167
+ }
168
+ function collectPlaywrightArtifacts(outputDir) {
169
+ const artifacts = {
170
+ screenshots: [],
171
+ videos: [],
172
+ traces: [],
173
+ };
174
+ if (!fs.existsSync(outputDir)) {
175
+ return artifacts;
176
+ }
177
+ function walk(dir) {
178
+ try {
179
+ const items = fs.readdirSync(dir);
180
+ for (const item of items) {
181
+ const fullPath = path.join(dir, item);
182
+ const stat = fs.statSync(fullPath);
183
+ if (stat.isDirectory()) {
184
+ walk(fullPath);
185
+ }
186
+ else {
187
+ if (item.endsWith('.png') || item.endsWith('.jpg')) {
188
+ artifacts.screenshots.push(fullPath);
189
+ }
190
+ else if (item.endsWith('.webm') || item.endsWith('.mp4')) {
191
+ artifacts.videos.push(fullPath);
192
+ }
193
+ else if (item.endsWith('.zip') && item.includes('trace')) {
194
+ artifacts.traces.push(fullPath);
195
+ }
196
+ }
197
+ }
198
+ }
199
+ catch {
200
+ // Ignore errors
201
+ }
202
+ }
203
+ walk(outputDir);
204
+ return artifacts;
205
+ }
206
+ // ============================================
207
+ // Playwright Visual Comparison
208
+ // ============================================
209
+ async function runVisualTests(config) {
210
+ const { projectPath, testPath, updateSnapshots = false, threshold = 0.1, timeout = 300000, } = config;
211
+ const args = ['--grep', '@visual'];
212
+ if (testPath)
213
+ args.push(testPath);
214
+ if (updateSnapshots)
215
+ args.push('--update-snapshots');
216
+ const command = `cd "${projectPath}" && npx playwright test ${args.join(' ')} 2>&1`;
217
+ try {
218
+ const { stdout } = await execAsync(command, { timeout, maxBuffer: 50 * 1024 * 1024 });
219
+ const comparisons = parseVisualTestResults(stdout, projectPath);
220
+ return {
221
+ success: comparisons.every(c => c.matched),
222
+ output: stdout,
223
+ comparisons,
224
+ };
225
+ }
226
+ catch (error) {
227
+ return {
228
+ success: false,
229
+ output: error.stdout || error.message,
230
+ comparisons: parseVisualTestResults(error.stdout || '', projectPath),
231
+ };
232
+ }
233
+ }
234
+ function parseVisualTestResults(output, projectPath) {
235
+ const comparisons = [];
236
+ // Parse snapshot comparison results
237
+ const mismatchRegex = /Screenshot\s+"([^"]+)"\s+doesn't match.*?(\d+)\s+pixels/g;
238
+ let match;
239
+ while ((match = mismatchRegex.exec(output)) !== null) {
240
+ comparisons.push({
241
+ name: match[1] || '',
242
+ matched: false,
243
+ diffPixels: parseInt(match[2] || '0'),
244
+ });
245
+ }
246
+ // Parse passed comparisons
247
+ const passedRegex = /Screenshot\s+"([^"]+)"\s+matched/g;
248
+ while ((match = passedRegex.exec(output)) !== null) {
249
+ comparisons.push({
250
+ name: match[1] || '',
251
+ matched: true,
252
+ });
253
+ }
254
+ return comparisons;
255
+ }
256
+ // ============================================
257
+ // Cypress Tests
258
+ // ============================================
259
+ async function runCypressTests(config) {
260
+ const { projectPath, testPath, browser = 'chromium', headless = true, timeout = 600000, } = config;
261
+ const browserMap = {
262
+ chromium: 'chrome',
263
+ firefox: 'firefox',
264
+ webkit: 'edge', // Cypress doesn't support webkit
265
+ };
266
+ const args = [
267
+ 'run',
268
+ `--browser=${browserMap[browser] || 'chrome'}`,
269
+ '--reporter=json',
270
+ ];
271
+ if (testPath)
272
+ args.push(`--spec=${testPath}`);
273
+ if (headless)
274
+ args.push('--headless');
275
+ const command = `cd "${projectPath}" && npx cypress ${args.join(' ')} 2>&1`;
276
+ try {
277
+ const { stdout } = await execAsync(command, { timeout, maxBuffer: 50 * 1024 * 1024 });
278
+ const results = parseCypressOutput(stdout);
279
+ const { videos, screenshots } = collectCypressArtifacts(projectPath);
280
+ return {
281
+ success: results.failed === 0,
282
+ output: stdout,
283
+ results,
284
+ videos,
285
+ screenshots,
286
+ };
287
+ }
288
+ catch (error) {
289
+ const results = parseCypressOutput(error.stdout || '');
290
+ const { videos, screenshots } = collectCypressArtifacts(projectPath);
291
+ return {
292
+ success: false,
293
+ output: error.stdout || error.message,
294
+ results,
295
+ videos,
296
+ screenshots,
297
+ };
298
+ }
299
+ }
300
+ function parseCypressOutput(output) {
301
+ const tests = [];
302
+ // Parse test results
303
+ const passedRegex = /✓\s+(.+?)\s+\((\d+)ms\)/g;
304
+ const failedRegex = /✖\s+(.+)/g;
305
+ const pendingRegex = /-\s+(.+)/g;
306
+ let match;
307
+ while ((match = passedRegex.exec(output)) !== null) {
308
+ tests.push({
309
+ title: match[1] || '',
310
+ state: 'passed',
311
+ duration: parseInt(match[2] || '0'),
312
+ });
313
+ }
314
+ while ((match = failedRegex.exec(output)) !== null) {
315
+ tests.push({
316
+ title: match[1] || '',
317
+ state: 'failed',
318
+ duration: 0,
319
+ });
320
+ }
321
+ while ((match = pendingRegex.exec(output)) !== null) {
322
+ tests.push({
323
+ title: match[1] || '',
324
+ state: 'pending',
325
+ duration: 0,
326
+ });
327
+ }
328
+ // Parse summary
329
+ const summaryMatch = output.match(/(\d+)\s+passing.*?(\d+)\s+failing.*?(\d+)\s+pending/);
330
+ return {
331
+ total: tests.length,
332
+ passed: tests.filter(t => t.state === 'passed').length,
333
+ failed: tests.filter(t => t.state === 'failed').length,
334
+ pending: tests.filter(t => t.state === 'pending').length,
335
+ duration: 0,
336
+ tests,
337
+ };
338
+ }
339
+ function collectCypressArtifacts(projectPath) {
340
+ const artifacts = {
341
+ videos: [],
342
+ screenshots: [],
343
+ };
344
+ const videosDir = path.join(projectPath, 'cypress', 'videos');
345
+ const screenshotsDir = path.join(projectPath, 'cypress', 'screenshots');
346
+ if (fs.existsSync(videosDir)) {
347
+ artifacts.videos = fs.readdirSync(videosDir)
348
+ .filter(f => f.endsWith('.mp4'))
349
+ .map(f => path.join(videosDir, f));
350
+ }
351
+ if (fs.existsSync(screenshotsDir)) {
352
+ function walk(dir) {
353
+ const items = fs.readdirSync(dir);
354
+ for (const item of items) {
355
+ const fullPath = path.join(dir, item);
356
+ const stat = fs.statSync(fullPath);
357
+ if (stat.isDirectory()) {
358
+ walk(fullPath);
359
+ }
360
+ else if (item.endsWith('.png')) {
361
+ artifacts.screenshots.push(fullPath);
362
+ }
363
+ }
364
+ }
365
+ walk(screenshotsDir);
366
+ }
367
+ return artifacts;
368
+ }
369
+ async function runLighthouse(config) {
370
+ const { url, projectPath, categories = ['performance', 'accessibility', 'best-practices', 'seo'], device = 'mobile', throttling = true, } = config;
371
+ const outputDir = path.join(projectPath, '.test-genie', 'lighthouse');
372
+ const reportPath = path.join(outputDir, `report_${Date.now()}.json`);
373
+ if (!fs.existsSync(outputDir)) {
374
+ fs.mkdirSync(outputDir, { recursive: true });
375
+ }
376
+ const args = [
377
+ url,
378
+ '--output=json',
379
+ `--output-path=${reportPath}`,
380
+ `--only-categories=${categories.join(',')}`,
381
+ `--preset=${device}`,
382
+ '--chrome-flags="--headless"',
383
+ ];
384
+ if (!throttling) {
385
+ args.push('--throttling-method=provided');
386
+ }
387
+ const command = `npx lighthouse ${args.join(' ')} 2>&1`;
388
+ try {
389
+ await execAsync(command, { timeout: 120000, maxBuffer: 50 * 1024 * 1024 });
390
+ if (!fs.existsSync(reportPath)) {
391
+ throw new Error('Report not generated');
392
+ }
393
+ const report = JSON.parse(fs.readFileSync(reportPath, 'utf-8'));
394
+ return {
395
+ success: true,
396
+ scores: {
397
+ performance: Math.round((report.categories?.performance?.score || 0) * 100),
398
+ accessibility: Math.round((report.categories?.accessibility?.score || 0) * 100),
399
+ bestPractices: Math.round((report.categories?.['best-practices']?.score || 0) * 100),
400
+ seo: Math.round((report.categories?.seo?.score || 0) * 100),
401
+ pwa: report.categories?.pwa ? Math.round(report.categories.pwa.score * 100) : undefined,
402
+ },
403
+ metrics: {
404
+ firstContentfulPaint: report.audits?.['first-contentful-paint']?.numericValue || 0,
405
+ largestContentfulPaint: report.audits?.['largest-contentful-paint']?.numericValue || 0,
406
+ timeToInteractive: report.audits?.interactive?.numericValue || 0,
407
+ totalBlockingTime: report.audits?.['total-blocking-time']?.numericValue || 0,
408
+ cumulativeLayoutShift: report.audits?.['cumulative-layout-shift']?.numericValue || 0,
409
+ speedIndex: report.audits?.['speed-index']?.numericValue || 0,
410
+ },
411
+ reportPath,
412
+ };
413
+ }
414
+ catch (error) {
415
+ return {
416
+ success: false,
417
+ scores: {
418
+ performance: 0,
419
+ accessibility: 0,
420
+ bestPractices: 0,
421
+ seo: 0,
422
+ },
423
+ metrics: {
424
+ firstContentfulPaint: 0,
425
+ largestContentfulPaint: 0,
426
+ timeToInteractive: 0,
427
+ totalBlockingTime: 0,
428
+ cumulativeLayoutShift: 0,
429
+ speedIndex: 0,
430
+ },
431
+ reportPath,
432
+ };
433
+ }
434
+ }
435
+ // ============================================
436
+ // Accessibility Testing
437
+ // ============================================
438
+ async function runAccessibilityTests(config) {
439
+ const { projectPath, url, rules, tags = ['wcag2a', 'wcag2aa'] } = config;
440
+ // Create a simple Playwright script to run axe-core
441
+ const testScript = `
442
+ const { chromium } = require('playwright');
443
+ const AxeBuilder = require('@axe-core/playwright').default;
444
+
445
+ (async () => {
446
+ const browser = await chromium.launch();
447
+ const context = await browser.newContext();
448
+ const page = await context.newPage();
449
+ await page.goto('${url}');
450
+
451
+ const results = await new AxeBuilder({ page })
452
+ ${tags.length ? `.withTags(${JSON.stringify(tags)})` : ''}
453
+ .analyze();
454
+
455
+ console.log(JSON.stringify(results));
456
+ await browser.close();
457
+ })();
458
+ `;
459
+ const scriptPath = path.join(projectPath, '.test-genie', 'a11y-test.js');
460
+ const scriptDir = path.dirname(scriptPath);
461
+ if (!fs.existsSync(scriptDir)) {
462
+ fs.mkdirSync(scriptDir, { recursive: true });
463
+ }
464
+ fs.writeFileSync(scriptPath, testScript);
465
+ try {
466
+ const { stdout } = await execAsync(`node "${scriptPath}"`, { timeout: 60000 });
467
+ const results = JSON.parse(stdout);
468
+ return {
469
+ success: results.violations?.length === 0,
470
+ violations: results.violations?.map((v) => ({
471
+ id: v.id,
472
+ impact: v.impact,
473
+ description: v.description,
474
+ nodes: v.nodes?.map((n) => ({
475
+ html: n.html,
476
+ target: n.target?.join(', ') || '',
477
+ })) || [],
478
+ })) || [],
479
+ passes: results.passes?.length || 0,
480
+ inapplicable: results.inapplicable?.length || 0,
481
+ };
482
+ }
483
+ catch (error) {
484
+ return {
485
+ success: false,
486
+ violations: [],
487
+ passes: 0,
488
+ inapplicable: 0,
489
+ };
490
+ }
491
+ finally {
492
+ // Cleanup
493
+ if (fs.existsSync(scriptPath)) {
494
+ fs.unlinkSync(scriptPath);
495
+ }
496
+ }
497
+ }
498
+ async function runAPITests(config) {
499
+ const { baseUrl, endpoints } = config;
500
+ const results = [];
501
+ const startTime = Date.now();
502
+ for (const endpoint of endpoints) {
503
+ const url = `${baseUrl}${endpoint.path}`;
504
+ const start = Date.now();
505
+ try {
506
+ const response = await fetch(url, {
507
+ method: endpoint.method,
508
+ headers: {
509
+ 'Content-Type': 'application/json',
510
+ ...endpoint.headers,
511
+ },
512
+ body: endpoint.body ? JSON.stringify(endpoint.body) : undefined,
513
+ });
514
+ const duration = Date.now() - start;
515
+ const passed = response.status === endpoint.expectedStatus;
516
+ results.push({
517
+ endpoint: endpoint.path,
518
+ method: endpoint.method,
519
+ status: response.status,
520
+ duration,
521
+ passed,
522
+ error: passed ? undefined : `Expected ${endpoint.expectedStatus}, got ${response.status}`,
523
+ });
524
+ }
525
+ catch (error) {
526
+ results.push({
527
+ endpoint: endpoint.path,
528
+ method: endpoint.method,
529
+ status: 0,
530
+ duration: Date.now() - start,
531
+ passed: false,
532
+ error: error.message,
533
+ });
534
+ }
535
+ }
536
+ return {
537
+ success: results.every(r => r.passed),
538
+ results,
539
+ totalDuration: Date.now() - startTime,
540
+ };
541
+ }
542
+ async function runLoadTest(config) {
543
+ const { projectPath, url, duration, vus, thresholds } = config;
544
+ // Create k6 script
545
+ const k6Script = `
546
+ import http from 'k6/http';
547
+ import { check, sleep } from 'k6';
548
+
549
+ export const options = {
550
+ vus: ${vus},
551
+ duration: '${duration}',
552
+ thresholds: ${JSON.stringify(thresholds || {})},
553
+ };
554
+
555
+ export default function() {
556
+ const res = http.get('${url}');
557
+ check(res, {
558
+ 'status is 200': (r) => r.status === 200,
559
+ 'response time < 500ms': (r) => r.timings.duration < 500,
560
+ });
561
+ sleep(1);
562
+ }
563
+ `;
564
+ const scriptPath = path.join(projectPath, '.test-genie', 'load-test.js');
565
+ const scriptDir = path.dirname(scriptPath);
566
+ if (!fs.existsSync(scriptDir)) {
567
+ fs.mkdirSync(scriptDir, { recursive: true });
568
+ }
569
+ fs.writeFileSync(scriptPath, k6Script);
570
+ try {
571
+ const { stdout } = await execAsync(`k6 run --out json=/tmp/k6-results.json "${scriptPath}"`, {
572
+ timeout: 600000,
573
+ });
574
+ // Parse k6 output
575
+ const metrics = parseK6Output(stdout);
576
+ return {
577
+ success: true,
578
+ metrics,
579
+ output: stdout,
580
+ };
581
+ }
582
+ catch (error) {
583
+ return {
584
+ success: false,
585
+ metrics: {
586
+ http_reqs: 0,
587
+ http_req_duration_avg: 0,
588
+ http_req_duration_p95: 0,
589
+ http_req_failed: 0,
590
+ vus: 0,
591
+ },
592
+ output: error.stdout || error.message,
593
+ };
594
+ }
595
+ finally {
596
+ if (fs.existsSync(scriptPath)) {
597
+ fs.unlinkSync(scriptPath);
598
+ }
599
+ }
600
+ }
601
+ function parseK6Output(output) {
602
+ const metrics = {
603
+ http_reqs: 0,
604
+ http_req_duration_avg: 0,
605
+ http_req_duration_p95: 0,
606
+ http_req_failed: 0,
607
+ vus: 0,
608
+ };
609
+ const reqsMatch = output.match(/http_reqs[.\s]+:\s+(\d+)/);
610
+ if (reqsMatch)
611
+ metrics.http_reqs = parseInt(reqsMatch[1] || '0');
612
+ const durationMatch = output.match(/http_req_duration[.\s]+avg=([\d.]+)ms/);
613
+ if (durationMatch)
614
+ metrics.http_req_duration_avg = parseFloat(durationMatch[1] || '0');
615
+ const p95Match = output.match(/p\(95\)=([\d.]+)ms/);
616
+ if (p95Match)
617
+ metrics.http_req_duration_p95 = parseFloat(p95Match[1] || '0');
618
+ const failedMatch = output.match(/http_req_failed[.\s]+:\s+([\d.]+)%/);
619
+ if (failedMatch)
620
+ metrics.http_req_failed = parseFloat(failedMatch[1] || '0');
621
+ const vusMatch = output.match(/vus[.\s]+:\s+(\d+)/);
622
+ if (vusMatch)
623
+ metrics.vus = parseInt(vusMatch[1] || '0');
624
+ return metrics;
625
+ }
626
+ exports.default = {
627
+ listBrowsers,
628
+ installBrowsers,
629
+ runPlaywrightTests,
630
+ runVisualTests,
631
+ runCypressTests,
632
+ runLighthouse,
633
+ runAccessibilityTests,
634
+ runAPITests,
635
+ runLoadTest,
636
+ };
637
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/platforms/web/index.ts"],"names":[],"mappings":"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"}