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.
Files changed (49) hide show
  1. package/README.md +216 -80
  2. package/dist/core/analysis/astExtractor.d.ts +15 -0
  3. package/dist/core/analysis/astExtractor.js +354 -0
  4. package/dist/core/analysis/astExtractor.js.map +1 -0
  5. package/dist/core/analysis/index.d.ts +3 -0
  6. package/dist/core/analysis/index.js +3 -0
  7. package/dist/core/analysis/index.js.map +1 -0
  8. package/dist/core/analysis/types.d.ts +50 -0
  9. package/dist/core/analysis/types.js +16 -0
  10. package/dist/core/analysis/types.js.map +1 -0
  11. package/dist/core/context/contextSelector.d.ts +29 -0
  12. package/dist/core/context/contextSelector.js +293 -0
  13. package/dist/core/context/contextSelector.js.map +1 -0
  14. package/dist/core/context/index.d.ts +4 -0
  15. package/dist/core/context/index.js +3 -0
  16. package/dist/core/context/index.js.map +1 -0
  17. package/dist/core/generator/enhancedContext.d.ts +34 -0
  18. package/dist/core/generator/enhancedContext.js +144 -0
  19. package/dist/core/generator/enhancedContext.js.map +1 -0
  20. package/dist/core/generator/llmGenerator.js +157 -15
  21. package/dist/core/generator/llmGenerator.js.map +1 -1
  22. package/dist/core/generator/postValidation.d.ts +24 -0
  23. package/dist/core/generator/postValidation.js +57 -0
  24. package/dist/core/generator/postValidation.js.map +1 -0
  25. package/dist/core/retry/errorParser.d.ts +12 -0
  26. package/dist/core/retry/errorParser.js +264 -0
  27. package/dist/core/retry/errorParser.js.map +1 -0
  28. package/dist/core/retry/feedbackGenerator.d.ts +12 -0
  29. package/dist/core/retry/feedbackGenerator.js +164 -0
  30. package/dist/core/retry/feedbackGenerator.js.map +1 -0
  31. package/dist/core/retry/index.d.ts +3 -0
  32. package/dist/core/retry/index.js +3 -0
  33. package/dist/core/retry/index.js.map +1 -0
  34. package/dist/core/retry/types.d.ts +40 -0
  35. package/dist/core/retry/types.js +5 -0
  36. package/dist/core/retry/types.js.map +1 -0
  37. package/dist/core/testRunner/retryEnhancer.d.ts +32 -0
  38. package/dist/core/testRunner/retryEnhancer.js +58 -0
  39. package/dist/core/testRunner/retryEnhancer.js.map +1 -0
  40. package/dist/core/validation/coverageVerifier.d.ts +16 -0
  41. package/dist/core/validation/coverageVerifier.js +226 -0
  42. package/dist/core/validation/coverageVerifier.js.map +1 -0
  43. package/dist/core/validation/index.d.ts +2 -0
  44. package/dist/core/validation/index.js +2 -0
  45. package/dist/core/validation/index.js.map +1 -0
  46. package/dist/core/validation/types.d.ts +24 -0
  47. package/dist/core/validation/types.js +6 -0
  48. package/dist/core/validation/types.js.map +1 -0
  49. 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,3 @@
1
+ export type { BranchInfo, EffectInfo, ChildComponent, ExternalCall, PropInfo, ComponentAnalysis, } from './types.js';
2
+ export { emptyAnalysis } from './types.js';
3
+ export { extractComponentAnalysis } from './astExtractor.js';
@@ -0,0 +1,3 @@
1
+ export { emptyAnalysis } from './types.js';
2
+ export { extractComponentAnalysis } from './astExtractor.js';
3
+ //# sourceMappingURL=index.js.map
@@ -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[];