phantom-pr 0.4.19 → 0.5.1
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.
- package/README.md +216 -80
- package/dist/core/analysis/astExtractor.d.ts +15 -0
- package/dist/core/analysis/astExtractor.js +354 -0
- package/dist/core/analysis/astExtractor.js.map +1 -0
- package/dist/core/analysis/index.d.ts +3 -0
- package/dist/core/analysis/index.js +3 -0
- package/dist/core/analysis/index.js.map +1 -0
- package/dist/core/analysis/types.d.ts +50 -0
- package/dist/core/analysis/types.js +16 -0
- package/dist/core/analysis/types.js.map +1 -0
- package/dist/core/context/contextSelector.d.ts +29 -0
- package/dist/core/context/contextSelector.js +293 -0
- package/dist/core/context/contextSelector.js.map +1 -0
- package/dist/core/context/index.d.ts +4 -0
- package/dist/core/context/index.js +3 -0
- package/dist/core/context/index.js.map +1 -0
- package/dist/core/generator/enhancedContext.d.ts +34 -0
- package/dist/core/generator/enhancedContext.js +144 -0
- package/dist/core/generator/enhancedContext.js.map +1 -0
- package/dist/core/generator/llmGenerator.js +157 -15
- package/dist/core/generator/llmGenerator.js.map +1 -1
- package/dist/core/generator/postValidation.d.ts +24 -0
- package/dist/core/generator/postValidation.js +57 -0
- package/dist/core/generator/postValidation.js.map +1 -0
- package/dist/core/retry/errorParser.d.ts +12 -0
- package/dist/core/retry/errorParser.js +264 -0
- package/dist/core/retry/errorParser.js.map +1 -0
- package/dist/core/retry/feedbackGenerator.d.ts +12 -0
- package/dist/core/retry/feedbackGenerator.js +164 -0
- package/dist/core/retry/feedbackGenerator.js.map +1 -0
- package/dist/core/retry/index.d.ts +3 -0
- package/dist/core/retry/index.js +3 -0
- package/dist/core/retry/index.js.map +1 -0
- package/dist/core/retry/types.d.ts +40 -0
- package/dist/core/retry/types.js +5 -0
- package/dist/core/retry/types.js.map +1 -0
- package/dist/core/testRunner/retryEnhancer.d.ts +32 -0
- package/dist/core/testRunner/retryEnhancer.js +58 -0
- package/dist/core/testRunner/retryEnhancer.js.map +1 -0
- package/dist/core/validation/coverageVerifier.d.ts +16 -0
- package/dist/core/validation/coverageVerifier.js +226 -0
- package/dist/core/validation/coverageVerifier.js.map +1 -0
- package/dist/core/validation/index.d.ts +2 -0
- package/dist/core/validation/index.js +2 -0
- package/dist/core/validation/index.js.map +1 -0
- package/dist/core/validation/types.d.ts +24 -0
- package/dist/core/validation/types.js +6 -0
- package/dist/core/validation/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST extractor that analyzes React/TypeScript component files.
|
|
3
|
+
* Uses TypeScript's built-in compiler API (no external parser dependency).
|
|
4
|
+
*
|
|
5
|
+
* Pure function: parse file → return ComponentAnalysis.
|
|
6
|
+
* Handles parse errors gracefully (returns partial analysis, doesn't throw).
|
|
7
|
+
*/
|
|
8
|
+
import ts from 'typescript';
|
|
9
|
+
import { emptyAnalysis } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Extract component analysis from a React/TypeScript file.
|
|
12
|
+
* @param filePath - Path to the file (for reference in output)
|
|
13
|
+
* @param fileContent - Source code content
|
|
14
|
+
* @returns ComponentAnalysis with extracted structure info
|
|
15
|
+
*/
|
|
16
|
+
export function extractComponentAnalysis(filePath, fileContent) {
|
|
17
|
+
try {
|
|
18
|
+
const sourceFile = ts.createSourceFile(filePath, fileContent, ts.ScriptTarget.Latest, true, // setParentNodes
|
|
19
|
+
filePath.endsWith('.tsx') || filePath.endsWith('.jsx')
|
|
20
|
+
? ts.ScriptKind.TSX
|
|
21
|
+
: ts.ScriptKind.TS);
|
|
22
|
+
const imports = extractImports(sourceFile);
|
|
23
|
+
const branches = extractBranches(sourceFile);
|
|
24
|
+
const effects = extractEffects(sourceFile);
|
|
25
|
+
const children = extractChildren(sourceFile, imports);
|
|
26
|
+
const externalCalls = extractExternalCalls(sourceFile, imports);
|
|
27
|
+
const props = extractProps(sourceFile);
|
|
28
|
+
return {
|
|
29
|
+
filePath,
|
|
30
|
+
branches,
|
|
31
|
+
effects,
|
|
32
|
+
children,
|
|
33
|
+
externalCalls,
|
|
34
|
+
props,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Parse errors → return empty analysis (fail-closed, no throw)
|
|
39
|
+
return emptyAnalysis(filePath);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Extract import map: identifier → module path */
|
|
43
|
+
function extractImports(sourceFile) {
|
|
44
|
+
const imports = new Map();
|
|
45
|
+
ts.forEachChild(sourceFile, (node) => {
|
|
46
|
+
if (ts.isImportDeclaration(node) && node.moduleSpecifier) {
|
|
47
|
+
const modulePath = node.moduleSpecifier.text;
|
|
48
|
+
const clause = node.importClause;
|
|
49
|
+
if (clause) {
|
|
50
|
+
// Default import
|
|
51
|
+
if (clause.name) {
|
|
52
|
+
imports.set(clause.name.text, modulePath);
|
|
53
|
+
}
|
|
54
|
+
// Named imports
|
|
55
|
+
if (clause.namedBindings && ts.isNamedImports(clause.namedBindings)) {
|
|
56
|
+
for (const el of clause.namedBindings.elements) {
|
|
57
|
+
imports.set(el.name.text, modulePath);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Namespace import
|
|
61
|
+
if (clause.namedBindings && ts.isNamespaceImport(clause.namedBindings)) {
|
|
62
|
+
imports.set(clause.namedBindings.name.text, modulePath);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
return imports;
|
|
68
|
+
}
|
|
69
|
+
/** Extract conditional branches (if, ternary, switch, logical operators) */
|
|
70
|
+
function extractBranches(sourceFile) {
|
|
71
|
+
const branches = [];
|
|
72
|
+
function visit(node) {
|
|
73
|
+
const line = sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1;
|
|
74
|
+
// if statement
|
|
75
|
+
if (ts.isIfStatement(node)) {
|
|
76
|
+
branches.push({
|
|
77
|
+
line,
|
|
78
|
+
condition: node.expression.getText(sourceFile),
|
|
79
|
+
paths: 2,
|
|
80
|
+
kind: 'if',
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
// ternary expression
|
|
84
|
+
if (ts.isConditionalExpression(node)) {
|
|
85
|
+
branches.push({
|
|
86
|
+
line,
|
|
87
|
+
condition: node.condition.getText(sourceFile),
|
|
88
|
+
paths: 2,
|
|
89
|
+
kind: 'ternary',
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// switch statement
|
|
93
|
+
if (ts.isSwitchStatement(node)) {
|
|
94
|
+
const caseCount = node.caseBlock.clauses.length;
|
|
95
|
+
branches.push({
|
|
96
|
+
line,
|
|
97
|
+
condition: node.expression.getText(sourceFile),
|
|
98
|
+
paths: caseCount,
|
|
99
|
+
kind: 'switch',
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// logical operators (&& / ||) used for short-circuit rendering
|
|
103
|
+
if (ts.isBinaryExpression(node)) {
|
|
104
|
+
if (node.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken ||
|
|
105
|
+
node.operatorToken.kind === ts.SyntaxKind.BarBarToken) {
|
|
106
|
+
// Only count as branch if it looks like JSX short-circuit: `cond && <Element />`
|
|
107
|
+
if (ts.isJsxElement(node.right) || ts.isJsxSelfClosingElement(node.right) || ts.isJsxFragment(node.right)) {
|
|
108
|
+
branches.push({
|
|
109
|
+
line,
|
|
110
|
+
condition: node.left.getText(sourceFile),
|
|
111
|
+
paths: 2,
|
|
112
|
+
kind: 'logical',
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
ts.forEachChild(node, visit);
|
|
118
|
+
}
|
|
119
|
+
visit(sourceFile);
|
|
120
|
+
return branches;
|
|
121
|
+
}
|
|
122
|
+
/** Extract React effect hooks (useEffect, useLayoutEffect, useMemo, useCallback) */
|
|
123
|
+
function extractEffects(sourceFile) {
|
|
124
|
+
const effects = [];
|
|
125
|
+
const effectHooks = new Set(['useEffect', 'useLayoutEffect', 'useMemo', 'useCallback']);
|
|
126
|
+
function visit(node) {
|
|
127
|
+
if (ts.isCallExpression(node)) {
|
|
128
|
+
const callee = node.expression;
|
|
129
|
+
let hookName = null;
|
|
130
|
+
// Direct call: useEffect(...)
|
|
131
|
+
if (ts.isIdentifier(callee) && effectHooks.has(callee.text)) {
|
|
132
|
+
hookName = callee.text;
|
|
133
|
+
}
|
|
134
|
+
// Property access: React.useEffect(...)
|
|
135
|
+
if (ts.isPropertyAccessExpression(callee) && ts.isIdentifier(callee.name) && effectHooks.has(callee.name.text)) {
|
|
136
|
+
hookName = callee.name.text;
|
|
137
|
+
}
|
|
138
|
+
if (hookName) {
|
|
139
|
+
const line = sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1;
|
|
140
|
+
const deps = extractDependencies(node);
|
|
141
|
+
const hasCleanup = checkForCleanup(node);
|
|
142
|
+
effects.push({
|
|
143
|
+
line,
|
|
144
|
+
dependencies: deps,
|
|
145
|
+
hasCleanup,
|
|
146
|
+
kind: hookName,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
ts.forEachChild(node, visit);
|
|
151
|
+
}
|
|
152
|
+
visit(sourceFile);
|
|
153
|
+
return effects;
|
|
154
|
+
}
|
|
155
|
+
/** Extract dependency array items from effect call */
|
|
156
|
+
function extractDependencies(callExpr) {
|
|
157
|
+
// Second argument is typically the dependency array
|
|
158
|
+
const depsArg = callExpr.arguments[1];
|
|
159
|
+
if (!depsArg || !ts.isArrayLiteralExpression(depsArg)) {
|
|
160
|
+
return [];
|
|
161
|
+
}
|
|
162
|
+
return depsArg.elements.map((el) => el.getText()).filter(Boolean);
|
|
163
|
+
}
|
|
164
|
+
/** Check if effect callback has a cleanup function (return statement) */
|
|
165
|
+
function checkForCleanup(callExpr) {
|
|
166
|
+
const callback = callExpr.arguments[0];
|
|
167
|
+
if (!callback)
|
|
168
|
+
return false;
|
|
169
|
+
// Arrow function or function expression
|
|
170
|
+
if (ts.isArrowFunction(callback) || ts.isFunctionExpression(callback)) {
|
|
171
|
+
// Check for return statement in body
|
|
172
|
+
if (ts.isBlock(callback.body)) {
|
|
173
|
+
return callback.body.statements.some((stmt) => ts.isReturnStatement(stmt) && stmt.expression !== undefined);
|
|
174
|
+
}
|
|
175
|
+
// Concise arrow: () => cleanup (returns the cleanup directly)
|
|
176
|
+
// This is unusual for useEffect but technically valid
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
/** Extract child components rendered in JSX */
|
|
182
|
+
function extractChildren(sourceFile, imports) {
|
|
183
|
+
const children = [];
|
|
184
|
+
const seen = new Set();
|
|
185
|
+
function isInsideConditional(node) {
|
|
186
|
+
let current = node.parent;
|
|
187
|
+
while (current) {
|
|
188
|
+
if (ts.isIfStatement(current) || ts.isConditionalExpression(current)) {
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
if (ts.isBinaryExpression(current)) {
|
|
192
|
+
if (current.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken ||
|
|
193
|
+
current.operatorToken.kind === ts.SyntaxKind.BarBarToken) {
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
current = current.parent;
|
|
198
|
+
}
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
function visit(node) {
|
|
202
|
+
let componentName = null;
|
|
203
|
+
let line = 0;
|
|
204
|
+
// <ComponentName /> or <ComponentName>...</ComponentName>
|
|
205
|
+
if (ts.isJsxSelfClosingElement(node)) {
|
|
206
|
+
const tagName = node.tagName;
|
|
207
|
+
if (ts.isIdentifier(tagName) && isUpperCase(tagName.text[0])) {
|
|
208
|
+
componentName = tagName.text;
|
|
209
|
+
line = sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (ts.isJsxOpeningElement(node)) {
|
|
213
|
+
const tagName = node.tagName;
|
|
214
|
+
if (ts.isIdentifier(tagName) && isUpperCase(tagName.text[0])) {
|
|
215
|
+
componentName = tagName.text;
|
|
216
|
+
line = sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (componentName && !seen.has(componentName)) {
|
|
220
|
+
seen.add(componentName);
|
|
221
|
+
const importPath = imports.get(componentName) ?? 'unknown';
|
|
222
|
+
children.push({
|
|
223
|
+
name: componentName,
|
|
224
|
+
importPath,
|
|
225
|
+
line,
|
|
226
|
+
isConditional: isInsideConditional(node),
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
ts.forEachChild(node, visit);
|
|
230
|
+
}
|
|
231
|
+
visit(sourceFile);
|
|
232
|
+
return children;
|
|
233
|
+
}
|
|
234
|
+
/** Extract external function calls (from imported modules) */
|
|
235
|
+
function extractExternalCalls(sourceFile, imports) {
|
|
236
|
+
const calls = [];
|
|
237
|
+
const seen = new Set();
|
|
238
|
+
function visit(node) {
|
|
239
|
+
if (ts.isCallExpression(node)) {
|
|
240
|
+
const callee = node.expression;
|
|
241
|
+
let moduleName = null;
|
|
242
|
+
let methodName = null;
|
|
243
|
+
// Direct imported call: fetchData(...)
|
|
244
|
+
if (ts.isIdentifier(callee) && imports.has(callee.text)) {
|
|
245
|
+
moduleName = imports.get(callee.text) ?? null;
|
|
246
|
+
methodName = callee.text;
|
|
247
|
+
}
|
|
248
|
+
// Property access: api.fetchData(...)
|
|
249
|
+
if (ts.isPropertyAccessExpression(callee)) {
|
|
250
|
+
const obj = callee.expression;
|
|
251
|
+
if (ts.isIdentifier(obj) && imports.has(obj.text)) {
|
|
252
|
+
moduleName = imports.get(obj.text) ?? null;
|
|
253
|
+
methodName = callee.name.text;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (moduleName && methodName) {
|
|
257
|
+
const key = `${moduleName}:${methodName}`;
|
|
258
|
+
if (!seen.has(key)) {
|
|
259
|
+
seen.add(key);
|
|
260
|
+
const line = sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1;
|
|
261
|
+
const args = node.arguments.map((arg) => extractArgPattern(arg));
|
|
262
|
+
calls.push({
|
|
263
|
+
module: moduleName,
|
|
264
|
+
method: methodName,
|
|
265
|
+
line,
|
|
266
|
+
arguments: args,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
ts.forEachChild(node, visit);
|
|
272
|
+
}
|
|
273
|
+
visit(sourceFile);
|
|
274
|
+
return calls;
|
|
275
|
+
}
|
|
276
|
+
/** Extract a simplified pattern from an argument */
|
|
277
|
+
function extractArgPattern(arg) {
|
|
278
|
+
if (ts.isIdentifier(arg)) {
|
|
279
|
+
return arg.text;
|
|
280
|
+
}
|
|
281
|
+
if (ts.isStringLiteral(arg)) {
|
|
282
|
+
return `"${arg.text}"`;
|
|
283
|
+
}
|
|
284
|
+
if (ts.isNumericLiteral(arg)) {
|
|
285
|
+
return arg.text;
|
|
286
|
+
}
|
|
287
|
+
if (ts.isObjectLiteralExpression(arg)) {
|
|
288
|
+
return '{...}';
|
|
289
|
+
}
|
|
290
|
+
if (ts.isArrayLiteralExpression(arg)) {
|
|
291
|
+
return '[...]';
|
|
292
|
+
}
|
|
293
|
+
return '?';
|
|
294
|
+
}
|
|
295
|
+
/** Extract component props from function parameters or type annotations */
|
|
296
|
+
function extractProps(sourceFile) {
|
|
297
|
+
const props = [];
|
|
298
|
+
function visit(node) {
|
|
299
|
+
// Function component: function Foo(props: { name: string }) or function Foo({ name }: Props)
|
|
300
|
+
if (ts.isFunctionDeclaration(node) || ts.isFunctionExpression(node)) {
|
|
301
|
+
const firstParam = node.parameters[0];
|
|
302
|
+
if (firstParam) {
|
|
303
|
+
extractPropsFromParam(firstParam, props, sourceFile);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// Arrow function: const Foo = (props: Props) => ...
|
|
307
|
+
if (ts.isVariableDeclaration(node) && node.initializer && ts.isArrowFunction(node.initializer)) {
|
|
308
|
+
const firstParam = node.initializer.parameters[0];
|
|
309
|
+
if (firstParam) {
|
|
310
|
+
extractPropsFromParam(firstParam, props, sourceFile);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
ts.forEachChild(node, visit);
|
|
314
|
+
}
|
|
315
|
+
visit(sourceFile);
|
|
316
|
+
return props;
|
|
317
|
+
}
|
|
318
|
+
/** Extract prop info from a function parameter */
|
|
319
|
+
function extractPropsFromParam(param, props, sourceFile) {
|
|
320
|
+
// Destructured props: ({ name, age = 0 }: Props)
|
|
321
|
+
if (ts.isObjectBindingPattern(param.name)) {
|
|
322
|
+
for (const element of param.name.elements) {
|
|
323
|
+
if (ts.isBindingElement(element) && ts.isIdentifier(element.name)) {
|
|
324
|
+
const defaultVal = element.initializer?.getText(sourceFile);
|
|
325
|
+
const prop = {
|
|
326
|
+
name: element.name.text,
|
|
327
|
+
type: element.dotDotDotToken ? 'rest' : 'unknown',
|
|
328
|
+
required: element.initializer === undefined,
|
|
329
|
+
};
|
|
330
|
+
if (defaultVal !== undefined) {
|
|
331
|
+
prop.defaultValue = defaultVal;
|
|
332
|
+
}
|
|
333
|
+
props.push(prop);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
// Type annotation on props param: (props: { name: string })
|
|
339
|
+
if (param.type && ts.isTypeLiteralNode(param.type)) {
|
|
340
|
+
for (const member of param.type.members) {
|
|
341
|
+
if (ts.isPropertySignature(member) && member.name && ts.isIdentifier(member.name)) {
|
|
342
|
+
props.push({
|
|
343
|
+
name: member.name.text,
|
|
344
|
+
type: member.type?.getText(sourceFile) ?? 'unknown',
|
|
345
|
+
required: member.questionToken === undefined,
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
function isUpperCase(char) {
|
|
352
|
+
return char !== undefined && char === char.toUpperCase() && char !== char.toLowerCase();
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=astExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"astExtractor.js","sourceRoot":"","sources":["../../../src/core/analysis/astExtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/analysis/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST analysis types for extracting component structure.
|
|
3
|
+
* Used for intelligent context selection and post-generation validation.
|
|
4
|
+
*/
|
|
5
|
+
/** Information about a conditional branch in the component. */
|
|
6
|
+
export type BranchInfo = {
|
|
7
|
+
line: number;
|
|
8
|
+
condition: string;
|
|
9
|
+
paths: number;
|
|
10
|
+
kind: 'if' | 'ternary' | 'switch' | 'logical';
|
|
11
|
+
};
|
|
12
|
+
/** Information about a React effect hook. */
|
|
13
|
+
export type EffectInfo = {
|
|
14
|
+
line: number;
|
|
15
|
+
dependencies: string[];
|
|
16
|
+
hasCleanup: boolean;
|
|
17
|
+
kind: 'useEffect' | 'useLayoutEffect' | 'useMemo' | 'useCallback';
|
|
18
|
+
};
|
|
19
|
+
/** Information about a child component rendered in JSX. */
|
|
20
|
+
export type ChildComponent = {
|
|
21
|
+
name: string;
|
|
22
|
+
importPath: string;
|
|
23
|
+
line: number;
|
|
24
|
+
isConditional: boolean;
|
|
25
|
+
};
|
|
26
|
+
/** Information about an external function/method call. */
|
|
27
|
+
export type ExternalCall = {
|
|
28
|
+
module: string;
|
|
29
|
+
method: string;
|
|
30
|
+
line: number;
|
|
31
|
+
arguments: string[];
|
|
32
|
+
};
|
|
33
|
+
/** Information about a component prop. */
|
|
34
|
+
export type PropInfo = {
|
|
35
|
+
name: string;
|
|
36
|
+
type: string;
|
|
37
|
+
required: boolean;
|
|
38
|
+
defaultValue?: string;
|
|
39
|
+
};
|
|
40
|
+
/** Complete analysis result for a React/TypeScript component file. */
|
|
41
|
+
export type ComponentAnalysis = {
|
|
42
|
+
filePath: string;
|
|
43
|
+
branches: BranchInfo[];
|
|
44
|
+
effects: EffectInfo[];
|
|
45
|
+
children: ChildComponent[];
|
|
46
|
+
externalCalls: ExternalCall[];
|
|
47
|
+
props: PropInfo[];
|
|
48
|
+
};
|
|
49
|
+
/** Empty analysis for error cases or non-component files. */
|
|
50
|
+
export declare function emptyAnalysis(filePath: string): ComponentAnalysis;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST analysis types for extracting component structure.
|
|
3
|
+
* Used for intelligent context selection and post-generation validation.
|
|
4
|
+
*/
|
|
5
|
+
/** Empty analysis for error cases or non-component files. */
|
|
6
|
+
export function emptyAnalysis(filePath) {
|
|
7
|
+
return {
|
|
8
|
+
filePath,
|
|
9
|
+
branches: [],
|
|
10
|
+
effects: [],
|
|
11
|
+
children: [],
|
|
12
|
+
externalCalls: [],
|
|
13
|
+
props: [],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/analysis/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoDH,6DAA6D;AAC7D,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO;QACL,QAAQ;QACR,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,aAAa,EAAE,EAAE;QACjB,KAAK,EAAE,EAAE;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intelligent context selection using AST analysis.
|
|
3
|
+
* Minimizes token usage while maximizing test generation quality.
|
|
4
|
+
*
|
|
5
|
+
* Pure functions only - no file I/O (receives file contents as input).
|
|
6
|
+
*/
|
|
7
|
+
import type { ComponentAnalysis } from '../analysis/types.js';
|
|
8
|
+
/** A file selected for context with priority and reason. */
|
|
9
|
+
export type SelectedContextFile = {
|
|
10
|
+
path: string;
|
|
11
|
+
content: string;
|
|
12
|
+
priority: 'required' | 'recommended' | 'optional';
|
|
13
|
+
reason: string;
|
|
14
|
+
};
|
|
15
|
+
/** Input for context selection. */
|
|
16
|
+
export type ContextSelectionInput = {
|
|
17
|
+
targetPath: string;
|
|
18
|
+
targetContent: string;
|
|
19
|
+
existingTestPath?: string;
|
|
20
|
+
existingTestContent?: string;
|
|
21
|
+
availableFiles: Map<string, string>;
|
|
22
|
+
analysis: ComponentAnalysis;
|
|
23
|
+
maxTokens: number;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Select context files based on analysis and heuristics.
|
|
27
|
+
* Returns files sorted by priority with reasons for selection.
|
|
28
|
+
*/
|
|
29
|
+
export declare function selectContext(input: ContextSelectionInput): SelectedContextFile[];
|