xibecode 0.3.5 → 0.4.3

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 (43) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +255 -904
  3. package/dist/commands/chat.d.ts +1 -0
  4. package/dist/commands/chat.d.ts.map +1 -1
  5. package/dist/commands/chat.js +106 -8
  6. package/dist/commands/chat.js.map +1 -1
  7. package/dist/core/modes.d.ts +302 -14
  8. package/dist/core/modes.d.ts.map +1 -1
  9. package/dist/core/modes.js +81 -9
  10. package/dist/core/modes.js.map +1 -1
  11. package/dist/core/session-bridge.d.ts +105 -0
  12. package/dist/core/session-bridge.d.ts.map +1 -0
  13. package/dist/core/session-bridge.js +243 -0
  14. package/dist/core/session-bridge.js.map +1 -0
  15. package/dist/core/tools.d.ts +359 -0
  16. package/dist/core/tools.d.ts.map +1 -1
  17. package/dist/core/tools.js +631 -1
  18. package/dist/core/tools.js.map +1 -1
  19. package/dist/index.js +42 -35
  20. package/dist/index.js.map +1 -1
  21. package/dist/tools/browser.d.ts +112 -0
  22. package/dist/tools/browser.d.ts.map +1 -1
  23. package/dist/tools/browser.js +396 -13
  24. package/dist/tools/browser.js.map +1 -1
  25. package/dist/tools/test-generator.d.ts +157 -0
  26. package/dist/tools/test-generator.d.ts.map +1 -0
  27. package/dist/tools/test-generator.js +893 -0
  28. package/dist/tools/test-generator.js.map +1 -0
  29. package/dist/webui/server.d.ts +96 -0
  30. package/dist/webui/server.d.ts.map +1 -0
  31. package/dist/webui/server.js +2132 -0
  32. package/dist/webui/server.js.map +1 -0
  33. package/package.json +30 -14
  34. package/webui-dist/assets/index-BlYSY3Lp.js +338 -0
  35. package/webui-dist/assets/index-BlYSY3Lp.js.map +1 -0
  36. package/webui-dist/assets/index-DS6Gij8T.css +32 -0
  37. package/webui-dist/assets/xterm-BUw9jMN8.js +10 -0
  38. package/webui-dist/assets/xterm-BUw9jMN8.js.map +1 -0
  39. package/webui-dist/assets/xterm-addon-fit-CMYoGiLV.js +2 -0
  40. package/webui-dist/assets/xterm-addon-fit-CMYoGiLV.js.map +1 -0
  41. package/webui-dist/assets/xterm-addon-web-links-mCwMW5Oc.js +2 -0
  42. package/webui-dist/assets/xterm-addon-web-links-mCwMW5Oc.js.map +1 -0
  43. package/webui-dist/index.html +15 -0
