pi-lens 3.6.2 → 3.6.4
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/CHANGELOG.md +10 -2
- package/package.json +4 -4
- package/tsconfig.json +1 -1
- package/clients/__tests__/file-time.test.js +0 -216
- package/clients/__tests__/file-time.test.ts +0 -276
- package/clients/__tests__/format-service.test.js +0 -245
- package/clients/__tests__/format-service.test.ts +0 -339
- package/clients/__tests__/formatters.test.js +0 -271
- package/clients/__tests__/formatters.test.ts +0 -401
- package/clients/agent-behavior-client.js +0 -110
- package/clients/agent-behavior-client.test.js +0 -94
- package/clients/agent-behavior-client.test.ts +0 -116
- package/clients/amain-types.js +0 -164
- package/clients/architect-client.js +0 -291
- package/clients/ast-grep-client.js +0 -253
- package/clients/ast-grep-parser.js +0 -84
- package/clients/ast-grep-rule-manager.js +0 -89
- package/clients/ast-grep-types.js +0 -9
- package/clients/auto-loop.js +0 -131
- package/clients/biome-client.js +0 -420
- package/clients/biome-client.test.js +0 -144
- package/clients/biome-client.test.ts +0 -163
- package/clients/cache/rule-cache.js +0 -72
- package/clients/cache-manager.js +0 -245
- package/clients/cache-manager.test.js +0 -197
- package/clients/cache-manager.test.ts +0 -299
- package/clients/complexity-client.js +0 -675
- package/clients/complexity-client.test.js +0 -234
- package/clients/complexity-client.test.ts +0 -255
- package/clients/config-validator.js +0 -465
- package/clients/dependency-checker.js +0 -325
- package/clients/dependency-checker.test.js +0 -60
- package/clients/dependency-checker.test.ts +0 -71
- package/clients/dispatch/__tests__/autofix-integration.test.js +0 -245
- package/clients/dispatch/__tests__/autofix-integration.test.ts +0 -300
- package/clients/dispatch/__tests__/runner-registration.test.js +0 -234
- package/clients/dispatch/__tests__/runner-registration.test.ts +0 -286
- package/clients/dispatch/debug.log +0 -1
- package/clients/dispatch/dispatcher.edge.test.js +0 -82
- package/clients/dispatch/dispatcher.edge.test.ts +0 -100
- package/clients/dispatch/dispatcher.format.test.js +0 -46
- package/clients/dispatch/dispatcher.format.test.ts +0 -58
- package/clients/dispatch/dispatcher.inline.test.js +0 -74
- package/clients/dispatch/dispatcher.inline.test.ts +0 -93
- package/clients/dispatch/dispatcher.js +0 -381
- package/clients/dispatch/dispatcher.test.js +0 -116
- package/clients/dispatch/dispatcher.test.ts +0 -149
- package/clients/dispatch/integration.js +0 -108
- package/clients/dispatch/plan.js +0 -183
- package/clients/dispatch/runners/architect.js +0 -83
- package/clients/dispatch/runners/architect.test.js +0 -138
- package/clients/dispatch/runners/architect.test.ts +0 -162
- package/clients/dispatch/runners/ast-grep-napi.js +0 -405
- package/clients/dispatch/runners/ast-grep-napi.test.js +0 -107
- package/clients/dispatch/runners/ast-grep-napi.test.ts +0 -129
- package/clients/dispatch/runners/ast-grep.js +0 -157
- package/clients/dispatch/runners/biome.js +0 -55
- package/clients/dispatch/runners/config-validation.js +0 -67
- package/clients/dispatch/runners/go-vet.js +0 -48
- package/clients/dispatch/runners/index.js +0 -47
- package/clients/dispatch/runners/lsp.js +0 -102
- package/clients/dispatch/runners/oxlint.js +0 -67
- package/clients/dispatch/runners/oxlint.test.js +0 -230
- package/clients/dispatch/runners/oxlint.test.ts +0 -303
- package/clients/dispatch/runners/pyright.js +0 -100
- package/clients/dispatch/runners/pyright.test.js +0 -98
- package/clients/dispatch/runners/pyright.test.ts +0 -121
- package/clients/dispatch/runners/python-slop.js +0 -97
- package/clients/dispatch/runners/python-slop.test.js +0 -203
- package/clients/dispatch/runners/python-slop.test.ts +0 -298
- package/clients/dispatch/runners/ruff.js +0 -48
- package/clients/dispatch/runners/rust-clippy.js +0 -102
- package/clients/dispatch/runners/scan_codebase.test.js +0 -89
- package/clients/dispatch/runners/scan_codebase.test.ts +0 -105
- package/clients/dispatch/runners/shellcheck.js +0 -147
- package/clients/dispatch/runners/shellcheck.test.js +0 -98
- package/clients/dispatch/runners/shellcheck.test.ts +0 -129
- package/clients/dispatch/runners/similarity.js +0 -230
- package/clients/dispatch/runners/spellcheck.js +0 -106
- package/clients/dispatch/runners/spellcheck.test.js +0 -158
- package/clients/dispatch/runners/spellcheck.test.ts +0 -214
- package/clients/dispatch/runners/tree-sitter.js +0 -246
- package/clients/dispatch/runners/ts-lsp.js +0 -125
- package/clients/dispatch/runners/ts-slop.js +0 -113
- package/clients/dispatch/runners/type-safety.js +0 -142
- package/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -134
- package/clients/dispatch/runners/utils/runner-helpers.js +0 -115
- package/clients/dispatch/runners/utils.js +0 -51
- package/clients/dispatch/runners/yaml-rule-parser.js +0 -360
- package/clients/dispatch/types.js +0 -16
- package/clients/dispatch/utils/format-utils.js +0 -44
- package/clients/dogfood.test.js +0 -201
- package/clients/dogfood.test.ts +0 -269
- package/clients/file-kinds.js +0 -177
- package/clients/file-kinds.test.js +0 -169
- package/clients/file-kinds.test.ts +0 -210
- package/clients/file-time.js +0 -152
- package/clients/file-utils.js +0 -40
- package/clients/fix-scanners.js +0 -204
- package/clients/format-service.js +0 -184
- package/clients/formatters.js +0 -488
- package/clients/go-client.js +0 -203
- package/clients/go-client.test.js +0 -127
- package/clients/go-client.test.ts +0 -143
- package/clients/installer/index.js +0 -403
- package/clients/interviewer-templates.js +0 -75
- package/clients/interviewer.js +0 -173
- package/clients/jscpd-client.js +0 -196
- package/clients/jscpd-client.test.js +0 -127
- package/clients/jscpd-client.test.ts +0 -145
- package/clients/knip-client.js +0 -239
- package/clients/knip-client.test.js +0 -112
- package/clients/knip-client.test.ts +0 -128
- package/clients/latency-logger.js +0 -40
- package/clients/lsp/__tests__/client.test.js +0 -310
- package/clients/lsp/__tests__/client.test.ts +0 -412
- package/clients/lsp/__tests__/config.test.js +0 -167
- package/clients/lsp/__tests__/config.test.ts +0 -217
- package/clients/lsp/__tests__/error-recovery.test.js +0 -213
- package/clients/lsp/__tests__/error-recovery.test.ts +0 -279
- package/clients/lsp/__tests__/integration.test.js +0 -127
- package/clients/lsp/__tests__/integration.test.ts +0 -160
- package/clients/lsp/__tests__/launch.test.js +0 -313
- package/clients/lsp/__tests__/launch.test.ts +0 -394
- package/clients/lsp/__tests__/server.test.js +0 -259
- package/clients/lsp/__tests__/server.test.ts +0 -332
- package/clients/lsp/__tests__/service.test.js +0 -438
- package/clients/lsp/__tests__/service.test.ts +0 -530
- package/clients/lsp/client.js +0 -350
- package/clients/lsp/config.js +0 -112
- package/clients/lsp/index.js +0 -318
- package/clients/lsp/installer/index.js +0 -391
- package/clients/lsp/interactive-install.js +0 -221
- package/clients/lsp/language.js +0 -170
- package/clients/lsp/launch.js +0 -329
- package/clients/lsp/lsp/launch.js +0 -116
- package/clients/lsp/lsp/server.js +0 -532
- package/clients/lsp/lsp-index.js +0 -10
- package/clients/lsp/path-utils.js +0 -5
- package/clients/lsp/server.js +0 -725
- package/clients/lsp/test-py-spawn/requirements.txt +0 -1
- package/clients/lsp/test-py-spawn/test.py +0 -3
- package/clients/lsp/test-py-svc/requirements.txt +0 -1
- package/clients/lsp/test-py-svc/test.py +0 -3
- package/clients/lsp/test-python-project/requirements.txt +0 -1
- package/clients/lsp/test-python-project/test.py +0 -5
- package/clients/metrics-client.js +0 -107
- package/clients/metrics-client.test.js +0 -128
- package/clients/metrics-client.test.ts +0 -163
- package/clients/metrics-history.js +0 -367
- package/clients/path-utils.js +0 -142
- package/clients/pipeline.js +0 -272
- package/clients/production-readiness.js +0 -522
- package/clients/project-index.js +0 -255
- package/clients/project-metadata.js +0 -531
- package/clients/ruff-client.js +0 -325
- package/clients/ruff-client.test.js +0 -132
- package/clients/ruff-client.test.ts +0 -153
- package/clients/rules-scanner.js +0 -97
- package/clients/runner-tracker.js +0 -152
- package/clients/rust-client.js +0 -205
- package/clients/rust-client.test.js +0 -108
- package/clients/rust-client.test.ts +0 -130
- package/clients/safe-spawn-async.js +0 -163
- package/clients/safe-spawn.js +0 -241
- package/clients/sanitize.js +0 -291
- package/clients/sanitize.test.js +0 -177
- package/clients/sanitize.test.ts +0 -223
- package/clients/scan-architectural-debt.js +0 -167
- package/clients/scan-utils.js +0 -83
- package/clients/secrets-scanner.js +0 -119
- package/clients/secrets-scanner.test.js +0 -100
- package/clients/secrets-scanner.test.ts +0 -113
- package/clients/sg-runner.js +0 -292
- package/clients/state-matrix.js +0 -160
- package/clients/subprocess-client.js +0 -65
- package/clients/symbol-types.js +0 -5
- package/clients/test-runner-client.js +0 -523
- package/clients/test-runner-client.test.js +0 -192
- package/clients/test-runner-client.test.ts +0 -253
- package/clients/test-utils.js +0 -27
- package/clients/test-utils.ts +0 -36
- package/clients/todo-scanner.js +0 -200
- package/clients/todo-scanner.test.js +0 -301
- package/clients/todo-scanner.test.ts +0 -352
- package/clients/tool-availability.js +0 -207
- package/clients/tree-sitter-client.js +0 -601
- package/clients/tree-sitter-query-loader.js +0 -355
- package/clients/tree-sitter-symbol-extractor.js +0 -289
- package/clients/ts-service.js +0 -129
- package/clients/type-coverage-client.js +0 -127
- package/clients/type-coverage-client.test.js +0 -105
- package/clients/type-coverage-client.test.ts +0 -125
- package/clients/type-safety-client.js +0 -138
- package/clients/types.js +0 -11
- package/clients/typescript-client.codefix.test.js +0 -157
- package/clients/typescript-client.codefix.test.ts +0 -186
- package/clients/typescript-client.js +0 -509
- package/clients/typescript-client.test.js +0 -105
- package/clients/typescript-client.test.ts +0 -126
- package/commands/booboo.js +0 -1007
- package/commands/fix-from-booboo.js +0 -398
- package/commands/fix-simplified.js +0 -618
- package/commands/rate.js +0 -281
- package/commands/rate.test.js +0 -119
- package/commands/rate.test.ts +0 -131
- package/commands/refactor.js +0 -130
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
2
|
-
import { createTempFile, setupTestEnvironment } from "./test-utils.js";
|
|
3
|
-
import { TypeScriptClient } from "./typescript-client.js";
|
|
4
|
-
describe("TypeScriptClient - Code Fixes", () => {
|
|
5
|
-
let client;
|
|
6
|
-
let tmpDir;
|
|
7
|
-
let cleanup;
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
client = new TypeScriptClient();
|
|
10
|
-
({ tmpDir, cleanup } = setupTestEnvironment("pi-lens-codefix-test-"));
|
|
11
|
-
});
|
|
12
|
-
afterEach(() => {
|
|
13
|
-
cleanup();
|
|
14
|
-
});
|
|
15
|
-
describe("getCodeFixes", () => {
|
|
16
|
-
it("should provide fix for missing property on object literal", () => {
|
|
17
|
-
// Real-world case: Missing required property in object literal
|
|
18
|
-
const content = `
|
|
19
|
-
interface Config {
|
|
20
|
-
name: string;
|
|
21
|
-
port: number;
|
|
22
|
-
debug: boolean;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const config: Config = {
|
|
26
|
-
name: "my-app",
|
|
27
|
-
port: 3000
|
|
28
|
-
// Missing 'debug' property - TS2345
|
|
29
|
-
};
|
|
30
|
-
`;
|
|
31
|
-
const filePath = createTempFile(tmpDir, "missing-property.ts", content);
|
|
32
|
-
client.addFile(filePath, content);
|
|
33
|
-
const diags = client.getDiagnostics(filePath);
|
|
34
|
-
const missingPropError = diags.find((d) => d.code === 2345 || d.message.includes("missing"));
|
|
35
|
-
if (missingPropError) {
|
|
36
|
-
const line = missingPropError.range.start.line;
|
|
37
|
-
const char = missingPropError.range.start.character;
|
|
38
|
-
const fixes = client.getCodeFixes(filePath, line, char, [
|
|
39
|
-
missingPropError.code,
|
|
40
|
-
]);
|
|
41
|
-
// TypeScript should suggest adding the missing property
|
|
42
|
-
expect(fixes.length).toBeGreaterThan(0);
|
|
43
|
-
const hasAddPropertyFix = fixes.some((f) => f.description.toLowerCase().includes("add") ||
|
|
44
|
-
f.description.toLowerCase().includes("property") ||
|
|
45
|
-
f.description.toLowerCase().includes("declare"));
|
|
46
|
-
expect(hasAddPropertyFix).toBe(true);
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
it("should provide fix for missing await in async function", () => {
|
|
50
|
-
// Real-world case: Forgetting await on a Promise-returning function
|
|
51
|
-
const content = `
|
|
52
|
-
async function fetchUser(id: string): Promise<{ name: string }> {
|
|
53
|
-
return { name: "John" };
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
async function getUserName(id: string): Promise<string> {
|
|
57
|
-
const user = fetchUser(id); // Missing await
|
|
58
|
-
return user.name; // Type 'Promise<{ name: string; }>' has no property 'name'
|
|
59
|
-
}
|
|
60
|
-
`;
|
|
61
|
-
const filePath = createTempFile(tmpDir, "missing-await.ts", content);
|
|
62
|
-
client.addFile(filePath, content);
|
|
63
|
-
const diags = client.getDiagnostics(filePath);
|
|
64
|
-
// TS2739: Type 'Promise<{ name: string; }>' is missing 'name'
|
|
65
|
-
const propertyError = diags.find((d) => d.code === 2739 || d.message.includes("is missing"));
|
|
66
|
-
if (propertyError) {
|
|
67
|
-
const fixes = client.getAllCodeFixes(filePath);
|
|
68
|
-
// If there's an error, check if we have fixes for it
|
|
69
|
-
const lineFixes = fixes.get(propertyError.range.start.line);
|
|
70
|
-
if (lineFixes) {
|
|
71
|
-
expect(lineFixes.length).toBeGreaterThan(0);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// Test passes if we get here - not all TS versions provide fixes for this
|
|
75
|
-
expect(true).toBe(true);
|
|
76
|
-
});
|
|
77
|
-
it("should provide fix for incorrect type assignment", () => {
|
|
78
|
-
// Real-world case: String instead of number
|
|
79
|
-
const content = `
|
|
80
|
-
function calculateTotal(price: number, tax: number): number {
|
|
81
|
-
return price + tax;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
const result = calculateTotal("100", 10); // TS2345: Argument of type 'string' is not assignable to parameter of type 'number'
|
|
85
|
-
`;
|
|
86
|
-
const filePath = createTempFile(tmpDir, "type-mismatch.ts", content);
|
|
87
|
-
client.addFile(filePath, content);
|
|
88
|
-
const diags = client.getDiagnostics(filePath);
|
|
89
|
-
const typeError = diags.find((d) => d.code === 2345);
|
|
90
|
-
if (typeError) {
|
|
91
|
-
const line = typeError.range.start.line;
|
|
92
|
-
const char = typeError.range.start.character;
|
|
93
|
-
const fixes = client.getCodeFixes(filePath, line, char, [2345]);
|
|
94
|
-
// TypeScript often suggests fixes for type mismatches
|
|
95
|
-
expect(fixes).toBeDefined();
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
it("should collect all fixes via getAllCodeFixes", () => {
|
|
99
|
-
// Multiple errors in one file
|
|
100
|
-
const content = `
|
|
101
|
-
interface Person {
|
|
102
|
-
name: string;
|
|
103
|
-
age: number;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
const person: Person = {
|
|
107
|
-
name: "Alice"
|
|
108
|
-
// Missing age
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
function greet(p: Person): string {
|
|
112
|
-
return "Hello " + p.name;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
greet({ name: "Bob" }); // Missing age in argument
|
|
116
|
-
`;
|
|
117
|
-
const filePath = createTempFile(tmpDir, "multiple-errors.ts", content);
|
|
118
|
-
client.addFile(filePath, content);
|
|
119
|
-
const allFixes = client.getAllCodeFixes(filePath);
|
|
120
|
-
// Should have fixes mapped by line number
|
|
121
|
-
expect(allFixes).toBeInstanceOf(Map);
|
|
122
|
-
// Each fix entry should have a description and changes
|
|
123
|
-
for (const [line, fixes] of allFixes.entries()) {
|
|
124
|
-
expect(typeof line).toBe("number");
|
|
125
|
-
expect(fixes.length).toBeGreaterThan(0);
|
|
126
|
-
for (const fix of fixes) {
|
|
127
|
-
expect(fix.description).toBeTruthy();
|
|
128
|
-
expect(fix.changes).toBeDefined();
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
describe("Integration with diagnostic messages", () => {
|
|
134
|
-
it("should include fix suggestions in getAllCodeFixes output", () => {
|
|
135
|
-
const content = `
|
|
136
|
-
class User {
|
|
137
|
-
constructor(public name: string) {}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const user = new User(); // TS2554: Expected 1 arguments, but got 0
|
|
141
|
-
`;
|
|
142
|
-
const filePath = createTempFile(tmpDir, "constructor-args.ts", content);
|
|
143
|
-
client.addFile(filePath, content);
|
|
144
|
-
const diags = client.getDiagnostics(filePath);
|
|
145
|
-
const argError = diags.find((d) => d.code === 2554);
|
|
146
|
-
if (argError) {
|
|
147
|
-
const fixes = client.getAllCodeFixes(filePath);
|
|
148
|
-
const lineFixes = fixes.get(argError.range.start.line);
|
|
149
|
-
if (lineFixes && lineFixes.length > 0) {
|
|
150
|
-
// The runner would append this to the message
|
|
151
|
-
const suggestion = lineFixes[0].description;
|
|
152
|
-
expect(suggestion).toBeTruthy();
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
});
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
2
|
-
import { createTempFile, setupTestEnvironment } from "./test-utils.js";
|
|
3
|
-
import { TypeScriptClient } from "./typescript-client.js";
|
|
4
|
-
|
|
5
|
-
describe("TypeScriptClient - Code Fixes", () => {
|
|
6
|
-
let client: TypeScriptClient;
|
|
7
|
-
let tmpDir: string;
|
|
8
|
-
let cleanup: () => void;
|
|
9
|
-
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
client = new TypeScriptClient();
|
|
12
|
-
({ tmpDir, cleanup } = setupTestEnvironment("pi-lens-codefix-test-"));
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
afterEach(() => {
|
|
16
|
-
cleanup();
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
describe("getCodeFixes", () => {
|
|
20
|
-
it("should provide fix for missing property on object literal", () => {
|
|
21
|
-
// Real-world case: Missing required property in object literal
|
|
22
|
-
const content = `
|
|
23
|
-
interface Config {
|
|
24
|
-
name: string;
|
|
25
|
-
port: number;
|
|
26
|
-
debug: boolean;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const config: Config = {
|
|
30
|
-
name: "my-app",
|
|
31
|
-
port: 3000
|
|
32
|
-
// Missing 'debug' property - TS2345
|
|
33
|
-
};
|
|
34
|
-
`;
|
|
35
|
-
const filePath = createTempFile(tmpDir, "missing-property.ts", content);
|
|
36
|
-
client.addFile(filePath, content);
|
|
37
|
-
|
|
38
|
-
const diags = client.getDiagnostics(filePath);
|
|
39
|
-
const missingPropError = diags.find(
|
|
40
|
-
(d) => d.code === 2345 || d.message.includes("missing"),
|
|
41
|
-
);
|
|
42
|
-
|
|
43
|
-
if (missingPropError) {
|
|
44
|
-
const line = missingPropError.range.start.line;
|
|
45
|
-
const char = missingPropError.range.start.character;
|
|
46
|
-
const fixes = client.getCodeFixes(filePath, line, char, [
|
|
47
|
-
missingPropError.code as number,
|
|
48
|
-
]);
|
|
49
|
-
|
|
50
|
-
// TypeScript should suggest adding the missing property
|
|
51
|
-
expect(fixes.length).toBeGreaterThan(0);
|
|
52
|
-
const hasAddPropertyFix = fixes.some(
|
|
53
|
-
(f) =>
|
|
54
|
-
f.description.toLowerCase().includes("add") ||
|
|
55
|
-
f.description.toLowerCase().includes("property") ||
|
|
56
|
-
f.description.toLowerCase().includes("declare"),
|
|
57
|
-
);
|
|
58
|
-
expect(hasAddPropertyFix).toBe(true);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
it("should provide fix for missing await in async function", () => {
|
|
63
|
-
// Real-world case: Forgetting await on a Promise-returning function
|
|
64
|
-
const content = `
|
|
65
|
-
async function fetchUser(id: string): Promise<{ name: string }> {
|
|
66
|
-
return { name: "John" };
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
async function getUserName(id: string): Promise<string> {
|
|
70
|
-
const user = fetchUser(id); // Missing await
|
|
71
|
-
return user.name; // Type 'Promise<{ name: string; }>' has no property 'name'
|
|
72
|
-
}
|
|
73
|
-
`;
|
|
74
|
-
const filePath = createTempFile(tmpDir, "missing-await.ts", content);
|
|
75
|
-
client.addFile(filePath, content);
|
|
76
|
-
|
|
77
|
-
const diags = client.getDiagnostics(filePath);
|
|
78
|
-
// TS2739: Type 'Promise<{ name: string; }>' is missing 'name'
|
|
79
|
-
const propertyError = diags.find(
|
|
80
|
-
(d) => d.code === 2739 || d.message.includes("is missing"),
|
|
81
|
-
);
|
|
82
|
-
|
|
83
|
-
if (propertyError) {
|
|
84
|
-
const fixes = client.getAllCodeFixes(filePath);
|
|
85
|
-
// If there's an error, check if we have fixes for it
|
|
86
|
-
const lineFixes = fixes.get(propertyError.range.start.line);
|
|
87
|
-
if (lineFixes) {
|
|
88
|
-
expect(lineFixes.length).toBeGreaterThan(0);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
// Test passes if we get here - not all TS versions provide fixes for this
|
|
92
|
-
expect(true).toBe(true);
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
it("should provide fix for incorrect type assignment", () => {
|
|
96
|
-
// Real-world case: String instead of number
|
|
97
|
-
const content = `
|
|
98
|
-
function calculateTotal(price: number, tax: number): number {
|
|
99
|
-
return price + tax;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
const result = calculateTotal("100", 10); // TS2345: Argument of type 'string' is not assignable to parameter of type 'number'
|
|
103
|
-
`;
|
|
104
|
-
const filePath = createTempFile(tmpDir, "type-mismatch.ts", content);
|
|
105
|
-
client.addFile(filePath, content);
|
|
106
|
-
|
|
107
|
-
const diags = client.getDiagnostics(filePath);
|
|
108
|
-
const typeError = diags.find((d) => d.code === 2345);
|
|
109
|
-
|
|
110
|
-
if (typeError) {
|
|
111
|
-
const line = typeError.range.start.line;
|
|
112
|
-
const char = typeError.range.start.character;
|
|
113
|
-
const fixes = client.getCodeFixes(filePath, line, char, [2345]);
|
|
114
|
-
|
|
115
|
-
// TypeScript often suggests fixes for type mismatches
|
|
116
|
-
expect(fixes).toBeDefined();
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
it("should collect all fixes via getAllCodeFixes", () => {
|
|
121
|
-
// Multiple errors in one file
|
|
122
|
-
const content = `
|
|
123
|
-
interface Person {
|
|
124
|
-
name: string;
|
|
125
|
-
age: number;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
const person: Person = {
|
|
129
|
-
name: "Alice"
|
|
130
|
-
// Missing age
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
function greet(p: Person): string {
|
|
134
|
-
return "Hello " + p.name;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
greet({ name: "Bob" }); // Missing age in argument
|
|
138
|
-
`;
|
|
139
|
-
const filePath = createTempFile(tmpDir, "multiple-errors.ts", content);
|
|
140
|
-
client.addFile(filePath, content);
|
|
141
|
-
|
|
142
|
-
const allFixes = client.getAllCodeFixes(filePath);
|
|
143
|
-
|
|
144
|
-
// Should have fixes mapped by line number
|
|
145
|
-
expect(allFixes).toBeInstanceOf(Map);
|
|
146
|
-
|
|
147
|
-
// Each fix entry should have a description and changes
|
|
148
|
-
for (const [line, fixes] of allFixes.entries()) {
|
|
149
|
-
expect(typeof line).toBe("number");
|
|
150
|
-
expect(fixes.length).toBeGreaterThan(0);
|
|
151
|
-
for (const fix of fixes) {
|
|
152
|
-
expect(fix.description).toBeTruthy();
|
|
153
|
-
expect(fix.changes).toBeDefined();
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
describe("Integration with diagnostic messages", () => {
|
|
160
|
-
it("should include fix suggestions in getAllCodeFixes output", () => {
|
|
161
|
-
const content = `
|
|
162
|
-
class User {
|
|
163
|
-
constructor(public name: string) {}
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
const user = new User(); // TS2554: Expected 1 arguments, but got 0
|
|
167
|
-
`;
|
|
168
|
-
const filePath = createTempFile(tmpDir, "constructor-args.ts", content);
|
|
169
|
-
client.addFile(filePath, content);
|
|
170
|
-
|
|
171
|
-
const diags = client.getDiagnostics(filePath);
|
|
172
|
-
const argError = diags.find((d) => d.code === 2554);
|
|
173
|
-
|
|
174
|
-
if (argError) {
|
|
175
|
-
const fixes = client.getAllCodeFixes(filePath);
|
|
176
|
-
const lineFixes = fixes.get(argError.range.start.line);
|
|
177
|
-
|
|
178
|
-
if (lineFixes && lineFixes.length > 0) {
|
|
179
|
-
// The runner would append this to the message
|
|
180
|
-
const suggestion = lineFixes[0].description;
|
|
181
|
-
expect(suggestion).toBeTruthy();
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
});
|