@sudu-cli/fronted-preview-mcp 1.0.0-beta.4 → 1.0.0-beta.6

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 +24 -0
  2. package/dist/handlers/autoFixLoop.d.ts +3 -10
  3. package/dist/handlers/autoFixLoop.js +10 -49
  4. package/dist/handlers/autoFixLoop.js.map +1 -1
  5. package/dist/handlers/click.d.ts +9 -0
  6. package/dist/handlers/click.js +93 -0
  7. package/dist/handlers/click.js.map +1 -0
  8. package/dist/handlers/fill.d.ts +10 -0
  9. package/dist/handlers/fill.js +129 -0
  10. package/dist/handlers/fill.js.map +1 -0
  11. package/dist/handlers/inspect.d.ts +11 -0
  12. package/dist/handlers/inspect.js +138 -0
  13. package/dist/handlers/inspect.js.map +1 -0
  14. package/dist/handlers/screenshot.d.ts +10 -0
  15. package/dist/handlers/screenshot.js +135 -0
  16. package/dist/handlers/screenshot.js.map +1 -0
  17. package/dist/handlers/typescriptDiagnostics.d.ts +9 -0
  18. package/dist/index.js +215 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/navigate.d.ts +9 -0
  21. package/dist/navigate.js +78 -0
  22. package/dist/navigate.js.map +1 -0
  23. package/dist/strategies/baseStrategy.d.ts +27 -0
  24. package/dist/strategies/baseStrategy.js +23 -0
  25. package/dist/strategies/baseStrategy.js.map +1 -0
  26. package/dist/strategies/index.d.ts +9 -0
  27. package/dist/strategies/index.js +22 -0
  28. package/dist/strategies/index.js.map +1 -0
  29. package/dist/strategies/missingImport.d.ts +16 -0
  30. package/dist/strategies/missingImport.js +156 -0
  31. package/dist/strategies/missingImport.js.map +1 -0
  32. package/dist/strategies/missingProperty.d.ts +13 -0
  33. package/dist/strategies/missingProperty.js +134 -0
  34. package/dist/strategies/missingProperty.js.map +1 -0
  35. package/dist/strategies/networkError.d.ts +10 -0
  36. package/dist/strategies/networkError.js +56 -0
  37. package/dist/strategies/networkError.js.map +1 -0
  38. package/dist/strategies/nullCheckInsertion.d.ts +14 -0
  39. package/dist/strategies/nullCheckInsertion.js +138 -0
  40. package/dist/strategies/nullCheckInsertion.js.map +1 -0
  41. package/dist/strategies/typeAssignment.d.ts +13 -0
  42. package/dist/strategies/typeAssignment.js +121 -0
  43. package/dist/strategies/typeAssignment.js.map +1 -0
  44. package/dist/strategies/unusedImportRemoval.d.ts +11 -0
  45. package/dist/strategies/unusedImportRemoval.js +138 -0
  46. package/dist/strategies/unusedImportRemoval.js.map +1 -0
  47. package/dist/types.d.ts +1 -1
  48. package/dist/types.js.map +1 -1
  49. package/package.json +2 -2
