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,602 @@
1
+ "use strict";
2
+ // ============================================
3
+ // React Native Test Platform Integration
4
+ // Jest, Detox, React Native Testing Library
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.listDevices = listDevices;
41
+ exports.runJestTests = runJestTests;
42
+ exports.runDetoxTests = runDetoxTests;
43
+ exports.runRNTLTests = runRNTLTests;
44
+ exports.runPerformanceProfile = runPerformanceProfile;
45
+ exports.detectMemoryLeaks = detectMemoryLeaks;
46
+ exports.runSnapshotTests = runSnapshotTests;
47
+ exports.buildApp = buildApp;
48
+ exports.startMetro = startMetro;
49
+ exports.stopMetro = stopMetro;
50
+ const child_process_1 = require("child_process");
51
+ const util_1 = require("util");
52
+ const fs = __importStar(require("fs"));
53
+ const path = __importStar(require("path"));
54
+ const execAsync = (0, util_1.promisify)(child_process_1.exec);
55
+ // ============================================
56
+ // Device Management
57
+ // ============================================
58
+ async function listDevices() {
59
+ const devices = [];
60
+ try {
61
+ // iOS Simulators
62
+ const { stdout: iosOutput } = await execAsync('xcrun simctl list devices -j');
63
+ const iosData = JSON.parse(iosOutput);
64
+ for (const [runtime, deviceList] of Object.entries(iosData.devices)) {
65
+ if (!Array.isArray(deviceList))
66
+ continue;
67
+ for (const device of deviceList) {
68
+ devices.push({
69
+ id: device.udid,
70
+ name: device.name,
71
+ type: 'simulator',
72
+ platform: 'ios',
73
+ available: device.isAvailable,
74
+ });
75
+ }
76
+ }
77
+ }
78
+ catch {
79
+ // iOS not available
80
+ }
81
+ try {
82
+ // Android Emulators
83
+ const { stdout: androidOutput } = await execAsync('adb devices -l');
84
+ const lines = androidOutput.split('\n').slice(1);
85
+ for (const line of lines) {
86
+ const match = line.match(/^(\S+)\s+(\w+)/);
87
+ if (match && match[2] !== 'offline') {
88
+ devices.push({
89
+ id: match[1] || '',
90
+ name: line.includes('emulator') ? 'Android Emulator' : 'Android Device',
91
+ type: line.includes('emulator') ? 'emulator' : 'device',
92
+ platform: 'android',
93
+ available: match[2] === 'device',
94
+ });
95
+ }
96
+ }
97
+ }
98
+ catch {
99
+ // Android not available
100
+ }
101
+ return devices;
102
+ }
103
+ // ============================================
104
+ // Jest Tests (Unit & Component)
105
+ // ============================================
106
+ async function runJestTests(config) {
107
+ const { projectPath, testPath, config: jestConfig, coverage = false, updateSnapshots = false, testNamePattern, timeout = 300000, } = config;
108
+ const args = ['--json', '--outputFile=/tmp/jest-results.json'];
109
+ if (testPath)
110
+ args.push(testPath);
111
+ if (jestConfig)
112
+ args.push(`--config=${jestConfig}`);
113
+ if (coverage)
114
+ args.push('--coverage', '--coverageReporters=json-summary');
115
+ if (updateSnapshots)
116
+ args.push('--updateSnapshot');
117
+ if (testNamePattern)
118
+ args.push(`--testNamePattern="${testNamePattern}"`);
119
+ const command = `cd "${projectPath}" && npx jest ${args.join(' ')} 2>&1`;
120
+ try {
121
+ await execAsync(command, { timeout, maxBuffer: 50 * 1024 * 1024 });
122
+ // Read JSON results
123
+ const resultsPath = '/tmp/jest-results.json';
124
+ const resultsJson = fs.existsSync(resultsPath)
125
+ ? JSON.parse(fs.readFileSync(resultsPath, 'utf-8'))
126
+ : null;
127
+ const testResults = resultsJson?.testResults?.flatMap((suite) => suite.assertionResults?.map((test) => ({
128
+ name: `${suite.name}: ${test.fullName}`,
129
+ status: test.status,
130
+ duration: test.duration || 0,
131
+ failureMessages: test.failureMessages,
132
+ })) || []) || [];
133
+ // Read coverage if enabled
134
+ let coverageData;
135
+ if (coverage) {
136
+ const coveragePath = path.join(projectPath, 'coverage', 'coverage-summary.json');
137
+ if (fs.existsSync(coveragePath)) {
138
+ const coverageJson = JSON.parse(fs.readFileSync(coveragePath, 'utf-8'));
139
+ coverageData = {
140
+ lines: coverageJson.total?.lines?.pct || 0,
141
+ statements: coverageJson.total?.statements?.pct || 0,
142
+ functions: coverageJson.total?.functions?.pct || 0,
143
+ branches: coverageJson.total?.branches?.pct || 0,
144
+ };
145
+ }
146
+ }
147
+ return {
148
+ success: resultsJson?.success || false,
149
+ output: '',
150
+ results: {
151
+ numTotalTests: resultsJson?.numTotalTests || 0,
152
+ numPassedTests: resultsJson?.numPassedTests || 0,
153
+ numFailedTests: resultsJson?.numFailedTests || 0,
154
+ numPendingTests: resultsJson?.numPendingTests || 0,
155
+ testResults,
156
+ },
157
+ coverage: coverageData,
158
+ };
159
+ }
160
+ catch (error) {
161
+ // Try to parse partial results
162
+ const resultsPath = '/tmp/jest-results.json';
163
+ let results = {
164
+ numTotalTests: 0,
165
+ numPassedTests: 0,
166
+ numFailedTests: 0,
167
+ numPendingTests: 0,
168
+ testResults: [],
169
+ };
170
+ if (fs.existsSync(resultsPath)) {
171
+ try {
172
+ const resultsJson = JSON.parse(fs.readFileSync(resultsPath, 'utf-8'));
173
+ results = {
174
+ numTotalTests: resultsJson.numTotalTests || 0,
175
+ numPassedTests: resultsJson.numPassedTests || 0,
176
+ numFailedTests: resultsJson.numFailedTests || 0,
177
+ numPendingTests: resultsJson.numPendingTests || 0,
178
+ testResults: resultsJson.testResults?.flatMap((suite) => suite.assertionResults?.map((test) => ({
179
+ name: `${suite.name}: ${test.fullName}`,
180
+ status: test.status,
181
+ duration: test.duration || 0,
182
+ failureMessages: test.failureMessages,
183
+ })) || []) || [],
184
+ };
185
+ }
186
+ catch {
187
+ // Ignore parse errors
188
+ }
189
+ }
190
+ return {
191
+ success: false,
192
+ output: error.stdout || error.message,
193
+ results,
194
+ };
195
+ }
196
+ }
197
+ async function runDetoxTests(config) {
198
+ const { projectPath, configuration, testPath, device, headless = false, recordLogs = 'failing', recordVideos = 'failing', recordPerformance = 'none', timeout = 600000, } = config;
199
+ const artifactsDir = path.join(projectPath, '.test-genie', 'detox-artifacts', Date.now().toString());
200
+ const args = [
201
+ '-c', configuration,
202
+ '--artifacts-location', artifactsDir,
203
+ `--record-logs=${recordLogs}`,
204
+ `--record-videos=${recordVideos}`,
205
+ `--record-performance=${recordPerformance}`,
206
+ ];
207
+ if (testPath)
208
+ args.push(testPath);
209
+ if (device)
210
+ args.push('--device-name', device);
211
+ if (headless)
212
+ args.push('--headless');
213
+ // Build first
214
+ const buildCommand = `cd "${projectPath}" && npx detox build -c ${configuration} 2>&1`;
215
+ try {
216
+ await execAsync(buildCommand, { timeout: 600000, maxBuffer: 50 * 1024 * 1024 });
217
+ }
218
+ catch (error) {
219
+ return {
220
+ success: false,
221
+ output: `Build failed: ${error.message}`,
222
+ results: {
223
+ numTotalTests: 0,
224
+ numPassedTests: 0,
225
+ numFailedTests: 0,
226
+ testResults: [],
227
+ },
228
+ artifacts: { logs: [], videos: [], screenshots: [] },
229
+ };
230
+ }
231
+ // Run tests
232
+ const testCommand = `cd "${projectPath}" && npx detox test ${args.join(' ')} 2>&1`;
233
+ try {
234
+ const { stdout } = await execAsync(testCommand, { timeout, maxBuffer: 50 * 1024 * 1024 });
235
+ const results = parseDetoxOutput(stdout);
236
+ const artifacts = collectArtifacts(artifactsDir);
237
+ return {
238
+ success: results.numFailedTests === 0,
239
+ output: stdout,
240
+ results,
241
+ artifacts,
242
+ };
243
+ }
244
+ catch (error) {
245
+ const results = parseDetoxOutput(error.stdout || '');
246
+ const artifacts = collectArtifacts(artifactsDir);
247
+ return {
248
+ success: false,
249
+ output: error.stdout || error.message,
250
+ results,
251
+ artifacts,
252
+ };
253
+ }
254
+ }
255
+ function parseDetoxOutput(output) {
256
+ const testResults = [];
257
+ // Parse test results from Detox/Jest output
258
+ const passedRegex = /✓\s+(.+?)\s+\((\d+)\s*ms\)/g;
259
+ const failedRegex = /✕\s+(.+?)\s+\((\d+)\s*ms\)/g;
260
+ let match;
261
+ while ((match = passedRegex.exec(output)) !== null) {
262
+ testResults.push({
263
+ name: match[1] || '',
264
+ status: 'passed',
265
+ duration: parseInt(match[2] || '0'),
266
+ });
267
+ }
268
+ while ((match = failedRegex.exec(output)) !== null) {
269
+ testResults.push({
270
+ name: match[1] || '',
271
+ status: 'failed',
272
+ duration: parseInt(match[2] || '0'),
273
+ });
274
+ }
275
+ return {
276
+ numTotalTests: testResults.length,
277
+ numPassedTests: testResults.filter(t => t.status === 'passed').length,
278
+ numFailedTests: testResults.filter(t => t.status === 'failed').length,
279
+ testResults,
280
+ };
281
+ }
282
+ function collectArtifacts(artifactsDir) {
283
+ const artifacts = {
284
+ logs: [],
285
+ videos: [],
286
+ screenshots: [],
287
+ };
288
+ if (!fs.existsSync(artifactsDir)) {
289
+ return artifacts;
290
+ }
291
+ function walk(dir) {
292
+ try {
293
+ const items = fs.readdirSync(dir);
294
+ for (const item of items) {
295
+ const fullPath = path.join(dir, item);
296
+ const stat = fs.statSync(fullPath);
297
+ if (stat.isDirectory()) {
298
+ walk(fullPath);
299
+ }
300
+ else {
301
+ if (item.endsWith('.log')) {
302
+ artifacts.logs.push(fullPath);
303
+ }
304
+ else if (item.endsWith('.mp4') || item.endsWith('.mov')) {
305
+ artifacts.videos.push(fullPath);
306
+ }
307
+ else if (item.endsWith('.png') || item.endsWith('.jpg')) {
308
+ artifacts.screenshots.push(fullPath);
309
+ }
310
+ }
311
+ }
312
+ }
313
+ catch {
314
+ // Ignore errors
315
+ }
316
+ }
317
+ walk(artifactsDir);
318
+ return artifacts;
319
+ }
320
+ // ============================================
321
+ // React Native Testing Library (RNTL)
322
+ // ============================================
323
+ async function runRNTLTests(config) {
324
+ // RNTL uses Jest, so we can reuse Jest runner with specific config
325
+ const jestResult = await runJestTests({
326
+ ...config,
327
+ testPath: config.testPath || '__tests__',
328
+ });
329
+ return {
330
+ success: jestResult.success,
331
+ output: jestResult.output,
332
+ results: {
333
+ passed: jestResult.results.numPassedTests,
334
+ failed: jestResult.results.numFailedTests,
335
+ tests: jestResult.results.testResults.map(t => ({
336
+ name: t.name,
337
+ passed: t.status === 'passed',
338
+ duration: t.duration,
339
+ })),
340
+ },
341
+ };
342
+ }
343
+ async function runPerformanceProfile(config) {
344
+ const { projectPath, platform, device, duration } = config;
345
+ // Use Flipper/React Native Debugger metrics
346
+ // For now, simulate collection
347
+ const metrics = {
348
+ jsThreadFPS: 60,
349
+ uiThreadFPS: 60,
350
+ memoryMB: 0,
351
+ jsHeapMB: 0,
352
+ nativeHeapMB: 0,
353
+ };
354
+ const frames = {
355
+ droppedJS: 0,
356
+ droppedUI: 0,
357
+ };
358
+ if (platform === 'android') {
359
+ try {
360
+ // Use Android profiler
361
+ const deviceArg = device ? `-s ${device}` : '';
362
+ // Get memory info
363
+ const { stdout: memInfo } = await execAsync(`adb ${deviceArg} shell dumpsys meminfo $(adb ${deviceArg} shell pidof -s com.$(cd "${projectPath}" && cat package.json | grep '"name"' | cut -d'"' -f4))`);
364
+ const totalMatch = memInfo.match(/TOTAL:\s+(\d+)/);
365
+ if (totalMatch) {
366
+ metrics.memoryMB = parseInt(totalMatch[1] || '0') / 1024;
367
+ }
368
+ // Get frame stats
369
+ const { stdout: frameInfo } = await execAsync(`adb ${deviceArg} shell dumpsys gfxinfo $(adb ${deviceArg} shell pidof -s com.$(cd "${projectPath}" && cat package.json | grep '"name"' | cut -d'"' -f4))`);
370
+ const jankyMatch = frameInfo.match(/Janky frames:\s+(\d+)/);
371
+ if (jankyMatch) {
372
+ frames.droppedUI = parseInt(jankyMatch[1] || '0');
373
+ }
374
+ }
375
+ catch {
376
+ // Profiling not available
377
+ }
378
+ }
379
+ else if (platform === 'ios') {
380
+ try {
381
+ // Use Instruments or simctl
382
+ // This is a simplified version
383
+ const deviceArg = device || 'booted';
384
+ const { stdout } = await execAsync(`xcrun simctl spawn ${deviceArg} log show --predicate 'subsystem == "com.apple.UIKit"' --last ${duration}s 2>&1`);
385
+ // Parse frame drops from logs (simplified)
386
+ const dropMatches = stdout.match(/frame drop/gi);
387
+ if (dropMatches) {
388
+ frames.droppedUI = dropMatches.length;
389
+ }
390
+ }
391
+ catch {
392
+ // Profiling not available
393
+ }
394
+ }
395
+ return {
396
+ success: true,
397
+ metrics,
398
+ frames,
399
+ };
400
+ }
401
+ // ============================================
402
+ // Memory Leak Detection
403
+ // ============================================
404
+ async function detectMemoryLeaks(config) {
405
+ const { projectPath, platform, device, duration } = config;
406
+ const memoryTimeline = [];
407
+ const leaks = [];
408
+ const startTime = Date.now();
409
+ const sampleInterval = 1000; // 1 second
410
+ if (platform === 'android') {
411
+ const deviceArg = device ? `-s ${device}` : '';
412
+ // Sample memory over time
413
+ while (Date.now() - startTime < duration * 1000) {
414
+ try {
415
+ const { stdout } = await execAsync(`adb ${deviceArg} shell dumpsys meminfo | grep -A 5 "Total RAM"`);
416
+ const usedMatch = stdout.match(/Used RAM:\s+([\d,]+)/);
417
+ if (usedMatch) {
418
+ const heapMB = parseInt(usedMatch[1]?.replace(/,/g, '') || '0') / 1024;
419
+ memoryTimeline.push({
420
+ time: Date.now() - startTime,
421
+ heapMB,
422
+ });
423
+ }
424
+ }
425
+ catch {
426
+ // Skip this sample
427
+ }
428
+ await new Promise(resolve => setTimeout(resolve, sampleInterval));
429
+ }
430
+ // Analyze for leaks
431
+ if (memoryTimeline.length >= 2) {
432
+ const firstHalf = memoryTimeline.slice(0, Math.floor(memoryTimeline.length / 2));
433
+ const secondHalf = memoryTimeline.slice(Math.floor(memoryTimeline.length / 2));
434
+ const firstAvg = firstHalf.reduce((a, b) => a + b.heapMB, 0) / firstHalf.length;
435
+ const secondAvg = secondHalf.reduce((a, b) => a + b.heapMB, 0) / secondHalf.length;
436
+ if (secondAvg > firstAvg * 1.2) {
437
+ leaks.push({
438
+ type: 'Memory Growth',
439
+ location: 'Application',
440
+ size: Math.round(secondAvg - firstAvg),
441
+ });
442
+ }
443
+ }
444
+ }
445
+ else if (platform === 'ios') {
446
+ // iOS memory monitoring
447
+ const deviceArg = device || 'booted';
448
+ while (Date.now() - startTime < duration * 1000) {
449
+ try {
450
+ // Use simctl to get memory info (simplified)
451
+ const { stdout } = await execAsync(`xcrun simctl spawn ${deviceArg} memory_pressure`);
452
+ // Parse memory info
453
+ const freeMatch = stdout.match(/(\d+)%\s+free/);
454
+ if (freeMatch) {
455
+ // Estimate heap usage
456
+ const freePercent = parseInt(freeMatch[1] || '100');
457
+ memoryTimeline.push({
458
+ time: Date.now() - startTime,
459
+ heapMB: (100 - freePercent) * 10, // Rough estimate
460
+ });
461
+ }
462
+ }
463
+ catch {
464
+ // Skip this sample
465
+ }
466
+ await new Promise(resolve => setTimeout(resolve, sampleInterval));
467
+ }
468
+ }
469
+ return {
470
+ success: true,
471
+ leaks,
472
+ memoryTimeline,
473
+ };
474
+ }
475
+ // ============================================
476
+ // Snapshot Testing
477
+ // ============================================
478
+ async function runSnapshotTests(config) {
479
+ const { projectPath, testPath, updateSnapshots = false, timeout = 300000 } = config;
480
+ const args = ['--testPathPattern=\\.snap\\.'];
481
+ if (testPath)
482
+ args.push(testPath);
483
+ if (updateSnapshots)
484
+ args.push('-u');
485
+ const command = `cd "${projectPath}" && npx jest ${args.join(' ')} 2>&1`;
486
+ try {
487
+ const { stdout } = await execAsync(command, { timeout, maxBuffer: 50 * 1024 * 1024 });
488
+ // Parse snapshot results
489
+ const totalMatch = stdout.match(/Snapshots:\s+(\d+)\s+total/);
490
+ const passedMatch = stdout.match(/(\d+)\s+passed/);
491
+ const failedMatch = stdout.match(/(\d+)\s+failed/);
492
+ const updatedMatch = stdout.match(/(\d+)\s+updated/);
493
+ const obsoleteMatch = stdout.match(/(\d+)\s+obsolete/);
494
+ return {
495
+ success: !failedMatch || parseInt(failedMatch[1] || '0') === 0,
496
+ output: stdout,
497
+ results: {
498
+ total: parseInt(totalMatch?.[1] || '0'),
499
+ passed: parseInt(passedMatch?.[1] || '0'),
500
+ failed: parseInt(failedMatch?.[1] || '0'),
501
+ updated: parseInt(updatedMatch?.[1] || '0'),
502
+ obsolete: [],
503
+ },
504
+ };
505
+ }
506
+ catch (error) {
507
+ return {
508
+ success: false,
509
+ output: error.stdout || error.message,
510
+ results: {
511
+ total: 0,
512
+ passed: 0,
513
+ failed: 0,
514
+ updated: 0,
515
+ obsolete: [],
516
+ },
517
+ };
518
+ }
519
+ }
520
+ // ============================================
521
+ // App Build & Installation
522
+ // ============================================
523
+ async function buildApp(projectPath, platform, options) {
524
+ const { release = false, device } = options || {};
525
+ const modeArg = release ? '--mode=release' : '';
526
+ let command;
527
+ if (platform === 'ios') {
528
+ command = `cd "${projectPath}" && npx react-native run-ios ${modeArg} ${device ? `--device="${device}"` : ''} 2>&1`;
529
+ }
530
+ else {
531
+ command = `cd "${projectPath}" && npx react-native run-android ${modeArg} 2>&1`;
532
+ }
533
+ try {
534
+ const { stdout } = await execAsync(command, { timeout: 600000, maxBuffer: 50 * 1024 * 1024 });
535
+ return {
536
+ success: stdout.includes('BUILD SUCCESSFUL') || stdout.includes('success'),
537
+ output: stdout,
538
+ };
539
+ }
540
+ catch (error) {
541
+ return {
542
+ success: false,
543
+ output: error.stdout || error.message,
544
+ };
545
+ }
546
+ }
547
+ // ============================================
548
+ // Metro Bundler Management
549
+ // ============================================
550
+ async function startMetro(projectPath) {
551
+ try {
552
+ // Check if Metro is already running
553
+ try {
554
+ await execAsync('curl -s http://localhost:8081/status');
555
+ return { success: true, port: 8081 };
556
+ }
557
+ catch {
558
+ // Not running, start it
559
+ }
560
+ // Start Metro in background
561
+ (0, child_process_1.exec)(`cd "${projectPath}" && npx react-native start --reset-cache`, {
562
+ cwd: projectPath,
563
+ });
564
+ // Wait for Metro to be ready
565
+ for (let i = 0; i < 30; i++) {
566
+ await new Promise(resolve => setTimeout(resolve, 1000));
567
+ try {
568
+ await execAsync('curl -s http://localhost:8081/status');
569
+ return { success: true, port: 8081 };
570
+ }
571
+ catch {
572
+ // Not ready yet
573
+ }
574
+ }
575
+ return { success: false, port: 8081 };
576
+ }
577
+ catch {
578
+ return { success: false, port: 8081 };
579
+ }
580
+ }
581
+ async function stopMetro() {
582
+ try {
583
+ await execAsync('pkill -f "react-native.*start"');
584
+ return true;
585
+ }
586
+ catch {
587
+ return false;
588
+ }
589
+ }
590
+ exports.default = {
591
+ listDevices,
592
+ runJestTests,
593
+ runDetoxTests,
594
+ runRNTLTests,
595
+ runPerformanceProfile,
596
+ detectMemoryLeaks,
597
+ runSnapshotTests,
598
+ buildApp,
599
+ startMetro,
600
+ stopMetro,
601
+ };
602
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/platforms/react-native/index.ts"],"names":[],"mappings":"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"}