@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,244 @@
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.analyzeGoSource = analyzeGoSource;
37
+ const fs = __importStar(require("fs"));
38
+ function analyzeGoSource(filePath) {
39
+ const content = fs.readFileSync(filePath, 'utf-8');
40
+ const lines = content.split('\n');
41
+ return {
42
+ filePath,
43
+ language: 'go',
44
+ functions: extractGoFunctions(content),
45
+ classes: [],
46
+ interfaces: extractGoInterfaces(content),
47
+ exports: extractGoExports(content),
48
+ imports: extractGoImports(content),
49
+ dependencies: extractGoImports(content).map((imp) => imp.modulePath),
50
+ linesOfCode: lines.length,
51
+ cyclomaticComplexity: calculateGoComplexity(content),
52
+ };
53
+ }
54
+ function extractGoFunctions(content) {
55
+ const functions = [];
56
+ // Match: func [receiver] name(params) [returnType] {
57
+ const funcRegex = /^func\s+(?:\(\w+\s+\*?\*?\w+\)\s+)?(\w+)\s*\(([^)]*)\)\s*(.*?)\s*\{/gm;
58
+ let match;
59
+ while ((match = funcRegex.exec(content)) !== null) {
60
+ const name = match[1];
61
+ const paramsStr = match[2] ?? '';
62
+ const returnTypeRaw = match[3]?.trim() ?? '';
63
+ // Strip surrounding parens from return type if present
64
+ const returnTypes = returnTypeRaw
65
+ ? (returnTypeRaw.startsWith('(') && returnTypeRaw.endsWith(')')
66
+ ? returnTypeRaw.slice(1, -1).trim()
67
+ : returnTypeRaw)
68
+ : null;
69
+ const params = parseGoParams(paramsStr);
70
+ const startLine = content.substring(0, match.index).split('\n').length;
71
+ const body = extractGoBody(content, match.index);
72
+ const endLine = startLine + body.split('\n').length - 1;
73
+ const isExported = name[0] === name[0].toUpperCase();
74
+ functions.push({
75
+ name,
76
+ isAsync: false,
77
+ isExported,
78
+ params,
79
+ returnType: returnTypes,
80
+ throws: [],
81
+ complexity: calculateGoComplexity(body),
82
+ hasSideEffects: detectGoSideEffects(body),
83
+ startLine,
84
+ endLine,
85
+ });
86
+ }
87
+ return functions;
88
+ }
89
+ function parseGoParams(paramsStr) {
90
+ if (!paramsStr.trim())
91
+ return [];
92
+ const params = [];
93
+ const parts = paramsStr.split(',');
94
+ let pendingNames = [];
95
+ let pendingType = null;
96
+ for (const part of parts) {
97
+ const trimmed = part.trim();
98
+ if (!trimmed)
99
+ continue;
100
+ const tokens = trimmed.split(/\s+/);
101
+ if (tokens.length === 1) {
102
+ pendingNames.push(tokens[0]);
103
+ }
104
+ else {
105
+ pendingNames.push(tokens[0]);
106
+ pendingType = tokens.slice(1).join(' ');
107
+ for (const name of pendingNames) {
108
+ params.push({ name, type: pendingType, optional: false, defaultValue: null });
109
+ }
110
+ pendingNames = [];
111
+ pendingType = null;
112
+ }
113
+ }
114
+ if (pendingNames.length > 0) {
115
+ for (const name of pendingNames) {
116
+ params.push({ name, type: pendingType, optional: false, defaultValue: null });
117
+ }
118
+ }
119
+ return params;
120
+ }
121
+ function extractGoBody(content, startIndex) {
122
+ const afterMatch = content.substring(startIndex);
123
+ let braceCount = 0;
124
+ let bodyStart = -1;
125
+ for (let i = 0; i < afterMatch.length; i++) {
126
+ if (afterMatch[i] === '{') {
127
+ if (braceCount === 0)
128
+ bodyStart = i + 1;
129
+ braceCount++;
130
+ }
131
+ else if (afterMatch[i] === '}') {
132
+ braceCount--;
133
+ if (braceCount === 0) {
134
+ return afterMatch.substring(bodyStart > 0 ? bodyStart : 0, i);
135
+ }
136
+ }
137
+ }
138
+ return afterMatch.substring(bodyStart > 0 ? bodyStart : 0);
139
+ }
140
+ function extractGoInterfaces(content) {
141
+ const interfaces = [];
142
+ const ifaceRegex = /type\s+(\w+)\s+interface\s*\{([^}]*)\}/g;
143
+ let match;
144
+ while ((match = ifaceRegex.exec(content)) !== null) {
145
+ const name = match[1];
146
+ const body = match[2] ?? '';
147
+ const methods = [];
148
+ const methodRegex = /(\w+)\s*\(([^)]*)\)(?:\s*\(([^)]*)\))?/g;
149
+ let m;
150
+ while ((m = methodRegex.exec(body)) !== null) {
151
+ methods.push({
152
+ name: m[1],
153
+ params: parseGoParams(m[2] ?? ''),
154
+ returnType: m[3]?.trim() ?? null,
155
+ });
156
+ }
157
+ interfaces.push({
158
+ name,
159
+ isExported: name[0] === name[0].toUpperCase(),
160
+ properties: [],
161
+ methods,
162
+ });
163
+ }
164
+ return interfaces;
165
+ }
166
+ function extractGoExports(content) {
167
+ const exports = [];
168
+ const funcRegex = /^func\s+(?:\(\w+\s+\*?\w+\)\s+)?(\w+)/gm;
169
+ let match;
170
+ while ((match = funcRegex.exec(content)) !== null) {
171
+ const name = match[1];
172
+ if (name[0] === name[0].toUpperCase()) {
173
+ exports.push({ name, type: 'function', filePath: '' });
174
+ }
175
+ }
176
+ return exports;
177
+ }
178
+ function extractGoImports(content) {
179
+ const imports = [];
180
+ const singleImport = /^import\s+"([^"]+)"/gm;
181
+ let match;
182
+ while ((match = singleImport.exec(content)) !== null) {
183
+ imports.push({
184
+ modulePath: match[1],
185
+ namedImports: [],
186
+ defaultImport: null,
187
+ isTypeOnly: false,
188
+ });
189
+ }
190
+ const multiImport = /import\s*\(([^)]+)\)/gs;
191
+ while ((match = multiImport.exec(content)) !== null) {
192
+ const block = match[1] ?? '';
193
+ const blockLines = block.split('\n');
194
+ for (const line of blockLines) {
195
+ const trimmed = line.trim();
196
+ if (!trimmed || trimmed.startsWith('//'))
197
+ continue;
198
+ const importMatch = trimmed.match(/"([^"]+)"/);
199
+ if (importMatch) {
200
+ imports.push({
201
+ modulePath: importMatch[1],
202
+ namedImports: [],
203
+ defaultImport: null,
204
+ isTypeOnly: false,
205
+ });
206
+ }
207
+ }
208
+ }
209
+ return imports;
210
+ }
211
+ function calculateGoComplexity(code) {
212
+ let complexity = 1;
213
+ const patterns = [
214
+ /\bif\b/g,
215
+ /\belse\b/g,
216
+ /\bfor\b/g,
217
+ /\bcase\b/g,
218
+ /\bswitch\b/g,
219
+ /\bselect\b/g,
220
+ /&&/g,
221
+ /\|\|/g,
222
+ /\brange\b/g,
223
+ ];
224
+ for (const pattern of patterns) {
225
+ const matches = code.match(pattern);
226
+ if (matches)
227
+ complexity += matches.length;
228
+ }
229
+ return complexity;
230
+ }
231
+ function detectGoSideEffects(code) {
232
+ const patterns = [
233
+ /\bfmt\.\w+\(/,
234
+ /\bos\.\w+/,
235
+ /\bio\.\w+/,
236
+ /\bhttp\.\w+/,
237
+ /\brand\.\w+/,
238
+ /\btime\.\w+/,
239
+ /\blog\.\w+/,
240
+ /\bappend\(/,
241
+ ];
242
+ return patterns.some((p) => p.test(code));
243
+ }
244
+ //# sourceMappingURL=go-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go-analyzer.js","sourceRoot":"","sources":["../../src/analyzers/go-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { analyzeSource, detectEdgeCases, detectMocks, buildDependencyGraph } from './analyzer.js';
2
+ export { analyzeTsSource } from './js-ts-analyzer.js';
3
+ export { analyzePythonSource } from './python-analyzer.js';
4
+ export { analyzeGoSource } from './go-analyzer.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAClG,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyzeGoSource = exports.analyzePythonSource = exports.analyzeTsSource = exports.buildDependencyGraph = exports.detectMocks = exports.detectEdgeCases = exports.analyzeSource = void 0;
4
+ var analyzer_js_1 = require("./analyzer.js");
5
+ Object.defineProperty(exports, "analyzeSource", { enumerable: true, get: function () { return analyzer_js_1.analyzeSource; } });
6
+ Object.defineProperty(exports, "detectEdgeCases", { enumerable: true, get: function () { return analyzer_js_1.detectEdgeCases; } });
7
+ Object.defineProperty(exports, "detectMocks", { enumerable: true, get: function () { return analyzer_js_1.detectMocks; } });
8
+ Object.defineProperty(exports, "buildDependencyGraph", { enumerable: true, get: function () { return analyzer_js_1.buildDependencyGraph; } });
9
+ var js_ts_analyzer_js_1 = require("./js-ts-analyzer.js");
10
+ Object.defineProperty(exports, "analyzeTsSource", { enumerable: true, get: function () { return js_ts_analyzer_js_1.analyzeTsSource; } });
11
+ var python_analyzer_js_1 = require("./python-analyzer.js");
12
+ Object.defineProperty(exports, "analyzePythonSource", { enumerable: true, get: function () { return python_analyzer_js_1.analyzePythonSource; } });
13
+ var go_analyzer_js_1 = require("./go-analyzer.js");
14
+ Object.defineProperty(exports, "analyzeGoSource", { enumerable: true, get: function () { return go_analyzer_js_1.analyzeGoSource; } });
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":";;;AAAA,6CAAkG;AAAzF,4GAAA,aAAa,OAAA;AAAE,8GAAA,eAAe,OAAA;AAAE,0GAAA,WAAW,OAAA;AAAE,mHAAA,oBAAoB,OAAA;AAC1E,yDAAsD;AAA7C,oHAAA,eAAe,OAAA;AACxB,2DAA2D;AAAlD,yHAAA,mBAAmB,OAAA;AAC5B,mDAAmD;AAA1C,iHAAA,eAAe,OAAA"}
@@ -0,0 +1,3 @@
1
+ import { SourceAnalysis, SupportedLanguage } from '../types.js';
2
+ export declare function analyzeTsSource(filePath: string, language: SupportedLanguage): SourceAnalysis;
3
+ //# sourceMappingURL=js-ts-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js-ts-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/js-ts-analyzer.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,cAAc,EAQd,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAErB,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,iBAAiB,GAC1B,cAAc,CAuChB"}
@@ -0,0 +1,299 @@
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.analyzeTsSource = analyzeTsSource;
37
+ const fs = __importStar(require("fs"));
38
+ const ts_morph_1 = require("ts-morph");
39
+ function analyzeTsSource(filePath, language) {
40
+ const project = new ts_morph_1.Project({
41
+ useInMemoryFileSystem: true,
42
+ compilerOptions: {
43
+ strict: true,
44
+ noEmit: true,
45
+ },
46
+ });
47
+ let sourceFile;
48
+ try {
49
+ const content = fs.readFileSync(filePath, 'utf-8');
50
+ sourceFile = project.createSourceFile(filePath, content);
51
+ }
52
+ catch {
53
+ sourceFile = project.createSourceFile(filePath, '');
54
+ }
55
+ const functions = extractFunctions(sourceFile);
56
+ const classes = extractClasses(sourceFile);
57
+ const interfaces = extractInterfaces(sourceFile);
58
+ const exports = extractExports(sourceFile);
59
+ const imports = extractImports(sourceFile);
60
+ const result = {
61
+ filePath,
62
+ language,
63
+ functions,
64
+ classes,
65
+ interfaces,
66
+ exports,
67
+ imports,
68
+ dependencies: imports.map((imp) => imp.modulePath),
69
+ linesOfCode: sourceFile.getEndLineNumber() - sourceFile.getStartLineNumber() + 1,
70
+ cyclomaticComplexity: calculateFileComplexity(sourceFile),
71
+ };
72
+ // Free memory
73
+ project.removeSourceFile(sourceFile);
74
+ return result;
75
+ }
76
+ function extractFunctions(sourceFile) {
77
+ const functions = [];
78
+ sourceFile.getFunctions().forEach((fn) => {
79
+ functions.push(analyzeFunctionDeclaration(fn));
80
+ });
81
+ sourceFile.getVariableDeclarations().forEach((varDecl) => {
82
+ const initializer = varDecl.getInitializer();
83
+ if (initializer) {
84
+ if (initializer.getKind() === ts_morph_1.SyntaxKind.ArrowFunction ||
85
+ initializer.getKind() === ts_morph_1.SyntaxKind.FunctionExpression) {
86
+ functions.push(analyzeVariableFunction(varDecl, initializer));
87
+ }
88
+ }
89
+ });
90
+ return functions;
91
+ }
92
+ function analyzeFunctionDeclaration(fn) {
93
+ const params = fn.getParameters().map(paramToInfo);
94
+ const returnType = fn.getReturnTypeNode()?.getText() ?? null;
95
+ const isAsync = fn.isAsync();
96
+ const isExported = fn.isExported();
97
+ const body = fn.getBody();
98
+ const bodyText = getBodyText(body);
99
+ return {
100
+ name: fn.getName() ?? 'anonymous',
101
+ isAsync,
102
+ isExported,
103
+ params,
104
+ returnType,
105
+ throws: extractThrowsFromBody(body),
106
+ complexity: calculateComplexity(bodyText),
107
+ hasSideEffects: detectSideEffects(bodyText),
108
+ startLine: fn.getStartLineNumber(),
109
+ endLine: fn.getEndLineNumber(),
110
+ };
111
+ }
112
+ function analyzeVariableFunction(varDecl, fn) {
113
+ const params = fn.getParameters().map(paramToInfo);
114
+ const returnType = fn.getReturnTypeNode()?.getText() ?? null;
115
+ const isAsync = fn.isAsync();
116
+ const body = fn.getBody();
117
+ const bodyText = getBodyText(body);
118
+ return {
119
+ name: varDecl.getName(),
120
+ isAsync,
121
+ isExported: isVarExported(varDecl),
122
+ params,
123
+ returnType,
124
+ throws: extractThrowsFromBody(body),
125
+ complexity: calculateComplexity(bodyText),
126
+ hasSideEffects: detectSideEffects(bodyText),
127
+ startLine: fn.getStartLineNumber(),
128
+ endLine: fn.getEndLineNumber(),
129
+ };
130
+ }
131
+ function paramToInfo(param) {
132
+ return {
133
+ name: param.getName(),
134
+ type: param.getTypeNode()?.getText() ?? null,
135
+ optional: param.isOptional(),
136
+ defaultValue: param.getInitializer()?.getText() ?? null,
137
+ };
138
+ }
139
+ function isVarExported(varDecl) {
140
+ const statement = varDecl.getVariableStatement();
141
+ return statement?.isExported() ?? false;
142
+ }
143
+ function extractClasses(sourceFile) {
144
+ return sourceFile.getClasses().map((cls) => {
145
+ const name = cls.getName() ?? 'AnonymousClass';
146
+ const isExported = cls.isExported();
147
+ const extendsClass = cls.getExtends()?.getText() ?? null;
148
+ const implementsInterfaces = cls.getImplements().map((imp) => imp.getText());
149
+ const constructorParams = cls.getConstructors().flatMap((ctor) => ctor.getParameters().map(paramToInfo));
150
+ const methods = cls.getMethods().map((method) => analyzeMethod(method));
151
+ const properties = cls.getProperties().map((prop) => ({
152
+ name: prop.getName(),
153
+ type: prop.getTypeNode()?.getText() ?? null,
154
+ visibility: prop.getScope() ?? 'public',
155
+ isStatic: prop.isStatic(),
156
+ isReadonly: prop.isReadonly(),
157
+ }));
158
+ return {
159
+ name,
160
+ isExported,
161
+ constructorParams,
162
+ methods,
163
+ properties,
164
+ implements: implementsInterfaces,
165
+ extends: extendsClass,
166
+ };
167
+ });
168
+ }
169
+ function analyzeMethod(method) {
170
+ const params = method.getParameters().map(paramToInfo);
171
+ const returnType = method.getReturnTypeNode()?.getText() ?? null;
172
+ const body = method.getBody();
173
+ const bodyText = body?.getText() ?? '';
174
+ return {
175
+ name: method.getName(),
176
+ isAsync: method.isAsync(),
177
+ isExported: false,
178
+ params,
179
+ returnType,
180
+ throws: extractThrowsFromBody(body),
181
+ complexity: calculateComplexity(bodyText),
182
+ hasSideEffects: detectSideEffects(bodyText),
183
+ startLine: method.getStartLineNumber(),
184
+ endLine: method.getEndLineNumber(),
185
+ };
186
+ }
187
+ function extractInterfaces(sourceFile) {
188
+ return sourceFile.getInterfaces().map((iface) => ({
189
+ name: iface.getName(),
190
+ isExported: iface.isExported(),
191
+ properties: iface.getProperties().map((prop) => ({
192
+ name: prop.getName(),
193
+ type: prop.getTypeNode()?.getText() ?? null,
194
+ optional: prop.hasQuestionToken(),
195
+ })),
196
+ methods: iface.getMethods().map((method) => ({
197
+ name: method.getName(),
198
+ params: method.getParameters().map(paramToInfo),
199
+ returnType: method.getReturnTypeNode()?.getText() ?? null,
200
+ })),
201
+ }));
202
+ }
203
+ function extractExports(sourceFile) {
204
+ const exports = [];
205
+ sourceFile.getExportDeclarations().forEach((expDecl) => {
206
+ const moduleSpecifier = expDecl.getModuleSpecifierValue();
207
+ if (!moduleSpecifier)
208
+ return;
209
+ expDecl.getNamedExports().forEach((named) => {
210
+ exports.push({
211
+ name: named.getName(),
212
+ type: 'constant',
213
+ filePath: moduleSpecifier,
214
+ });
215
+ });
216
+ });
217
+ const defaultExport = sourceFile.getDefaultExportSymbol();
218
+ if (defaultExport) {
219
+ exports.push({
220
+ name: defaultExport.getName() ?? 'default',
221
+ type: 'default',
222
+ filePath: sourceFile.getFilePath().toString(),
223
+ });
224
+ }
225
+ return exports;
226
+ }
227
+ function extractImports(sourceFile) {
228
+ return sourceFile.getImportDeclarations().map((imp) => ({
229
+ modulePath: imp.getModuleSpecifierValue(),
230
+ namedImports: imp.getNamedImports().map((ni) => ni.getName()),
231
+ defaultImport: imp.getDefaultImport()?.getText() ?? null,
232
+ isTypeOnly: imp.isTypeOnly(),
233
+ }));
234
+ }
235
+ function getBodyText(body) {
236
+ if (!body)
237
+ return '';
238
+ if (body instanceof ts_morph_1.Block) {
239
+ return body.getText();
240
+ }
241
+ return body.getText();
242
+ }
243
+ function extractThrowsFromBody(body) {
244
+ if (!body)
245
+ return [];
246
+ const throws = [];
247
+ body.getDescendantsOfKind(ts_morph_1.SyntaxKind.ThrowStatement).forEach((throwStmt) => {
248
+ const expr = throwStmt.getExpression();
249
+ if (expr) {
250
+ throws.push(expr.getText());
251
+ }
252
+ });
253
+ return throws;
254
+ }
255
+ function calculateComplexity(code) {
256
+ let complexity = 1;
257
+ const patterns = [
258
+ /\bif\b/g,
259
+ /\belse\b/g,
260
+ /\bfor\b/g,
261
+ /\bwhile\b/g,
262
+ /\bcase\b/g,
263
+ /\bcatch\b/g,
264
+ /&&/g,
265
+ /\|\|/g,
266
+ /\?\?/g,
267
+ /\?\./g,
268
+ /\?[^.]/g,
269
+ ];
270
+ for (const pattern of patterns) {
271
+ const matches = code.match(pattern);
272
+ if (matches)
273
+ complexity += matches.length;
274
+ }
275
+ return complexity;
276
+ }
277
+ function calculateFileComplexity(sourceFile) {
278
+ const text = sourceFile.getFullText();
279
+ return calculateComplexity(text);
280
+ }
281
+ function detectSideEffects(code) {
282
+ const sideEffectPatterns = [
283
+ /\bconsole\.\w+\(/,
284
+ /\bprocess\.\w+/,
285
+ /\bfs\.\w+\(/,
286
+ /\bfetch\(/,
287
+ /\baxios\.\w+\(/,
288
+ /\bMath\.random\(/,
289
+ /\bDate\.now\(/,
290
+ /\bnew Date\(/,
291
+ /\.push\(/,
292
+ /\.splice\(/,
293
+ /\.sort\(/,
294
+ /\bdocument\.\w+/,
295
+ /\bwindow\.\w+/,
296
+ ];
297
+ return sideEffectPatterns.some((pattern) => pattern.test(code));
298
+ }
299
+ //# sourceMappingURL=js-ts-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js-ts-analyzer.js","sourceRoot":"","sources":["../../src/analyzers/js-ts-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { SourceAnalysis } from '../types.js';
2
+ export declare function analyzePythonSource(filePath: string): SourceAnalysis;
3
+ //# sourceMappingURL=python-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-analyzer.d.ts","sourceRoot":"","sources":["../../src/analyzers/python-analyzer.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EAOf,MAAM,aAAa,CAAC;AAErB,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAgBpE"}