@@ -0,0 +1,156 @@
1
+ import { SyntaxKind } from 'ts-morph';
2
+ import { getSourceFile, getRelativePath, saveChanges } from './baseStrategy.js';
3
+ export class MissingImportStrategy {
4
+ errorType = 'typescript';
5
+ pattern = /(?:Cannot find name|'([^']+)' is not defined|is not defined|Module '([^']+)' has no exported member)/i;
6
+ canFix(error) {
7
+ return this.pattern.test(error.message) && error.severity === 'error';
8
+ }
9
+ async fix(context, error) {
10
+ const changes = [];
11
+ const file = error.file;
12
+ if (!file) {
13
+ return { success: false, message: 'No file path in error', changes };
14
+ }
15
+ // Extract the missing identifier name
16
+ const match = error.message.match(/(?:Cannot find name|'([^']+)' is not defined|is not defined|Module '([^']+)' has no exported member '([^']+)')/i);
17
+ if (!match) {
18
+ return { success: false, message: 'Could not parse missing identifier from error', changes };
19
+ }
20
+ const missingName = match[1] || match[3];
21
+ const moduleName = match[2];
22
+ const sourceFile = getSourceFile(context, file);
23
+ if (!sourceFile) {
24
+ return { success: false, message: `Source file not found: ${file}`, changes };
25
+ }
26
+ const originalText = sourceFile.getFullText();
27
+ try {
28
+ let importAdded = false;
29
+ if (moduleName) {
30
+ // Missing export from specific module
31
+ importAdded = await this.addImportFromModule(sourceFile, missingName, moduleName);
32
+ }
33
+ else {
34
+ // Search for the symbol in the project
35
+ importAdded = await this.findAndAddImport(context, sourceFile, missingName);
36
+ }
37
+ if (!importAdded) {
38
+ return { success: false, message: `Could not find source for '${missingName}'`, changes };
39
+ }
40
+ saveChanges(context);
41
+ const newText = sourceFile.getFullText();
42
+ const diff = this.generateDiff(originalText, newText, file);
43
+ changes.push({
44
+ file: getRelativePath(context, file),
45
+ description: `Added missing import for '${missingName}'`,
46
+ diff,
47
+ });
48
+ return {
49
+ success: true,
50
+ message: `Added missing import for '${missingName}'`,
51
+ changes,
52
+ };
53
+ }
54
+ catch (err) {
55
+ const msg = err instanceof Error ? err.message : String(err);
56
+ return { success: false, message: `Fix failed: ${msg}`, changes };
57
+ }
58
+ }
59
+ async addImportFromModule(sourceFile, name, module) {
60
+ try {
61
+ // Check if import already exists
62
+ const existingImport = sourceFile.getImportDeclarations().find(imp => imp.getModuleSpecifierValue() === module);
63
+ if (existingImport) {
64
+ // Add to existing import
65
+ const namedImports = existingImport.getNamedImports();
66
+ const alreadyImported = namedImports.some(spec => spec.getName() === name);
67
+ if (!alreadyImported) {
68
+ existingImport.addNamedImport(name);
69
+ return true;
70
+ }
71
+ return true; // Already imported
72
+ }
73
+ // Add new import declaration
74
+ sourceFile.addImportDeclaration({
75
+ moduleSpecifier: module,
76
+ namedImports: [name],
77
+ });
78
+ return true;
79
+ }
80
+ catch {
81
+ return false;
82
+ }
83
+ }
84
+ async findAndAddImport(context, sourceFile, name) {
85
+ // Search all source files in the project for an export matching the name
86
+ const allSourceFiles = context.project.getSourceFiles();
87
+ for (const sf of allSourceFiles) {
88
+ if (sf === sourceFile)
89
+ continue; // Don't import from self
90
+ const exports = this.getExportedSymbols(sf, name);
91
+ if (exports.length > 0) {
92
+ const exportInfo = exports[0];
93
+ const moduleSpecifier = this.getModuleSpecifier(sourceFile, sf);
94
+ return this.addImportFromModule(sourceFile, name, moduleSpecifier);
95
+ }
96
+ }
97
+ return false;
98
+ }
99
+ getExportedSymbols(sourceFile, name) {
100
+ const results = [];
101
+ // Check exported functions, classes, interfaces, types, variables
102
+ const exportedDeclarations = sourceFile.getExportedDeclarations();
103
+ for (const [exportName, declarations] of exportedDeclarations) {
104
+ if (exportName === name) {
105
+ const decl = declarations[0];
106
+ let isDefault = false;
107
+ if (decl.getKind() === SyntaxKind.FunctionDeclaration ||
108
+ decl.getKind() === SyntaxKind.ClassDeclaration ||
109
+ decl.getKind() === SyntaxKind.VariableDeclaration ||
110
+ decl.getKind() === SyntaxKind.InterfaceDeclaration ||
111
+ decl.getKind() === SyntaxKind.TypeAliasDeclaration) {
112
+ isDefault = decl.hasDefaultKeyword?.() ?? false;
113
+ }
114
+ results.push({ name: exportName, isDefault });
115
+ }
116
+ }
117
+ return results;
118
+ }
119
+ getModuleSpecifier(fromFile, toFile) {
120
+ const fromDir = fromFile.getDirectoryPath();
121
+ const toPath = toFile.getFilePath();
122
+ // Calculate relative path
123
+ const relative = this.getRelativeImportPath(fromDir, toPath);
124
+ return relative;
125
+ }
126
+ getRelativeImportPath(fromDir, toPath) {
127
+ const path = require('path');
128
+ let relative = path.relative(fromDir, toPath);
129
+ // Remove extension
130
+ relative = relative.replace(/\.ts$/, '').replace(/\.tsx$/, '');
131
+ // Ensure it starts with ./ or ../
132
+ if (!relative.startsWith('.')) {
133
+ relative = './' + relative;
134
+ }
135
+ return relative;
136
+ }
137
+ generateDiff(oldText, newText, fileName) {
138
+ const oldLines = oldText.split('\n');
139
+ const newLines = newText.split('\n');
140
+ let diff = `--- ${fileName}\n+++ ${fileName}\n`;
141
+ const maxLen = Math.max(oldLines.length, newLines.length);
142
+ for (let i = 0; i < maxLen; i++) {
143
+ const oldLine = oldLines[i];
144
+ const newLine = newLines[i];
145
+ if (oldLine !== newLine) {
146
+ if (oldLine !== undefined)
147
+ diff += `-${oldLine}\n`;
148
+ if (newLine !== undefined)
149
+ diff += `+${newLine}\n`;
150
+ }
151
+ }
152
+ return diff;
153
+ }
154
+ }
155
+ export const missingImportStrategy = new MissingImportStrategy();
156
+ //# sourceMappingURL=missingImport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"missingImport.js","sourceRoot":"","sources":["../../src/strategies/missingImport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwD,UAAU,EAAE,MAAM,UAAU,CAAC;AAC5F,OAAO,EAAsC,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIpH,MAAM,OAAO,qBAAqB;IAChC,SAAS,GAAG,YAAqB,CAAC;IAClC,OAAO,GAAG,uGAAuG,CAAC;IAElH,MAAM,CAAC,KAAoC;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAK,KAAwB,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC5F,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,OAAmB,EAAE,KAAoC;QACjE,MAAM,OAAO,GAAgE,EAAE,CAAC;QAEhF,MAAM,IAAI,GAAI,KAAwB,CAAC,IAAI,CAAC;QAC5C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE,OAAO,EAAE,CAAC;QACvE,CAAC;QAED,sCAAsC;QACtC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,iHAAiH,CAAC,CAAC;QACrJ,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,+CAA+C,EAAE,OAAO,EAAE,CAAC;QAC/F,CAAC;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAE5B,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,0BAA0B,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC;QAChF,CAAC;QAED,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QAE9C,IAAI,CAAC;YACH,IAAI,WAAW,GAAG,KAAK,CAAC;YAExB,IAAI,UAAU,EAAE,CAAC;gBACf,sCAAsC;gBACtC,WAAW,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YACpF,CAAC;iBAAM,CAAC;gBACN,uCAAuC;gBACvC,WAAW,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;YAC9E,CAAC;YAED,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,8BAA8B,WAAW,GAAG,EAAE,OAAO,EAAE,CAAC;YAC5F,CAAC;YAED,WAAW,CAAC,OAAO,CAAC,CAAC;YACrB,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAE5D,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC;gBACpC,WAAW,EAAE,6BAA6B,WAAW,GAAG;gBACxD,IAAI;aACL,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,6BAA6B,WAAW,GAAG;gBACpD,OAAO;aACR,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC;QACpE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,UAAsB,EAAE,IAAY,EAAE,MAAc;QACpF,IAAI,CAAC;YACH,iCAAiC;YACjC,MAAM,cAAc,GAAG,UAAU,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAC5D,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,MAAM,CAChD,CAAC;YAEF,IAAI,cAAc,EAAE,CAAC;gBACnB,yBAAyB;gBACzB,MAAM,YAAY,GAAG,cAAc,CAAC,eAAe,EAAE,CAAC;gBACtD,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC;gBAE3E,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrB,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;oBACpC,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,IAAI,CAAC,CAAC,mBAAmB;YAClC,CAAC;YAED,6BAA6B;YAC7B,UAAU,CAAC,oBAAoB,CAAC;gBAC9B,eAAe,EAAE,MAAM;gBACvB,YAAY,EAAE,CAAC,IAAI,CAAC;aACrB,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,OAAmB,EAAE,UAAsB,EAAE,IAAY;QACtF,yEAAyE;QACzE,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;QAExD,KAAK,MAAM,EAAE,IAAI,cAAc,EAAE,CAAC;YAChC,IAAI,EAAE,KAAK,UAAU;gBAAE,SAAS,CAAC,yBAAyB;YAE1D,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YAClD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBAEhE,OAAO,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,kBAAkB,CAAC,UAAsB,EAAE,IAAY;QAC7D,MAAM,OAAO,GAAgD,EAAE,CAAC;QAEhE,kEAAkE;QAClE,MAAM,oBAAoB,GAAG,UAAU,CAAC,uBAAuB,EAAE,CAAC;QAElE,KAAK,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,IAAI,oBAAoB,EAAE,CAAC;YAC9D,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBACxB,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC7B,IAAI,SAAS,GAAG,KAAK,CAAC;gBAEtB,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,mBAAmB;oBACjD,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,gBAAgB;oBAC9C,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,mBAAmB;oBACjD,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,oBAAoB;oBAClD,IAAI,CAAC,OAAO,EAAE,KAAK,UAAU,CAAC,oBAAoB,EAAE,CAAC;oBACvD,SAAS,GAAI,IAAY,CAAC,iBAAiB,EAAE,EAAE,IAAI,KAAK,CAAC;gBAC3D,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,kBAAkB,CAAC,QAAoB,EAAE,MAAkB;QACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QAEpC,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC7D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,qBAAqB,CAAC,OAAe,EAAE,MAAc;QAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAE9C,mBAAmB;QACnB,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAE/D,kCAAkC;QAClC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,QAAQ,GAAG,IAAI,GAAG,QAAQ,CAAC;QAC7B,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,YAAY,CAAC,OAAe,EAAE,OAAe,EAAE,QAAgB;QACrE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,IAAI,GAAG,OAAO,QAAQ,SAAS,QAAQ,IAAI,CAAC;QAEhD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACxB,IAAI,OAAO,KAAK,SAAS;oBAAE,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC;gBACnD,IAAI,OAAO,KAAK,SAAS;oBAAE,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC;YACrD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { FixStrategy, FixContext, FixResult } from './baseStrategy.js';
2
+ import { DiagnosticInfo } from '../handlers/typescriptDiagnostics.js';
3
+ export declare class MissingPropertyStrategy implements FixStrategy {
4
+ errorType: "typescript";
5
+ pattern: RegExp;
6
+ canFix(error: DiagnosticInfo): boolean;
7
+ fix(context: FixContext, error: DiagnosticInfo): Promise<FixResult>;
8
+ private findTypeDeclaration;
9
+ private getProperty;
10
+ private addProperty;
11
+ private generateDiff;
12
+ }
13
+ export declare const missingPropertyStrategy: MissingPropertyStrategy;
@@ -0,0 +1,134 @@
1
+ import { SyntaxKind } from 'ts-morph';
2
+ import { getSourceFile, getRelativePath, saveChanges } from './baseStrategy.js';
3
+ export class MissingPropertyStrategy {
4
+ errorType = 'typescript';
5
+ pattern = /Property '([^']+)' does not exist on type '([^']+)'/i;
6
+ canFix(error) {
7
+ return this.pattern.test(error.message) && error.severity === 'error';
8
+ }
9
+ async fix(context, error) {
10
+ const changes = [];
11
+ if (!error.file) {
12
+ return { success: false, message: 'No file path in error', changes };
13
+ }
14
+ const match = error.message.match(this.pattern);
15
+ if (!match) {
16
+ return { success: false, message: 'Could not parse missing property error', changes };
17
+ }
18
+ const propertyName = match[1];
19
+ const typeName = match[2];
20
+ const sourceFile = getSourceFile(context, error.file);
21
+ if (!sourceFile) {
22
+ return { success: false, message: `Source file not found: ${error.file}`, changes };
23
+ }
24
+ const originalText = sourceFile.getFullText();
25
+ try {
26
+ // Find the interface or type alias with the given name
27
+ const targetType = this.findTypeDeclaration(sourceFile, typeName);
28
+ if (!targetType) {
29
+ return { success: false, message: `Type '${typeName}' not found in ${error.file}`, changes };
30
+ }
31
+ // Check if property already exists
32
+ const existingProp = this.getProperty(targetType, propertyName);
33
+ if (existingProp) {
34
+ return { success: false, message: `Property '${propertyName}' already exists on '${typeName}'`, changes };
35
+ }
36
+ // Add the missing property as optional with 'any' type (safe default)
37
+ this.addProperty(targetType, propertyName);
38
+ saveChanges(context);
39
+ const newText = sourceFile.getFullText();
40
+ const diff = this.generateDiff(originalText, newText, error.file);
41
+ changes.push({
42
+ file: getRelativePath(context, error.file),
43
+ description: `Added missing property '${propertyName}' to '${typeName}'`,
44
+ diff,
45
+ });
46
+ return {
47
+ success: true,
48
+ message: `Added missing property '${propertyName}' to type '${typeName}'`,
49
+ changes,
50
+ };
51
+ }
52
+ catch (err) {
53
+ const msg = err instanceof Error ? err.message : String(err);
54
+ return { success: false, message: `Fix failed: ${msg}`, changes };
55
+ }
56
+ }
57
+ findTypeDeclaration(sourceFile, typeName) {
58
+ // Check interfaces
59
+ const interfaces = sourceFile.getInterfaces();
60
+ for (const iface of interfaces) {
61
+ if (iface.getName() === typeName) {
62
+ return iface;
63
+ }
64
+ }
65
+ // Check type aliases
66
+ const typeAliases = sourceFile.getTypeAliases();
67
+ for (const typeAlias of typeAliases) {
68
+ if (typeAlias.getName() === typeName) {
69
+ return typeAlias;
70
+ }
71
+ }
72
+ return undefined;
73
+ }
74
+ getProperty(type, propertyName) {
75
+ if (type.getKind() === SyntaxKind.InterfaceDeclaration) {
76
+ return type.getProperty(propertyName);
77
+ }
78
+ // For type aliases, we need to check the type literal
79
+ const typeLiteral = type.getTypeNode();
80
+ if (typeLiteral && typeLiteral.getKind() === SyntaxKind.TypeLiteral) {
81
+ const members = typeLiteral.getMembers?.() || [];
82
+ for (const member of members) {
83
+ if (member.getKind() === SyntaxKind.PropertySignature) {
84
+ const prop = member;
85
+ if (prop.getName() === propertyName) {
86
+ return prop;
87
+ }
88
+ }
89
+ }
90
+ }
91
+ return undefined;
92
+ }
93
+ addProperty(type, propertyName) {
94
+ if (type.getKind() === SyntaxKind.InterfaceDeclaration) {
95
+ type.addProperty({
96
+ name: propertyName,
97
+ type: 'any',
98
+ hasQuestionToken: true, // Make it optional
99
+ });
100
+ }
101
+ else {
102
+ // For type aliases with type literal, we need to recreate the type
103
+ const typeAlias = type;
104
+ const typeLiteral = typeAlias.getTypeNode();
105
+ if (typeLiteral && typeLiteral.getKind() === SyntaxKind.TypeLiteral) {
106
+ const members = typeLiteral.getMembers?.() || [];
107
+ const memberTexts = members.map((m) => m.getText());
108
+ const newMember = ` ${propertyName}?: any;`;
109
+ // Replace the type literal with updated members
110
+ const newTypeLiteral = `{${memberTexts.length > 0 ? '\n' : ''}${memberTexts.join(';\n')}${memberTexts.length > 0 ? ';\n' : ''}${newMember}\n}`;
111
+ typeAlias.setType(newTypeLiteral);
112
+ }
113
+ }
114
+ }
115
+ generateDiff(oldText, newText, fileName) {
116
+ const oldLines = oldText.split('\n');
117
+ const newLines = newText.split('\n');
118
+ let diff = `--- ${fileName}\n+++ ${fileName}\n`;
119
+ const maxLen = Math.max(oldLines.length, newLines.length);
120
+ for (let i = 0; i < maxLen; i++) {
121
+ const oldLine = oldLines[i];
122
+ const newLine = newLines[i];
123
+ if (oldLine !== newLine) {
124
+ if (oldLine !== undefined)
125
+ diff += `-${oldLine}\n`;
126
+ if (newLine !== undefined)
127
+ diff += `+${newLine}\n`;
128
+ }
129
+ }
130
+ return diff;
131
+ }
132
+ }
133
+ export const missingPropertyStrategy = new MissingPropertyStrategy();
134
+ //# sourceMappingURL=missingProperty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"missingProperty.js","sourceRoot":"","sources":["../../src/strategies/missingProperty.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { FixStrategy, FixResult } from './baseStrategy.js';
2
+ import { ConsoleError } from '../handlers/autoFixLoop.js';
3
+ export declare class NetworkErrorStrategy implements FixStrategy {
4
+ errorType: "network";
5
+ pattern: RegExp;
6
+ canFix(error: ConsoleError): boolean;
7
+ fix(_context: any, error: ConsoleError): Promise<FixResult>;
8
+ private analyzeNetworkError;
9
+ }
10
+ export declare const networkErrorStrategy: NetworkErrorStrategy;
@@ -0,0 +1,56 @@
1
+ export class NetworkErrorStrategy {
2
+ errorType = 'network';
3
+ pattern = /Failed to fetch|Network Error|ECONNREFUSED|ERR_CONNECTION_REFUSED|404|500|502|503|504|CORS|Cross-Origin/i;
4
+ canFix(error) {
5
+ return this.pattern.test(error.message);
6
+ }
7
+ async fix(_context, error) {
8
+ const changes = [];
9
+ // Network errors typically require backend/server fixes, not frontend code changes
10
+ // We provide diagnostic suggestions instead
11
+ const suggestions = this.analyzeNetworkError(error);
12
+ return {
13
+ success: false, // Network errors can't be auto-fixed in frontend code
14
+ message: `Network error detected: ${error.message}\n\nSuggestions:\n${suggestions.map(s => ` • ${s}`).join('\n')}`,
15
+ changes,
16
+ };
17
+ }
18
+ analyzeNetworkError(error) {
19
+ const suggestions = [];
20
+ const message = error.message.toLowerCase();
21
+ const url = error.url || '';
22
+ if (message.includes('failed to fetch') || message.includes('network error')) {
23
+ suggestions.push('Check if the backend server is running');
24
+ suggestions.push('Verify the API base URL in your frontend config');
25
+ suggestions.push('Check for CORS issues - ensure backend allows your frontend origin');
26
+ }
27
+ if (message.includes('econnrefused') || message.includes('connection refused')) {
28
+ suggestions.push('Backend server is not running or not accessible on the expected port');
29
+ suggestions.push('Check docker/proxy configuration if using containerized backend');
30
+ }
31
+ if (message.includes('404')) {
32
+ suggestions.push(`API endpoint not found: ${url}`);
33
+ suggestions.push('Verify the API route matches backend routes');
34
+ suggestions.push('Check for typos in the request path');
35
+ }
36
+ if (message.includes('500') || message.includes('502') || message.includes('503') || message.includes('504')) {
37
+ suggestions.push('Backend server error - check backend logs');
38
+ suggestions.push('May be temporary - try retrying the request');
39
+ }
40
+ if (message.includes('cors') || message.includes('cross-origin')) {
41
+ suggestions.push('CORS policy blocking request');
42
+ suggestions.push('Configure backend to allow your frontend origin (Access-Control-Allow-Origin)');
43
+ suggestions.push('For development, consider using a proxy (Vite proxy, Next.js rewrites)');
44
+ }
45
+ if (url.includes('localhost') || url.includes('127.0.0.1')) {
46
+ suggestions.push('Using localhost - ensure backend runs on the same machine/port');
47
+ }
48
+ if (suggestions.length === 0) {
49
+ suggestions.push('Check browser Network tab for detailed request/response');
50
+ suggestions.push('Verify API endpoint and request parameters');
51
+ }
52
+ return suggestions;
53
+ }
54
+ }
55
+ export const networkErrorStrategy = new NetworkErrorStrategy();
56
+ //# sourceMappingURL=networkError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networkError.js","sourceRoot":"","sources":["../../src/strategies/networkError.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { FixStrategy, FixContext, FixResult } from './baseStrategy.js';
2
+ import { ConsoleError } from '../handlers/autoFixLoop.js';
3
+ export declare class NullCheckInsertionStrategy implements FixStrategy {
4
+ errorType: "console";
5
+ pattern: RegExp;
6
+ canFix(error: ConsoleError): boolean;
7
+ fix(context: FixContext, error: ConsoleError): Promise<FixResult>;
8
+ private extractFilePathFromUrl;
9
+ private findPropertyAccessAtLine;
10
+ private addOptionalChaining;
11
+ private wrapWithNullCheck;
12
+ private generateDiff;
13
+ }
14
+ export declare const nullCheckInsertionStrategy: NullCheckInsertionStrategy;
@@ -0,0 +1,138 @@
1
+ import { Block, SyntaxKind } from 'ts-morph';
2
+ import { getSourceFile, getRelativePath, saveChanges } from './baseStrategy.js';
3
+ export class NullCheckInsertionStrategy {
4
+ errorType = 'console';
5
+ pattern = /Cannot read propert(?:y|ies) of (?:null|undefined)|Cannot read property '([^']+)' of (?:null|undefined)|is (?:null|undefined) and has no property/i;
6
+ canFix(error) {
7
+ return this.pattern.test(error.message);
8
+ }
9
+ async fix(context, error) {
10
+ const changes = [];
11
+ if (!error.url) {
12
+ return { success: false, message: 'No URL in console error', changes };
13
+ }
14
+ // Extract file path from URL (e.g., http://localhost:3000/src/main.ts -> src/main.ts)
15
+ const filePath = this.extractFilePathFromUrl(error.url);
16
+ if (!filePath) {
17
+ return { success: false, message: 'Could not extract file path from URL', changes };
18
+ }
19
+ const sourceFile = getSourceFile(context, filePath);
20
+ if (!sourceFile) {
21
+ return { success: false, message: `Source file not found: ${filePath}`, changes };
22
+ }
23
+ const originalText = sourceFile.getFullText();
24
+ const targetLine = error.lineNumber || 1;
25
+ try {
26
+ // Find the problematic property access at the error line
27
+ const propertyAccess = this.findPropertyAccessAtLine(sourceFile, targetLine);
28
+ if (!propertyAccess) {
29
+ return { success: false, message: `No property access found at line ${targetLine}`, changes };
30
+ }
31
+ // Strategy 1: Try to add optional chaining (?.) - modern and clean
32
+ const addedOptionalChaining = this.addOptionalChaining(propertyAccess);
33
+ if (!addedOptionalChaining) {
34
+ // Strategy 2: Wrap with null check if statement
35
+ const wrapped = this.wrapWithNullCheck(propertyAccess);
36
+ if (!wrapped) {
37
+ return { success: false, message: 'Could not add null check or optional chaining', changes };
38
+ }
39
+ }
40
+ saveChanges(context);
41
+ const newText = sourceFile.getFullText();
42
+ const diff = this.generateDiff(originalText, newText, filePath);
43
+ changes.push({
44
+ file: getRelativePath(context, filePath),
45
+ description: `Added null/undefined check for property access at line ${targetLine}`,
46
+ diff,
47
+ });
48
+ return {
49
+ success: true,
50
+ message: `Fixed null/undefined property access at line ${targetLine}`,
51
+ changes,
52
+ };
53
+ }
54
+ catch (err) {
55
+ const msg = err instanceof Error ? err.message : String(err);
56
+ return { success: false, message: `Fix failed: ${msg}`, changes };
57
+ }
58
+ }
59
+ extractFilePathFromUrl(url) {
60
+ try {
61
+ const urlObj = new URL(url);
62
+ const pathname = urlObj.pathname;
63
+ // Remove leading slash and common prefixes
64
+ return pathname.replace(/^\//, '').replace(/^src\//, '').replace(/^app\//, '');
65
+ }
66
+ catch {
67
+ return null;
68
+ }
69
+ }
70
+ findPropertyAccessAtLine(sourceFile, line) {
71
+ const propertyAccesses = sourceFile.getDescendantsOfKind(SyntaxKind.PropertyAccessExpression);
72
+ for (const propAccess of propertyAccesses) {
73
+ const startLine = propAccess.getStartLineNumber();
74
+ const endLine = propAccess.getEndLineNumber();
75
+ if (startLine <= line && endLine >= line) {
76
+ return propAccess;
77
+ }
78
+ }
79
+ return undefined;
80
+ }
81
+ addOptionalChaining(propAccess) {
82
+ try {
83
+ // Check if it already has optional chaining
84
+ const expression = propAccess.getExpression();
85
+ if (expression.getKind() === SyntaxKind.NonNullExpression) {
86
+ return false; // Already has !
87
+ }
88
+ // Add optional chaining by replacing the dot with ?.
89
+ // We need to replace the entire property access expression
90
+ const exprText = propAccess.getExpression().getText();
91
+ const name = propAccess.getName();
92
+ const newText = `${exprText}?.${name}`;
93
+ propAccess.replaceWithText(newText);
94
+ return true;
95
+ }
96
+ catch {
97
+ return false;
98
+ }
99
+ }
100
+ wrapWithNullCheck(propAccess) {
101
+ try {
102
+ const statement = propAccess.getFirstAncestorByKind(SyntaxKind.ExpressionStatement);
103
+ if (!statement)
104
+ return false;
105
+ const parent = statement.getParent();
106
+ if (!parent || !Block.isBlock(parent))
107
+ return false;
108
+ const exprText = statement.getText().trim();
109
+ const checkExpr = propAccess.getExpression().getText();
110
+ // Create if statement: if (obj != null) { obj.prop = ...; }
111
+ const ifStatement = `if (${checkExpr} != null) {\n ${exprText}\n}`;
112
+ statement.replaceWithText(ifStatement);
113
+ return true;
114
+ }
115
+ catch {
116
+ return false;
117
+ }
118
+ }
119
+ generateDiff(oldText, newText, fileName) {
120
+ const oldLines = oldText.split('\n');
121
+ const newLines = newText.split('\n');
122
+ let diff = `--- ${fileName}\n+++ ${fileName}\n`;
123
+ const maxLen = Math.max(oldLines.length, newLines.length);
124
+ for (let i = 0; i < maxLen; i++) {
125
+ const oldLine = oldLines[i];
126
+ const newLine = newLines[i];
127
+ if (oldLine !== newLine) {
128
+ if (oldLine !== undefined)
129
+ diff += `-${oldLine}\n`;
130
+ if (newLine !== undefined)
131
+ diff += `+${newLine}\n`;
132
+ }
133
+ }
134
+ return diff;
135
+ }
136
+ }
137
+ export const nullCheckInsertionStrategy = new NullCheckInsertionStrategy();
138
+ //# sourceMappingURL=nullCheckInsertion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nullCheckInsertion.js","sourceRoot":"","sources":["../../src/strategies/nullCheckInsertion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { FixStrategy, FixContext, FixResult } from './baseStrategy.js';
2
+ import { DiagnosticInfo } from '../handlers/typescriptDiagnostics.js';
3
+ export declare class TypeAssignmentStrategy implements FixStrategy {
4
+ errorType: "typescript";
5
+ pattern: RegExp;
6
+ canFix(error: DiagnosticInfo): boolean;
7
+ fix(context: FixContext, error: DiagnosticInfo): Promise<FixResult>;
8
+ private findExpressionAtLine;
9
+ private isFixableExpression;
10
+ private addTypeAssertion;
11
+ private generateDiff;
12
+ }
13
+ export declare const typeAssignmentStrategy: TypeAssignmentStrategy;