@sudu-cli/fronted-preview-mcp 1.0.0-beta.3 → 1.0.0-beta.5
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/dist/cdp/connectionManager.d.ts +57 -0
- package/dist/cdp/connectionManager.js +153 -0
- package/dist/cdp/connectionManager.js.map +1 -0
- package/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/constants.d.ts +19 -0
- package/dist/constants.js +26 -0
- package/dist/constants.js.map +1 -0
- package/dist/detectors/frameworkDetector.js +17 -13
- package/dist/detectors/frameworkDetector.js.map +1 -1
- package/dist/handlers/autoFixLoop.d.ts +24 -0
- package/dist/handlers/autoFixLoop.js +81 -4
- package/dist/handlers/autoFixLoop.js.map +1 -1
- package/dist/handlers/checkPageErrors.js +11 -50
- package/dist/handlers/checkPageErrors.js.map +1 -1
- package/dist/handlers/typescriptDiagnostics.d.ts +9 -0
- package/dist/handlers/typescriptDiagnostics.js +4 -25
- package/dist/handlers/typescriptDiagnostics.js.map +1 -1
- package/dist/index.js +15 -3
- package/dist/index.js.map +1 -1
- package/dist/serverManager.d.ts +22 -4
- package/dist/serverManager.js +215 -140
- package/dist/serverManager.js.map +1 -1
- package/dist/strategies/baseStrategy.d.ts +27 -0
- package/dist/strategies/baseStrategy.js +23 -0
- package/dist/strategies/baseStrategy.js.map +1 -0
- package/dist/strategies/index.d.ts +9 -0
- package/dist/strategies/index.js +22 -0
- package/dist/strategies/index.js.map +1 -0
- package/dist/strategies/missingImport.d.ts +16 -0
- package/dist/strategies/missingImport.js +156 -0
- package/dist/strategies/missingImport.js.map +1 -0
- package/dist/strategies/missingProperty.d.ts +13 -0
- package/dist/strategies/missingProperty.js +134 -0
- package/dist/strategies/missingProperty.js.map +1 -0
- package/dist/strategies/networkError.d.ts +10 -0
- package/dist/strategies/networkError.js +56 -0
- package/dist/strategies/networkError.js.map +1 -0
- package/dist/strategies/nullCheckInsertion.d.ts +14 -0
- package/dist/strategies/nullCheckInsertion.js +138 -0
- package/dist/strategies/nullCheckInsertion.js.map +1 -0
- package/dist/strategies/typeAssignment.d.ts +13 -0
- package/dist/strategies/typeAssignment.js +121 -0
- package/dist/strategies/typeAssignment.js.map +1 -0
- package/dist/strategies/unusedImportRemoval.d.ts +11 -0
- package/dist/strategies/unusedImportRemoval.js +138 -0
- package/dist/strategies/unusedImportRemoval.js.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.js +21 -1
- package/dist/types.js.map +1 -1
- package/dist/version.d.ts +7 -0
- package/dist/version.js +10 -0
- package/dist/version.js.map +1 -0
- package/package.json +1 -1
- package/templates/init/instructions.md +1 -11
- package/templates/init/opencode.json +1 -1
- package/dist/handlers/pickElement.d.ts +0 -10
- package/dist/handlers/pickElement.js +0 -413
- package/dist/handlers/pickElement.js.map +0 -1
- package/dist/handlers/takeScreenshot.d.ts +0 -17
- package/dist/handlers/takeScreenshot.js +0 -83
- package/dist/handlers/takeScreenshot.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serverManager.js","sourceRoot":"","sources":["../src/serverManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"serverManager.js","sourceRoot":"","sources":["../src/serverManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAEhC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAS1C,MAAM,OAAO,aAAa;IAChB,MAAM,CAAC,QAAQ,GAAyB,IAAI,CAAC;IAC7C,YAAY,GAAwB,IAAI,CAAC;IACzC,UAAU,GAAuC,IAAI,GAAG,EAAE,CAAC;IAC3D,YAAY,GAA0D,IAAI,CAAC;IAEnF,gBAAuB,CAAC;IAExB,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC5B,aAAa,CAAC,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QAC/C,CAAC;QACD,OAAO,aAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC;IAChC,CAAC;IAEO,eAAe,CAAC,IAAY;QAClC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;gBAC5B,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,kBAAkB,CAAC,IAAY,EAAE,YAAoB,QAAQ,CAAC,oBAAoB;QACxF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;gBACvB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBACnD,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,mCAAmC;oBAClD,OAAO;gBACT,CAAC;gBACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;oBACnC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU;oBAC1B,OAAO;gBACT,CAAC;gBACD,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAClD,CAAC,CAAC;YACF,KAAK,EAAE,CAAC;QACV,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW,CACf,UAAkB,EAClB,UAAkB,EAClB,IAAY,EACZ,YAAoB,QAAQ,CAAC,oBAAoB;QAEjD,6DAA6D;QAC7D,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,uCAAuC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACjF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAExC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAClC,OAAO,MAAM,CAAC;QAChB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,UAAkB,EAClB,UAAkB,EAClB,IAAY,EACZ,SAAiB;QAEjB,oEAAoE;QACpE,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACzD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC;YAC9D,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO;oBACL,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG;oBAC1B,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI;oBAC5B,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;oBACvC,KAAK,EAAE,IAAI;oBACX,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;iBAC/D,CAAC;YACJ,CAAC;YACD,oCAAoC;YACpC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,8DAA8D;QAC9D,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;gBACL,GAAG,EAAE,oBAAoB,IAAI,EAAE;gBAC/B,IAAI;gBACJ,GAAG,EAAE,CAAC;gBACN,KAAK,EAAE,IAAI;gBACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;QACJ,CAAC;QAED,0BAA0B;QAC1B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;QAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,UAAU,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;QAE/D,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,EAAE,EAAE;YAChC,GAAG,EAAE,UAAU;YACf,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QAEH,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC7B,kCAAkC;YAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACtD,IAAI,QAAQ,EAAE,CAAC;oBACb,YAAY,GAAG,IAAI,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACxC,mCAAmC;QACrC,CAAC,CAAC,CAAC;QAEH,wBAAwB;QACxB,MAAM,YAAY,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACpD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACxB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAClE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,sBAAsB;QACtB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,CAAC,YAAY,EAAE,OAAO,KAAK,KAAK,EAAE,CAAC;gBACzC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,2CAA2C;QAC3C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAC/B,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,SAAS,CAAC;YACxC,IAAI,OAAO,CAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CACjC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC,mBAAmB,CAAC,CAC5H;YACD,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;SAC/B,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,8CAA8C;YAC9C,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,mCAAmC,SAAS,cAAc,IAAI,EAAE,CAAC,CAAC;QACpF,CAAC;QAED,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG;YAClB,OAAO,EAAE,KAAK;YACd,IAAI;YACJ,GAAG;YACH,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QAEF,OAAO;YACL,GAAG;YACH,IAAI;YACJ,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;YACnB,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,uDAAuD;QACvD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,eAAe,CAAC;QAEpC,IAAI,CAAC;YACH,OAAO,MAAM,eAAe,CAAC;QAC/B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC;QACrE,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;QAEpC,IAAI,CAAC;YACH,8BAA8B;YAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;YAC3C,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;YAED,wCAAwC;YACxC,MAAM,OAAO,CAAC,IAAI,CAAC;gBACjB,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBAC5B,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;gBACpC,CAAC,CAAC;gBACF,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBAC5B,UAAU,CAAC,GAAG,EAAE;wBACd,IAAI,CAAC;4BAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;wBAAC,CAAC;wBAAC,MAAM,CAAC,CAAA,CAAC;wBACvC,OAAO,EAAE,CAAC;oBACZ,CAAC,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;gBACnC,CAAC,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,sBAAsB,IAAI,WAAW;aAC/C,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACtE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,8BAA8B,YAAY,EAAE;aACtD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,eAAe;QACb,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG;YAC1B,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI;YAC5B,GAAG,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;YACvC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,QAAQ,KAAK,IAAI;YAClD,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE;SAC/D,CAAC;IACJ,CAAC;;AAGH,iCAAiC;AACjC,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAAkB,EAClB,UAAkB,EAClB,IAAY;IAEZ,OAAO,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,OAAO,OAAO,CAAC,UAAU,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,OAAO,CAAC,eAAe,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Project, SourceFile } from 'ts-morph';
|
|
2
|
+
import { DiagnosticInfo } from '../handlers/typescriptDiagnostics.js';
|
|
3
|
+
import { ConsoleError } from '../handlers/autoFixLoop.js';
|
|
4
|
+
export interface FixContext {
|
|
5
|
+
projectDir: string;
|
|
6
|
+
project: Project;
|
|
7
|
+
tsConfigPath: string;
|
|
8
|
+
}
|
|
9
|
+
export interface FixResult {
|
|
10
|
+
success: boolean;
|
|
11
|
+
message: string;
|
|
12
|
+
changes: Array<{
|
|
13
|
+
file: string;
|
|
14
|
+
description: string;
|
|
15
|
+
diff?: string;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
export interface FixStrategy {
|
|
19
|
+
errorType: 'typescript' | 'console' | 'network';
|
|
20
|
+
pattern: RegExp;
|
|
21
|
+
canFix(error: DiagnosticInfo | ConsoleError): boolean;
|
|
22
|
+
fix(context: FixContext, error: DiagnosticInfo | ConsoleError): Promise<FixResult>;
|
|
23
|
+
}
|
|
24
|
+
export declare function createFixContext(projectDir: string, tsConfigPath: string): FixContext;
|
|
25
|
+
export declare function saveChanges(context: FixContext): void;
|
|
26
|
+
export declare function getSourceFile(context: FixContext, filePath: string): SourceFile | undefined;
|
|
27
|
+
export declare function getRelativePath(context: FixContext, filePath: string): string;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Project } from 'ts-morph';
|
|
2
|
+
export function createFixContext(projectDir, tsConfigPath) {
|
|
3
|
+
const project = new Project({
|
|
4
|
+
tsConfigFilePath: tsConfigPath,
|
|
5
|
+
skipAddingFilesFromTsConfig: false,
|
|
6
|
+
skipFileDependencyResolution: true,
|
|
7
|
+
skipLoadingLibFiles: true,
|
|
8
|
+
});
|
|
9
|
+
return { projectDir, project, tsConfigPath };
|
|
10
|
+
}
|
|
11
|
+
export function saveChanges(context) {
|
|
12
|
+
context.project.saveSync();
|
|
13
|
+
}
|
|
14
|
+
export function getSourceFile(context, filePath) {
|
|
15
|
+
const fullPath = filePath.startsWith('/') ? filePath : `${context.projectDir}/${filePath}`;
|
|
16
|
+
return context.project.getSourceFile(fullPath);
|
|
17
|
+
}
|
|
18
|
+
export function getRelativePath(context, filePath) {
|
|
19
|
+
const fullPath = filePath.startsWith('/') ? filePath : `${context.projectDir}/${filePath}`;
|
|
20
|
+
const relative = fullPath.replace(context.projectDir + '/', '');
|
|
21
|
+
return relative;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=baseStrategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"baseStrategy.js","sourceRoot":"","sources":["../../src/strategies/baseStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA2N,MAAM,UAAU,CAAC;AAuB5P,MAAM,UAAU,gBAAgB,CAAC,UAAkB,EAAE,YAAoB;IACvE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;QAC1B,gBAAgB,EAAE,YAAY;QAC9B,2BAA2B,EAAE,KAAK;QAClC,4BAA4B,EAAE,IAAI;QAClC,mBAAmB,EAAE,IAAI;KAC1B,CAAC,CAAC;IACH,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAmB;IAC7C,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAmB,EAAE,QAAgB;IACjE,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,IAAI,QAAQ,EAAE,CAAC;IAC3F,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAmB,EAAE,QAAgB;IACnE,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,IAAI,QAAQ,EAAE,CAAC;IAC3F,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;IAChE,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export * from './baseStrategy.js';
|
|
2
|
+
export { unusedImportRemovalStrategy } from './unusedImportRemoval.js';
|
|
3
|
+
export { missingPropertyStrategy } from './missingProperty.js';
|
|
4
|
+
export { typeAssignmentStrategy } from './typeAssignment.js';
|
|
5
|
+
export { nullCheckInsertionStrategy } from './nullCheckInsertion.js';
|
|
6
|
+
export { missingImportStrategy } from './missingImport.js';
|
|
7
|
+
export { networkErrorStrategy } from './networkError.js';
|
|
8
|
+
import { FixStrategy } from './baseStrategy.js';
|
|
9
|
+
export declare const defaultFixStrategies: FixStrategy[];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export * from './baseStrategy.js';
|
|
2
|
+
export { unusedImportRemovalStrategy } from './unusedImportRemoval.js';
|
|
3
|
+
export { missingPropertyStrategy } from './missingProperty.js';
|
|
4
|
+
export { typeAssignmentStrategy } from './typeAssignment.js';
|
|
5
|
+
export { nullCheckInsertionStrategy } from './nullCheckInsertion.js';
|
|
6
|
+
export { missingImportStrategy } from './missingImport.js';
|
|
7
|
+
export { networkErrorStrategy } from './networkError.js';
|
|
8
|
+
import { unusedImportRemovalStrategy } from './unusedImportRemoval.js';
|
|
9
|
+
import { missingPropertyStrategy } from './missingProperty.js';
|
|
10
|
+
import { typeAssignmentStrategy } from './typeAssignment.js';
|
|
11
|
+
import { nullCheckInsertionStrategy } from './nullCheckInsertion.js';
|
|
12
|
+
import { missingImportStrategy } from './missingImport.js';
|
|
13
|
+
import { networkErrorStrategy } from './networkError.js';
|
|
14
|
+
export const defaultFixStrategies = [
|
|
15
|
+
unusedImportRemovalStrategy,
|
|
16
|
+
missingPropertyStrategy,
|
|
17
|
+
typeAssignmentStrategy,
|
|
18
|
+
nullCheckInsertionStrategy,
|
|
19
|
+
missingImportStrategy,
|
|
20
|
+
networkErrorStrategy,
|
|
21
|
+
];
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/strategies/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,CAAC,MAAM,oBAAoB,GAAkB;IACjD,2BAA2B;IAC3B,uBAAuB;IACvB,sBAAsB;IACtB,0BAA0B;IAC1B,qBAAqB;IACrB,oBAAoB;CACrB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { FixStrategy, FixContext, FixResult } from './baseStrategy.js';
|
|
2
|
+
import { DiagnosticInfo } from '../handlers/typescriptDiagnostics.js';
|
|
3
|
+
import { ConsoleError } from '../handlers/autoFixLoop.js';
|
|
4
|
+
export declare class MissingImportStrategy implements FixStrategy {
|
|
5
|
+
errorType: "typescript";
|
|
6
|
+
pattern: RegExp;
|
|
7
|
+
canFix(error: DiagnosticInfo | ConsoleError): boolean;
|
|
8
|
+
fix(context: FixContext, error: DiagnosticInfo | ConsoleError): Promise<FixResult>;
|
|
9
|
+
private addImportFromModule;
|
|
10
|
+
private findAndAddImport;
|
|
11
|
+
private getExportedSymbols;
|
|
12
|
+
private getModuleSpecifier;
|
|
13
|
+
private getRelativeImportPath;
|
|
14
|
+
private generateDiff;
|
|
15
|
+
}
|
|
16
|
+
export declare const missingImportStrategy: MissingImportStrategy;
|
|
@@ -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":"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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 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;
|