@@ -1,28 +1,62 @@
1
- import puppeteer from 'puppeteer';
1
+ import { chromium } from 'playwright';
2
+ import * as fs from 'fs/promises';
3
+ import * as path from 'path';
4
+ /**
5
+ * Default viewports for responsive testing
6
+ */
7
+ export const DEFAULT_VIEWPORTS = [
8
+ { name: 'mobile', width: 375, height: 667 },
9
+ { name: 'tablet', width: 768, height: 1024 },
10
+ { name: 'desktop', width: 1280, height: 800 },
11
+ { name: 'desktop-large', width: 1920, height: 1080 },
12
+ ];
13
+ /**
14
+ * BrowserManager - Playwright-based browser automation for XibeCode
15
+ *
16
+ * Provides tools for:
17
+ * - Screenshot capture
18
+ * - Console log collection
19
+ * - Visual regression testing
20
+ * - Performance metrics (Core Web Vitals)
21
+ * - Accessibility auditing
22
+ * - Responsive testing
23
+ * - Network monitoring
24
+ */
2
25
  export class BrowserManager {
3
26
  browser = null;
27
+ context = null;
4
28
  async getBrowser() {
5
29
  if (!this.browser) {
6
- this.browser = await puppeteer.launch({
30
+ this.browser = await chromium.launch({
7
31
  headless: true,
8
- args: ['--no-sandbox', '--disable-setuid-sandbox'], // Safer for containerized envs
32
+ args: ['--no-sandbox', '--disable-setuid-sandbox'],
9
33
  });
34
+ this.context = await this.browser.newContext();
10
35
  }
11
- return this.browser;
36
+ if (!this.context) {
37
+ this.context = await this.browser.newContext();
38
+ }
39
+ return this.context;
12
40
  }
13
41
  async close() {
42
+ if (this.context) {
43
+ await this.context.close();
44
+ this.context = null;
45
+ }
14
46
  if (this.browser) {
15
47
  await this.browser.close();
16
48
  this.browser = null;
17
49
  }
18
50
  }
51
+ /**
52
+ * Take a screenshot of a webpage
53
+ */
19
54
  async takeScreenshot(url, outputPath, fullPage = true) {
20
- const browser = await this.getBrowser();
21
- const page = await browser.newPage();
55
+ const context = await this.getBrowser();
56
+ const page = await context.newPage();
22
57
  try {
23
- await page.setViewport({ width: 1280, height: 800 });
24
- // Navigate and wait for network idle to ensure assets load
25
- await page.goto(url, { waitUntil: 'networkidle0', timeout: 30000 });
58
+ await page.setViewportSize({ width: 1280, height: 800 });
59
+ await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 });
26
60
  await page.screenshot({ path: outputPath, fullPage });
27
61
  return `Screenshot saved to ${outputPath}`;
28
62
  }
@@ -33,16 +67,18 @@ export class BrowserManager {
33
67
  await page.close();
34
68
  }
35
69
  }
70
+ /**
71
+ * Get console logs from a webpage
72
+ */
36
73
  async getConsoleLogs(url, timeout = 5000) {
37
- const browser = await this.getBrowser();
38
- const page = await browser.newPage();
74
+ const context = await this.getBrowser();
75
+ const page = await context.newPage();
39
76
  const logs = [];
40
77
  page.on('console', (msg) => logs.push(`[${msg.type()}] ${msg.text()}`));
41
78
  page.on('pageerror', (err) => logs.push(`[error] ${err.message}`));
42
79
  try {
43
80
  await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
44
- // Wait a bit for async logs
45
- await new Promise(resolve => setTimeout(resolve, timeout));
81
+ await page.waitForTimeout(timeout);
46
82
  return logs;
47
83
  }
48
84
  catch (error) {
@@ -52,5 +88,352 @@ export class BrowserManager {
52
88
  await page.close();
53
89
  }
54
90
  }
91
+ /**
92
+ * Run a visual regression test by comparing screenshots
93
+ */
94
+ async runVisualTest(url, baselinePath, outputDir = '.playwright-baselines') {
95
+ const context = await this.getBrowser();
96
+ const page = await context.newPage();
97
+ try {
98
+ await page.setViewportSize({ width: 1280, height: 800 });
99
+ await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 });
100
+ // Ensure output directory exists
101
+ await fs.mkdir(outputDir, { recursive: true });
102
+ const screenshotPath = path.join(outputDir, 'current.png');
103
+ await page.screenshot({ path: screenshotPath, fullPage: true });
104
+ // Check if baseline exists
105
+ let baselineExists = false;
106
+ try {
107
+ await fs.access(baselinePath);
108
+ baselineExists = true;
109
+ }
110
+ catch {
111
+ // Baseline doesn't exist, create it
112
+ await fs.copyFile(screenshotPath, baselinePath);
113
+ return {
114
+ match: true,
115
+ diffPercentage: 0,
116
+ baselineExists: false,
117
+ screenshotPath,
118
+ };
119
+ }
120
+ // Simple pixel comparison (for basic visual testing)
121
+ const currentBuffer = await fs.readFile(screenshotPath);
122
+ const baselineBuffer = await fs.readFile(baselinePath);
123
+ const match = currentBuffer.equals(baselineBuffer);
124
+ return {
125
+ match,
126
+ diffPercentage: match ? 0 : 100, // Simplified - would need pixelmatch for accurate diff
127
+ baselineExists: true,
128
+ screenshotPath,
129
+ };
130
+ }
131
+ catch (error) {
132
+ throw new Error(`Visual test failed: ${error.message}`);
133
+ }
134
+ finally {
135
+ await page.close();
136
+ }
137
+ }
138
+ /**
139
+ * Check basic accessibility issues on a page
140
+ */
141
+ async checkAccessibility(url) {
142
+ const context = await this.getBrowser();
143
+ const page = await context.newPage();
144
+ const issues = [];
145
+ try {
146
+ await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 });
147
+ // Check for common accessibility issues
148
+ const checks = await page.evaluate(() => {
149
+ const issues = [];
150
+ // Check images without alt text
151
+ document.querySelectorAll('img').forEach((img, i) => {
152
+ if (!img.alt && !img.getAttribute('aria-label')) {
153
+ issues.push({
154
+ type: 'error',
155
+ message: 'Image missing alt text',
156
+ selector: `img:nth-of-type(${i + 1})`,
157
+ context: img.src?.substring(0, 50),
158
+ });
159
+ }
160
+ });
161
+ // Check form inputs without labels
162
+ document.querySelectorAll('input, select, textarea').forEach((input, i) => {
163
+ const id = input.id;
164
+ const hasLabel = id && document.querySelector(`label[for="${id}"]`);
165
+ const hasAriaLabel = input.getAttribute('aria-label') || input.getAttribute('aria-labelledby');
166
+ if (!hasLabel && !hasAriaLabel) {
167
+ issues.push({
168
+ type: 'error',
169
+ message: 'Form input missing label',
170
+ selector: `${input.tagName.toLowerCase()}:nth-of-type(${i + 1})`,
171
+ context: input.getAttribute('name') || input.getAttribute('placeholder') || undefined,
172
+ });
173
+ }
174
+ });
175
+ // Check for empty links
176
+ document.querySelectorAll('a').forEach((link, i) => {
177
+ const hasText = link.textContent?.trim();
178
+ const hasAriaLabel = link.getAttribute('aria-label');
179
+ const hasTitle = link.getAttribute('title');
180
+ if (!hasText && !hasAriaLabel && !hasTitle) {
181
+ issues.push({
182
+ type: 'warning',
183
+ message: 'Link has no accessible text',
184
+ selector: `a:nth-of-type(${i + 1})`,
185
+ context: link.href?.substring(0, 50),
186
+ });
187
+ }
188
+ });
189
+ // Check for missing document language
190
+ if (!document.documentElement.lang) {
191
+ issues.push({
192
+ type: 'warning',
193
+ message: 'Document missing lang attribute',
194
+ selector: 'html',
195
+ });
196
+ }
197
+ // Check for missing page title
198
+ if (!document.title) {
199
+ issues.push({
200
+ type: 'error',
201
+ message: 'Page missing title',
202
+ selector: 'head',
203
+ });
204
+ }
205
+ // Check heading hierarchy
206
+ const headings = Array.from(document.querySelectorAll('h1, h2, h3, h4, h5, h6'));
207
+ let lastLevel = 0;
208
+ headings.forEach((heading, i) => {
209
+ const level = parseInt(heading.tagName[1]);
210
+ if (level > lastLevel + 1 && lastLevel !== 0) {
211
+ issues.push({
212
+ type: 'warning',
213
+ message: `Heading level skipped from h${lastLevel} to h${level}`,
214
+ selector: `${heading.tagName.toLowerCase()}:nth-of-type(${i + 1})`,
215
+ context: heading.textContent?.substring(0, 30),
216
+ });
217
+ }
218
+ lastLevel = level;
219
+ });
220
+ // Check for sufficient color contrast (basic check)
221
+ const buttons = document.querySelectorAll('button, [role="button"]');
222
+ buttons.forEach((button, i) => {
223
+ const styles = window.getComputedStyle(button);
224
+ if (styles.backgroundColor === 'transparent' && !button.querySelector('img, svg')) {
225
+ issues.push({
226
+ type: 'notice',
227
+ message: 'Button may have contrast issues',
228
+ selector: `button:nth-of-type(${i + 1})`,
229
+ context: button.textContent?.substring(0, 30),
230
+ });
231
+ }
232
+ });
233
+ return issues;
234
+ });
235
+ return checks.map(c => ({
236
+ type: c.type,
237
+ message: c.message,
238
+ selector: c.selector,
239
+ context: c.context,
240
+ }));
241
+ }
242
+ catch (error) {
243
+ throw new Error(`Accessibility check failed: ${error.message}`);
244
+ }
245
+ finally {
246
+ await page.close();
247
+ }
248
+ }
249
+ /**
250
+ * Measure Core Web Vitals and performance metrics
251
+ */
252
+ async measurePerformance(url) {
253
+ const context = await this.getBrowser();
254
+ const page = await context.newPage();
255
+ try {
256
+ const startTime = Date.now();
257
+ // Navigate and measure timing
258
+ await page.goto(url, { waitUntil: 'load', timeout: 30000 });
259
+ const loadTime = Date.now() - startTime;
260
+ // Get performance metrics from browser
261
+ const metrics = await page.evaluate(() => {
262
+ const perf = performance;
263
+ const navigation = perf.getEntriesByType('navigation')[0];
264
+ const paint = perf.getEntriesByType('paint');
265
+ // Get First Contentful Paint
266
+ const fcp = paint.find(p => p.name === 'first-contentful-paint');
267
+ // Get Largest Contentful Paint (if available)
268
+ let lcp = null;
269
+ try {
270
+ const lcpEntries = perf.getEntriesByType('largest-contentful-paint');
271
+ if (lcpEntries.length > 0) {
272
+ lcp = lcpEntries[lcpEntries.length - 1].startTime;
273
+ }
274
+ }
275
+ catch {
276
+ // LCP not available
277
+ }
278
+ // Get Cumulative Layout Shift (if available)
279
+ let cls = null;
280
+ try {
281
+ const layoutShiftEntries = perf.getEntriesByType('layout-shift');
282
+ cls = layoutShiftEntries
283
+ .filter(entry => !entry.hadRecentInput)
284
+ .reduce((sum, entry) => sum + entry.value, 0);
285
+ }
286
+ catch {
287
+ // CLS not available
288
+ }
289
+ return {
290
+ domContentLoaded: navigation?.domContentLoadedEventEnd - navigation?.startTime || 0,
291
+ firstContentfulPaint: fcp?.startTime || null,
292
+ largestContentfulPaint: lcp,
293
+ cumulativeLayoutShift: cls,
294
+ timeToInteractive: navigation?.domInteractive - navigation?.startTime || null,
295
+ };
296
+ });
297
+ return {
298
+ url,
299
+ loadTime,
300
+ domContentLoaded: metrics.domContentLoaded,
301
+ firstContentfulPaint: metrics.firstContentfulPaint,
302
+ largestContentfulPaint: metrics.largestContentfulPaint,
303
+ cumulativeLayoutShift: metrics.cumulativeLayoutShift,
304
+ timeToInteractive: metrics.timeToInteractive,
305
+ };
306
+ }
307
+ catch (error) {
308
+ throw new Error(`Performance measurement failed: ${error.message}`);
309
+ }
310
+ finally {
311
+ await page.close();
312
+ }
313
+ }
314
+ /**
315
+ * Test a page across multiple viewport sizes
316
+ */
317
+ async testResponsive(url, outputDir, viewports = DEFAULT_VIEWPORTS) {
318
+ const context = await this.getBrowser();
319
+ const results = [];
320
+ // Ensure output directory exists
321
+ await fs.mkdir(outputDir, { recursive: true });
322
+ for (const viewport of viewports) {
323
+ const page = await context.newPage();
324
+ const errors = [];
325
+ page.on('pageerror', (err) => errors.push(err.message));
326
+ page.on('console', (msg) => {
327
+ if (msg.type() === 'error') {
328
+ errors.push(msg.text());
329
+ }
330
+ });
331
+ try {
332
+ await page.setViewportSize({ width: viewport.width, height: viewport.height });
333
+ const startTime = Date.now();
334
+ await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 });
335
+ const loadTime = Date.now() - startTime;
336
+ const screenshotPath = path.join(outputDir, `${viewport.name}-${viewport.width}x${viewport.height}.png`);
337
+ await page.screenshot({ path: screenshotPath, fullPage: true });
338
+ results.push({
339
+ viewport,
340
+ screenshotPath,
341
+ loadTime,
342
+ errors,
343
+ });
344
+ }
345
+ catch (error) {
346
+ results.push({
347
+ viewport,
348
+ screenshotPath: '',
349
+ loadTime: 0,
350
+ errors: [error.message],
351
+ });
352
+ }
353
+ finally {
354
+ await page.close();
355
+ }
356
+ }
357
+ return results;
358
+ }
359
+ /**
360
+ * Capture all network requests made during page load
361
+ */
362
+ async captureNetworkRequests(url) {
363
+ const context = await this.getBrowser();
364
+ const page = await context.newPage();
365
+ const requests = [];
366
+ const requestTimings = new Map();
367
+ page.on('request', (request) => {
368
+ requestTimings.set(request.url(), Date.now());
369
+ });
370
+ page.on('response', (response) => {
371
+ const request = response.request();
372
+ const startTime = requestTimings.get(request.url());
373
+ const duration = startTime ? Date.now() - startTime : null;
374
+ requests.push({
375
+ url: request.url(),
376
+ method: request.method(),
377
+ status: response.status(),
378
+ resourceType: request.resourceType(),
379
+ duration,
380
+ });
381
+ });
382
+ page.on('requestfailed', (request) => {
383
+ const startTime = requestTimings.get(request.url());
384
+ const duration = startTime ? Date.now() - startTime : null;
385
+ requests.push({
386
+ url: request.url(),
387
+ method: request.method(),
388
+ status: null,
389
+ resourceType: request.resourceType(),
390
+ duration,
391
+ });
392
+ });
393
+ try {
394
+ await page.goto(url, { waitUntil: 'networkidle', timeout: 30000 });
395
+ return requests;
396
+ }
397
+ catch (error) {
398
+ // Return what we captured even on error
399
+ return requests;
400
+ }
401
+ finally {
402
+ await page.close();
403
+ }
404
+ }
405
+ /**
406
+ * Run a Playwright test file
407
+ */
408
+ async runPlaywrightTest(testPath, options) {
409
+ const { exec } = await import('child_process');
410
+ const { promisify } = await import('util');
411
+ const execAsync = promisify(exec);
412
+ const args = ['npx', 'playwright', 'test', testPath];
413
+ if (options?.headed) {
414
+ args.push('--headed');
415
+ }
416
+ if (options?.browser) {
417
+ args.push('--project=' + options.browser);
418
+ }
419
+ if (options?.timeout) {
420
+ args.push('--timeout=' + options.timeout);
421
+ }
422
+ try {
423
+ const { stdout, stderr } = await execAsync(args.join(' '), {
424
+ timeout: options?.timeout || 120000,
425
+ });
426
+ return {
427
+ success: true,
428
+ output: stdout + (stderr ? '\n' + stderr : ''),
429
+ };
430
+ }
431
+ catch (error) {
432
+ return {
433
+ success: false,
434
+ output: error.stdout + (error.stderr ? '\n' + error.stderr : ''),
435
+ };
436
+ }
437
+ }
55
438
  }
