@theihtisham/ai-testgen 1.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 (149) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +383 -0
  3. package/dist/analyzers/analyzer.d.ts +10 -0
  4. package/dist/analyzers/analyzer.d.ts.map +1 -0
  5. package/dist/analyzers/analyzer.js +131 -0
  6. package/dist/analyzers/analyzer.js.map +1 -0
  7. package/dist/analyzers/go-analyzer.d.ts +3 -0
  8. package/dist/analyzers/go-analyzer.d.ts.map +1 -0
  9. package/dist/analyzers/go-analyzer.js +244 -0
  10. package/dist/analyzers/go-analyzer.js.map +1 -0
  11. package/dist/analyzers/index.d.ts +5 -0
  12. package/dist/analyzers/index.d.ts.map +1 -0
  13. package/dist/analyzers/index.js +15 -0
  14. package/dist/analyzers/index.js.map +1 -0
  15. package/dist/analyzers/js-ts-analyzer.d.ts +3 -0
  16. package/dist/analyzers/js-ts-analyzer.d.ts.map +1 -0
  17. package/dist/analyzers/js-ts-analyzer.js +299 -0
  18. package/dist/analyzers/js-ts-analyzer.js.map +1 -0
  19. package/dist/analyzers/python-analyzer.d.ts +3 -0
  20. package/dist/analyzers/python-analyzer.d.ts.map +1 -0
  21. package/dist/analyzers/python-analyzer.js +306 -0
  22. package/dist/analyzers/python-analyzer.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +381 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/config/defaults.d.ts +6 -0
  28. package/dist/config/defaults.d.ts.map +1 -0
  29. package/dist/config/defaults.js +80 -0
  30. package/dist/config/defaults.js.map +1 -0
  31. package/dist/config/index.d.ts +3 -0
  32. package/dist/config/index.d.ts.map +1 -0
  33. package/dist/config/index.js +14 -0
  34. package/dist/config/index.js.map +1 -0
  35. package/dist/config/loader.d.ts +6 -0
  36. package/dist/config/loader.d.ts.map +1 -0
  37. package/dist/config/loader.js +126 -0
  38. package/dist/config/loader.js.map +1 -0
  39. package/dist/coverage.d.ts +4 -0
  40. package/dist/coverage.d.ts.map +1 -0
  41. package/dist/coverage.js +108 -0
  42. package/dist/coverage.js.map +1 -0
  43. package/dist/generators/ai-generator.d.ts +4 -0
  44. package/dist/generators/ai-generator.d.ts.map +1 -0
  45. package/dist/generators/ai-generator.js +175 -0
  46. package/dist/generators/ai-generator.js.map +1 -0
  47. package/dist/generators/generator.d.ts +4 -0
  48. package/dist/generators/generator.d.ts.map +1 -0
  49. package/dist/generators/generator.js +121 -0
  50. package/dist/generators/generator.js.map +1 -0
  51. package/dist/generators/go-generator.d.ts +3 -0
  52. package/dist/generators/go-generator.d.ts.map +1 -0
  53. package/dist/generators/go-generator.js +175 -0
  54. package/dist/generators/go-generator.js.map +1 -0
  55. package/dist/generators/index.d.ts +6 -0
  56. package/dist/generators/index.d.ts.map +1 -0
  57. package/dist/generators/index.js +16 -0
  58. package/dist/generators/index.js.map +1 -0
  59. package/dist/generators/js-ts-generator.d.ts +3 -0
  60. package/dist/generators/js-ts-generator.d.ts.map +1 -0
  61. package/dist/generators/js-ts-generator.js +331 -0
  62. package/dist/generators/js-ts-generator.js.map +1 -0
  63. package/dist/generators/python-generator.d.ts +3 -0
  64. package/dist/generators/python-generator.d.ts.map +1 -0
  65. package/dist/generators/python-generator.js +180 -0
  66. package/dist/generators/python-generator.js.map +1 -0
  67. package/dist/incremental.d.ts +16 -0
  68. package/dist/incremental.d.ts.map +1 -0
  69. package/dist/incremental.js +146 -0
  70. package/dist/incremental.js.map +1 -0
  71. package/dist/index.d.ts +9 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +44 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/mutation/index.d.ts +2 -0
  76. package/dist/mutation/index.d.ts.map +1 -0
  77. package/dist/mutation/index.js +9 -0
  78. package/dist/mutation/index.js.map +1 -0
  79. package/dist/mutation/mutator.d.ts +6 -0
  80. package/dist/mutation/mutator.d.ts.map +1 -0
  81. package/dist/mutation/mutator.js +237 -0
  82. package/dist/mutation/mutator.js.map +1 -0
  83. package/dist/types.d.ts +199 -0
  84. package/dist/types.d.ts.map +1 -0
  85. package/dist/types.js +4 -0
  86. package/dist/types.js.map +1 -0
  87. package/dist/utils/file.d.ts +10 -0
  88. package/dist/utils/file.d.ts.map +1 -0
  89. package/dist/utils/file.js +108 -0
  90. package/dist/utils/file.js.map +1 -0
  91. package/dist/utils/index.d.ts +4 -0
  92. package/dist/utils/index.d.ts.map +1 -0
  93. package/dist/utils/index.js +24 -0
  94. package/dist/utils/index.js.map +1 -0
  95. package/dist/utils/language.d.ts +8 -0
  96. package/dist/utils/language.d.ts.map +1 -0
  97. package/dist/utils/language.js +137 -0
  98. package/dist/utils/language.js.map +1 -0
  99. package/dist/utils/logger.d.ts +13 -0
  100. package/dist/utils/logger.d.ts.map +1 -0
  101. package/dist/utils/logger.js +57 -0
  102. package/dist/utils/logger.js.map +1 -0
  103. package/dist/watcher/index.d.ts +2 -0
  104. package/dist/watcher/index.d.ts.map +1 -0
  105. package/dist/watcher/index.js +6 -0
  106. package/dist/watcher/index.js.map +1 -0
  107. package/dist/watcher/watcher.d.ts +19 -0
  108. package/dist/watcher/watcher.d.ts.map +1 -0
  109. package/dist/watcher/watcher.js +122 -0
  110. package/dist/watcher/watcher.js.map +1 -0
  111. package/package.json +63 -0
  112. package/src/analyzers/analyzer.ts +180 -0
  113. package/src/analyzers/go-analyzer.ts +235 -0
  114. package/src/analyzers/index.ts +4 -0
  115. package/src/analyzers/js-ts-analyzer.ts +324 -0
  116. package/src/analyzers/python-analyzer.ts +306 -0
  117. package/src/cli.ts +416 -0
  118. package/src/config/defaults.ts +81 -0
  119. package/src/config/index.ts +2 -0
  120. package/src/config/loader.ts +114 -0
  121. package/src/coverage.ts +128 -0
  122. package/src/generators/ai-generator.ts +170 -0
  123. package/src/generators/generator.ts +117 -0
  124. package/src/generators/go-generator.ts +183 -0
  125. package/src/generators/index.ts +5 -0
  126. package/src/generators/js-ts-generator.ts +379 -0
  127. package/src/generators/python-generator.ts +201 -0
  128. package/src/incremental.ts +131 -0
  129. package/src/index.ts +8 -0
  130. package/src/mutation/index.ts +1 -0
  131. package/src/mutation/mutator.ts +314 -0
  132. package/src/types.ts +240 -0
  133. package/src/utils/file.ts +73 -0
  134. package/src/utils/index.ts +3 -0
  135. package/src/utils/language.ts +114 -0
  136. package/src/utils/logger.ts +61 -0
  137. package/src/watcher/index.ts +1 -0
  138. package/src/watcher/watcher.ts +103 -0
  139. package/tests/analyzer.test.ts +429 -0
  140. package/tests/config.test.ts +171 -0
  141. package/tests/coverage.test.ts +197 -0
  142. package/tests/file-utils.test.ts +121 -0
  143. package/tests/generators.test.ts +383 -0
  144. package/tests/incremental.test.ts +108 -0
  145. package/tests/language.test.ts +90 -0
  146. package/tests/mutation.test.ts +286 -0
  147. package/tests/watcher.test.ts +35 -0
  148. package/tsconfig.json +26 -0
  149. package/vitest.config.ts +25 -0
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.findConfig = findConfig;
37
+ exports.loadConfig = loadConfig;
38
+ exports.resolveConfig = resolveConfig;
39
+ exports.createSampleConfig = createSampleConfig;
40
+ const fs = __importStar(require("fs"));
41
+ const path = __importStar(require("path"));
42
+ const yaml = __importStar(require("js-yaml"));
43
+ const defaults_js_1 = require("./defaults.js");
44
+ const CONFIG_FILENAMES = ['.aitestgen.yml', '.aitestgen.yaml', '.aitestgen.json'];
45
+ function findConfig(startDir) {
46
+ let current = path.resolve(startDir);
47
+ const root = path.parse(current).root;
48
+ while (current !== root) {
49
+ for (const filename of CONFIG_FILENAMES) {
50
+ const configPath = path.join(current, filename);
51
+ if (fs.existsSync(configPath)) {
52
+ return configPath;
53
+ }
54
+ }
55
+ current = path.dirname(current);
56
+ }
57
+ return null;
58
+ }
59
+ function loadConfig(configPath) {
60
+ const ext = path.extname(configPath);
61
+ const raw = fs.readFileSync(configPath, 'utf-8');
62
+ let parsed;
63
+ if (ext === '.json') {
64
+ parsed = JSON.parse(raw);
65
+ }
66
+ else {
67
+ parsed = yaml.load(raw);
68
+ }
69
+ return deepMerge(defaults_js_1.DEFAULT_CONFIG, parsed);
70
+ }
71
+ function resolveConfig(cliOverrides, projectDir) {
72
+ const configPath = cliOverrides['config'];
73
+ const foundPath = configPath ?? findConfig(projectDir);
74
+ const base = foundPath ? loadConfig(foundPath) : { ...defaults_js_1.DEFAULT_CONFIG };
75
+ return deepMerge(base, cliOverrides);
76
+ }
77
+ function deepMerge(target, source) {
78
+ const result = { ...target };
79
+ for (const key of Object.keys(source)) {
80
+ const sourceVal = source[key];
81
+ const targetVal = target[key];
82
+ if (isPlainObject(sourceVal) &&
83
+ isPlainObject(targetVal)) {
84
+ result[key] = deepMerge(targetVal, sourceVal);
85
+ }
86
+ else if (sourceVal !== undefined) {
87
+ result[key] = sourceVal;
88
+ }
89
+ }
90
+ return result;
91
+ }
92
+ function isPlainObject(value) {
93
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
94
+ }
95
+ function createSampleConfig(outputPath) {
96
+ const sample = {
97
+ version: '1.0.0',
98
+ language: 'auto',
99
+ framework: 'auto',
100
+ outputDir: '__tests__',
101
+ coverage: { target: 90, strict: false },
102
+ ai: {
103
+ enabled: true,
104
+ provider: 'openai',
105
+ model: 'gpt-4o',
106
+ apiKeyEnv: 'OPENAI_API_KEY',
107
+ maxTokens: 4096,
108
+ temperature: 0.2,
109
+ privacyMode: true,
110
+ },
111
+ generation: {
112
+ unitTests: true,
113
+ integrationTests: true,
114
+ edgeCaseTests: true,
115
+ mockGeneration: true,
116
+ mutationTesting: false,
117
+ maxTestsPerFunction: 10,
118
+ includeComments: true,
119
+ },
120
+ exclude: ['node_modules/**', 'dist/**', 'coverage/**'],
121
+ include: ['src/**/*.{ts,tsx,js,jsx}'],
122
+ };
123
+ const content = yaml.dump(sample, { indent: 2, lineWidth: 100 });
124
+ fs.writeFileSync(outputPath, content, 'utf-8');
125
+ }
126
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { SourceAnalysis, CoveragePrediction, TestSuite } from './types.js';
2
+ export declare function predictCoverage(analysis: SourceAnalysis, suite: TestSuite): CoveragePrediction;
3
+ export declare function formatCoverageReport(prediction: CoveragePrediction): string;
4
+ //# sourceMappingURL=coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,SAAS,EACV,MAAM,YAAY,CAAC;AAEpB,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,SAAS,GAAG,kBAAkB,CA4F9F;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,kBAAkB,GAAG,MAAM,CA2B3E"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.predictCoverage = predictCoverage;
4
+ exports.formatCoverageReport = formatCoverageReport;
5
+ function predictCoverage(analysis, suite) {
6
+ const uncoveredPaths = [];
7
+ const suggestions = [];
8
+ const testedNames = new Set(suite.testCases.map((tc) => tc.name.split(' ')[0] ?? ''));
9
+ // Check function coverage
10
+ let coveredFunctions = 0;
11
+ for (const fn of analysis.functions) {
12
+ if (fn.isExported) {
13
+ const isTested = testedNames.has(fn.name);
14
+ if (isTested) {
15
+ coveredFunctions++;
16
+ }
17
+ else {
18
+ uncoveredPaths.push(`Function ${fn.name} is not tested`);
19
+ suggestions.push(`Add tests for exported function: ${fn.name}`);
20
+ }
21
+ }
22
+ }
23
+ // Check class method coverage
24
+ let coveredMethods = 0;
25
+ let totalMethods = 0;
26
+ for (const cls of analysis.classes) {
27
+ for (const method of cls.methods) {
28
+ totalMethods++;
29
+ const isTested = testedNames.has(method.name) || Array.from(testedNames).some((n) => n.includes(method.name));
30
+ if (isTested) {
31
+ coveredMethods++;
32
+ }
33
+ else {
34
+ uncoveredPaths.push(`${cls.name}.${method.name} is not tested`);
35
+ suggestions.push(`Add tests for ${cls.name}.${method.name} method`);
36
+ }
37
+ }
38
+ }
39
+ // Check for uncovered error paths
40
+ for (const fn of analysis.functions) {
41
+ if (fn.throws.length > 0) {
42
+ const hasErrorTest = suite.testCases.some((tc) => tc.name.includes(fn.name) && (tc.tags.includes('error') || tc.tags.includes('edge-case')));
43
+ if (!hasErrorTest) {
44
+ uncoveredPaths.push(`${fn.name} error paths not tested`);
45
+ suggestions.push(`Add error path tests for ${fn.name} (throws: ${fn.throws.join(', ')})`);
46
+ }
47
+ }
48
+ }
49
+ // Check for untested async error paths
50
+ for (const fn of analysis.functions) {
51
+ if (fn.isAsync) {
52
+ const hasAsyncErrorTest = suite.testCases.some((tc) => tc.name.includes(fn.name) && tc.tags.includes('async'));
53
+ if (!hasAsyncErrorTest) {
54
+ suggestions.push(`Add async rejection test for ${fn.name}`);
55
+ }
56
+ }
57
+ }
58
+ // Check for untested optional params
59
+ for (const fn of analysis.functions) {
60
+ const optionalParams = fn.params.filter((p) => p.optional);
61
+ if (optionalParams.length > 0) {
62
+ const hasOptionalTest = suite.testCases.some((tc) => tc.name.includes(fn.name) && tc.name.includes('undefined'));
63
+ if (!hasOptionalTest) {
64
+ suggestions.push(`Test ${fn.name} without optional params: ${optionalParams.map((p) => p.name).join(', ')}`);
65
+ }
66
+ }
67
+ }
68
+ // Calculate estimates
69
+ const totalExported = analysis.functions.filter((f) => f.isExported).length + totalMethods;
70
+ const covered = coveredFunctions + coveredMethods;
71
+ const functionCoverage = totalExported > 0 ? Math.round((covered / totalExported) * 100) : 100;
72
+ const lineCoverage = Math.min(functionCoverage + 10, suite.coverageEstimate);
73
+ const branchCoverage = Math.max(functionCoverage - 10, 0);
74
+ return {
75
+ filePath: analysis.filePath,
76
+ estimatedLineCoverage: lineCoverage,
77
+ estimatedBranchCoverage: branchCoverage,
78
+ estimatedFunctionCoverage: functionCoverage,
79
+ uncoveredPaths: uncoveredPaths.slice(0, 10),
80
+ suggestions: suggestions.slice(0, 10),
81
+ };
82
+ }
83
+ function formatCoverageReport(prediction) {
84
+ const lines = [];
85
+ lines.push('');
86
+ lines.push(` Coverage Prediction: ${prediction.filePath}`);
87
+ lines.push(' ----------------------------------------');
88
+ lines.push(` Line coverage: ~${prediction.estimatedLineCoverage}%`);
89
+ lines.push(` Branch coverage: ~${prediction.estimatedBranchCoverage}%`);
90
+ lines.push(` Function coverage: ~${prediction.estimatedFunctionCoverage}%`);
91
+ if (prediction.uncoveredPaths.length > 0) {
92
+ lines.push('');
93
+ lines.push(' Uncovered paths:');
94
+ for (const path of prediction.uncoveredPaths) {
95
+ lines.push(` - ${path}`);
96
+ }
97
+ }
98
+ if (prediction.suggestions.length > 0) {
99
+ lines.push('');
100
+ lines.push(' Suggestions:');
101
+ for (const suggestion of prediction.suggestions) {
102
+ lines.push(` + ${suggestion}`);
103
+ }
104
+ }
105
+ lines.push('');
106
+ return lines.join('\n');
107
+ }
108
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { SourceAnalysis, TestSuite, TestFramework, TestGenConfig } from '../types.js';
2
+ export declare function generateWithAI(analysis: SourceAnalysis, framework: TestFramework, config: TestGenConfig): Promise<string>;
3
+ export declare function buildAISuite(generatedCode: string, analysis: SourceAnalysis, framework: TestFramework): TestSuite;
4
+ //# sourceMappingURL=ai-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-generator.d.ts","sourceRoot":"","sources":["../../src/generators/ai-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,SAAS,EACT,aAAa,EACb,aAAa,EACd,MAAM,aAAa,CAAC;AAGrB,wBAAsB,cAAc,CAClC,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,aAAa,EACxB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,MAAM,CAAC,CAwCjB;AAkGD,wBAAgB,YAAY,CAC1B,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,aAAa,GACvB,SAAS,CAaX"}
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.generateWithAI = generateWithAI;
40
+ exports.buildAISuite = buildAISuite;
41
+ const fs = __importStar(require("fs"));
42
+ const openai_1 = __importDefault(require("openai"));
43
+ const analyzer_js_1 = require("../analyzers/analyzer.js");
44
+ async function generateWithAI(analysis, framework, config) {
45
+ if (!config.ai.enabled || config.ai.provider === 'none') {
46
+ throw new Error('AI generation is not enabled in configuration');
47
+ }
48
+ const apiKey = process.env[config.ai.apiKeyEnv];
49
+ if (!apiKey) {
50
+ throw new Error(`AI API key not found. Set the ${config.ai.apiKeyEnv} environment variable.`);
51
+ }
52
+ const client = new openai_1.default({ apiKey, baseURL: getBaseURL(config) });
53
+ const prompt = buildPrompt(analysis, framework, config);
54
+ const response = await client.chat.completions.create({
55
+ model: config.ai.model,
56
+ messages: [
57
+ {
58
+ role: 'system',
59
+ content: getSystemPrompt(framework),
60
+ },
61
+ {
62
+ role: 'user',
63
+ content: prompt,
64
+ },
65
+ ],
66
+ max_tokens: config.ai.maxTokens,
67
+ temperature: config.ai.temperature,
68
+ });
69
+ const content = response.choices[0]?.message?.content;
70
+ if (!content) {
71
+ throw new Error('AI returned empty response');
72
+ }
73
+ // Extract code from markdown code blocks if present
74
+ const codeBlockMatch = content.match(/```(?:typescript|javascript|python|go|tsx|jsx)?\n([\s\S]*?)```/);
75
+ return codeBlockMatch?.[1]?.trim() ?? content.trim();
76
+ }
77
+ function getBaseURL(config) {
78
+ if (config.ai.provider === 'openai')
79
+ return undefined; // uses default
80
+ if (config.ai.provider === 'anthropic')
81
+ return 'https://api.anthropic.com/v1';
82
+ return undefined;
83
+ }
84
+ function getSystemPrompt(framework) {
85
+ const frameworkName = framework === 'go-test' ? 'Go testing' : framework;
86
+ return `You are an expert test engineer. Generate comprehensive, well-structured test suites using ${frameworkName}.
87
+ Follow these rules:
88
+ - Use the appropriate testing patterns and best practices for ${frameworkName}
89
+ - Include edge cases: null/undefined/nil, empty inputs, boundary values
90
+ - Mock external dependencies properly
91
+ - Include descriptive test names and comments
92
+ - Handle both happy path and error cases
93
+ - Return ONLY the test code, no explanations outside code comments`;
94
+ }
95
+ function buildPrompt(analysis, framework, config) {
96
+ const parts = [];
97
+ parts.push(`Generate a complete test suite for the following ${analysis.language} source file.`);
98
+ parts.push(`Use the ${framework} testing framework.`);
99
+ parts.push('');
100
+ if (config.ai.privacyMode) {
101
+ // Send only analysis metadata, not full source
102
+ parts.push('## Source Code Analysis');
103
+ parts.push(`File: ${analysis.filePath}`);
104
+ parts.push(`Language: ${analysis.language}`);
105
+ parts.push(`Lines of code: ${analysis.linesOfCode}`);
106
+ parts.push('');
107
+ parts.push('## Exported Functions');
108
+ for (const fn of analysis.functions.filter((f) => f.isExported)) {
109
+ const params = fn.params.map((p) => `${p.name}${p.type ? ': ' + p.type : ''}`).join(', ');
110
+ parts.push(`- ${fn.name}(${params})${fn.returnType ? ': ' + fn.returnType : ''}${fn.isAsync ? ' [async]' : ''}`);
111
+ if (fn.throws.length > 0) {
112
+ parts.push(` Throws: ${fn.throws.join(', ')}`);
113
+ }
114
+ }
115
+ parts.push('');
116
+ parts.push('## Classes');
117
+ for (const cls of analysis.classes) {
118
+ parts.push(`- ${cls.name}${cls.extends ? ` extends ${cls.extends}` : ''}`);
119
+ for (const method of cls.methods) {
120
+ const params = method.params.map((p) => `${p.name}${p.type ? ': ' + p.type : ''}`).join(', ');
121
+ parts.push(` - ${method.name}(${params})${method.returnType ? ': ' + method.returnType : ''}`);
122
+ }
123
+ }
124
+ parts.push('');
125
+ parts.push('## Interfaces');
126
+ for (const iface of analysis.interfaces) {
127
+ parts.push(`- ${iface.name}`);
128
+ for (const prop of iface.properties) {
129
+ parts.push(` - ${prop.name}${prop.type ? ': ' + prop.type : ''}${prop.optional ? '?' : ''}`);
130
+ }
131
+ }
132
+ parts.push('');
133
+ parts.push('## Imports');
134
+ for (const imp of analysis.imports) {
135
+ parts.push(`- ${imp.modulePath}: ${imp.namedImports.join(', ') || 'default'}`);
136
+ }
137
+ parts.push('');
138
+ parts.push('## Edge Cases to Cover');
139
+ const edgeCases = analysis.functions.flatMap((fn) => (0, analyzer_js_1.detectEdgeCases)(fn)).slice(0, 10);
140
+ for (const ec of edgeCases) {
141
+ parts.push(`- ${ec.name}: ${ec.expectedBehavior}`);
142
+ }
143
+ }
144
+ else {
145
+ // Send full source code (not recommended for proprietary code)
146
+ parts.push('## Source Code');
147
+ parts.push('```' + analysis.language);
148
+ try {
149
+ const source = fs.readFileSync(analysis.filePath, 'utf-8');
150
+ parts.push(source);
151
+ }
152
+ catch {
153
+ parts.push('(Could not read source file)');
154
+ }
155
+ parts.push('```');
156
+ }
157
+ parts.push('');
158
+ parts.push('Generate tests that achieve at least 90% code coverage.');
159
+ return parts.join('\n');
160
+ }
161
+ function buildAISuite(generatedCode, analysis, framework) {
162
+ return {
163
+ filePath: '',
164
+ sourceFilePath: analysis.filePath,
165
+ language: analysis.language,
166
+ framework,
167
+ testCases: [],
168
+ mocks: [],
169
+ imports: [generatedCode],
170
+ setupCode: '',
171
+ teardownCode: '',
172
+ coverageEstimate: 90, // AI-generated tests target 90%+
173
+ };
174
+ }
175
+ //# sourceMappingURL=ai-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-generator.js","sourceRoot":"","sources":["../../src/generators/ai-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { SourceAnalysis, TestFramework, TestGenConfig, GenerationResult, CLIOptions } from '../types.js';
2
+ export declare function generateTestSuite(analysis: SourceAnalysis, framework: TestFramework, config: TestGenConfig, options: CLIOptions): Promise<GenerationResult>;
3
+ export declare function formatResults(results: GenerationResult[]): string;
4
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/generators/generator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EAEd,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,UAAU,EACX,MAAM,aAAa,CAAC;AASrB,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,aAAa,EACxB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,gBAAgB,CAAC,CA2C3B;AAwBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CA4BjE"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.generateTestSuite = generateTestSuite;
37
+ exports.formatResults = formatResults;
38
+ const js_ts_generator_js_1 = require("./js-ts-generator.js");
39
+ const python_generator_js_1 = require("./python-generator.js");
40
+ const go_generator_js_1 = require("./go-generator.js");
41
+ const ai_generator_js_1 = require("./ai-generator.js");
42
+ const language_js_1 = require("../utils/language.js");
43
+ const file_js_1 = require("../utils/file.js");
44
+ const path = __importStar(require("path"));
45
+ async function generateTestSuite(analysis, framework, config, options) {
46
+ const startTime = Date.now();
47
+ let suite;
48
+ let usedAI = false;
49
+ // Try AI generation first if enabled
50
+ if (config.ai.enabled && config.ai.provider !== 'none' && !options.noAI) {
51
+ try {
52
+ const generatedCode = await (0, ai_generator_js_1.generateWithAI)(analysis, framework, config);
53
+ suite = (0, ai_generator_js_1.buildAISuite)(generatedCode, analysis, framework);
54
+ usedAI = true;
55
+ }
56
+ catch (err) {
57
+ const errorMessage = err instanceof Error ? err.message : String(err);
58
+ console.warn(`AI generation failed, falling back to AST-based: ${errorMessage}`);
59
+ suite = generateLocalSuite(analysis, framework, config);
60
+ }
61
+ }
62
+ else {
63
+ suite = generateLocalSuite(analysis, framework, config);
64
+ }
65
+ // Determine output path
66
+ const testFilePath = (0, language_js_1.buildTestFilePath)(analysis.filePath, options.output ?? config.outputDir, analysis.language, framework);
67
+ suite.filePath = testFilePath;
68
+ // Get the final code
69
+ const code = suite.imports[0] ?? '';
70
+ if (!options.dryRun) {
71
+ (0, file_js_1.writeFile)(testFilePath, code);
72
+ }
73
+ return {
74
+ sourceFile: analysis.filePath,
75
+ testFile: testFilePath,
76
+ testSuite: suite,
77
+ duration: Date.now() - startTime,
78
+ usedAI,
79
+ };
80
+ }
81
+ function generateLocalSuite(analysis, framework, config) {
82
+ const maxTests = config.generation.maxTestsPerFunction;
83
+ switch (analysis.language) {
84
+ case 'typescript':
85
+ case 'javascript':
86
+ return (0, js_ts_generator_js_1.generateJsTsTestSuite)(analysis, framework, maxTests);
87
+ case 'python':
88
+ return (0, python_generator_js_1.generatePythonTestSuite)(analysis, framework, maxTests);
89
+ case 'go':
90
+ return (0, go_generator_js_1.generateGoTestSuite)(analysis, framework, maxTests);
91
+ case 'rust':
92
+ throw new Error('Rust test generation requires AI mode. Enable AI in your configuration.');
93
+ default:
94
+ throw new Error(`Unsupported language: ${analysis.language}`);
95
+ }
96
+ }
97
+ function formatResults(results) {
98
+ const lines = [];
99
+ let totalTests = 0;
100
+ let totalDuration = 0;
101
+ let totalCoverage = 0;
102
+ for (const result of results) {
103
+ totalTests += result.testSuite.testCases.length;
104
+ totalDuration += result.duration;
105
+ totalCoverage += result.testSuite.coverageEstimate;
106
+ }
107
+ const avgCoverage = results.length > 0 ? Math.round(totalCoverage / results.length) : 0;
108
+ lines.push('');
109
+ lines.push(` Files analyzed: ${results.length}`);
110
+ lines.push(` Tests generated: ${totalTests}`);
111
+ lines.push(` Avg coverage estimate: ${avgCoverage}%`);
112
+ lines.push(` Total time: ${totalDuration}ms`);
113
+ lines.push(` AI assisted: ${results.some((r) => r.usedAI) ? 'Yes' : 'No'}`);
114
+ lines.push('');
115
+ for (const result of results) {
116
+ lines.push(` ${path.basename(result.testFile)}`);
117
+ lines.push(` ${result.testSuite.testCases.length} tests | ~${result.testSuite.coverageEstimate}% coverage | ${result.duration}ms`);
118
+ }
119
+ return lines.join('\n');
120
+ }
121
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/generators/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { SourceAnalysis, TestSuite, TestFramework } from '../types.js';
2
+ export declare function generateGoTestSuite(analysis: SourceAnalysis, _framework: TestFramework, maxTestsPerFunction: number): TestSuite;
3
+ //# sourceMappingURL=go-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go-generator.d.ts","sourceRoot":"","sources":["../../src/generators/go-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,SAAS,EAET,aAAa,EAEd,MAAM,aAAa,CAAC;AAGrB,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,cAAc,EACxB,UAAU,EAAE,aAAa,EACzB,mBAAmB,EAAE,MAAM,GAC1B,SAAS,CA6BX"}