56
439
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/tools/browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * AI Test Generator
3
+ *
4
+ * Automatically generates test cases for functions, classes, and modules.
5
+ * Supports multiple testing frameworks: Vitest, Jest, Mocha, pytest, Go test.
6
+ *
7
+ * @module tools/test-generator
8
+ * @since 0.4.0
9
+ */
10
+ export interface TestCase {
11
+ name: string;
12
+ description: string;
13
+ type: 'unit' | 'integration' | 'edge' | 'boundary' | 'error';
14
+ input?: any;
15
+ expectedOutput?: any;
16
+ assertion?: string;
17
+ }
18
+ export interface FunctionAnalysis {
19
+ name: string;
20
+ params: Array<{
21
+ name: string;
22
+ type?: string;
23
+ optional?: boolean;
24
+ }>;
25
+ returnType?: string;
26
+ isAsync: boolean;
27
+ isExported: boolean;
28
+ complexity: 'low' | 'medium' | 'high';
29
+ dependencies: string[];
30
+ sideEffects: string[];
31
+ }
32
+ export interface ClassAnalysis {
33
+ name: string;
34
+ methods: FunctionAnalysis[];
35
+ properties: Array<{
36
+ name: string;
37
+ type?: string;
38
+ visibility: 'public' | 'private' | 'protected';
39
+ }>;
40
+ constructorMethod?: FunctionAnalysis;
41
+ isExported: boolean;
42
+ }
43
+ export interface ModuleAnalysis {
44
+ filePath: string;
45
+ language: 'typescript' | 'javascript' | 'python' | 'go';
46
+ functions: FunctionAnalysis[];
47
+ classes: ClassAnalysis[];
48
+ exports: string[];
49
+ imports: Array<{
50
+ module: string;
51
+ imports: string[];
52
+ }>;
53
+ }
54
+ export interface GeneratedTest {
55
+ testFilePath: string;
56
+ framework: string;
57
+ content: string;
58
+ testCases: TestCase[];
59
+ coverage: {
60
+ functions: number;
61
+ branches: number;
62
+ lines: number;
63
+ };
64
+ }
65
+ export interface TestGeneratorConfig {
66
+ framework?: 'vitest' | 'jest' | 'mocha' | 'pytest' | 'go';
67
+ outputDir?: string;
68
+ includeEdgeCases?: boolean;
69
+ includeMocks?: boolean;
70
+ includeTypeChecks?: boolean;
71
+ maxTestsPerFunction?: number;
72
+ style?: 'describe-it' | 'test' | 'flat';
73
+ }
74
+ /**
75
+ * AI-powered test generator that analyzes code and generates comprehensive test suites
76
+ */
77
+ export declare class TestGenerator {
78
+ private workingDir;
79
+ private testDetector;
80
+ constructor(workingDir?: string);
81
+ /**
82
+ * Analyze a source file to extract testable components
83
+ */
84
+ analyzeFile(filePath: string): Promise<ModuleAnalysis>;
85
+ /**
86
+ * Analyze JavaScript/TypeScript code
87
+ */
88
+ private analyzeJSTS;
89
+ /**
90
+ * Analyze Python code
91
+ */
92
+ private analyzePython;
93
+ /**
94
+ * Analyze Go code
95
+ */
96
+ private analyzeGo;
97
+ /**
98
+ * Generate test cases for analyzed code
99
+ */
100
+ generateTests(analysis: ModuleAnalysis, config?: TestGeneratorConfig): Promise<GeneratedTest>;
101
+ /**
102
+ * Generate test cases for a function
103
+ */
104
+ private generateFunctionTests;
105
+ /**
106
+ * Generate test cases for a class
107
+ */
108
+ private generateClassTests;
109
+ /**
110
+ * Generate test file content based on framework
111
+ */
112
+ private generateTestFileContent;
113
+ /**
114
+ * Generate Vitest test content
115
+ */
116
+ private generateVitestContent;
117
+ /**
118
+ * Generate Jest test content
119
+ */
120
+ private generateJestContent;
121
+ /**
122
+ * Generate Mocha test content
123
+ */
124
+ private generateMochaContent;
125
+ /**
126
+ * Generate pytest test content
127
+ */
128
+ private generatePytestContent;
129
+ /**
130
+ * Generate Go test content
131
+ */
132
+ private generateGoTestContent;
133
+ private parseJSTSParams;
134
+ private parsePythonParams;
135
+ private parseGoParams;
136
+ private extractClassBody;
137
+ private estimateComplexity;
138
+ private detectDependencies;
139
+ private detectSideEffects;
140
+ private detectFramework;
141
+ private getRelativeImportPath;
142
+ private groupTestCases;
143
+ private generateDefaultArgs;
144
+ private generateInvalidArgs;
145
+ private generateTypeAssertion;
146
+ private generateEdgeCases;
147
+ private convertToPytestAssertion;
148
+ }
149
+ /**
150
+ * Write generated tests to file
151
+ */
152
+ export declare function writeTestFile(generatedTest: GeneratedTest): Promise<void>;
153
+ /**
154
+ * Quick function to generate and optionally write tests
155
+ */
156
+ export declare function generateTestsForFile(filePath: string, config?: TestGeneratorConfig, writeToFile?: boolean): Promise<GeneratedTest>;
157
+ //# sourceMappingURL=test-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-generator.d.ts","sourceRoot":"","sources":["../../src/tools/test-generator.ts"],"names":[],"mappings":"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"}