@tyvm/knowhow 0.0.90 → 0.0.91
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/.depcheckrc +31 -0
- package/bin/knowhow.js +1 -1
- package/package.json +4 -32
- package/src/agents/tools/executeScript/index.ts +5 -0
- package/src/agents/tools/googleSearch.ts +2 -2
- package/src/agents/tools/index.ts +0 -3
- package/src/agents/tools/list.ts +0 -147
- package/src/agents/tools/loadWebpage.ts +3 -113
- package/src/auth/browserLogin.ts +10 -13
- package/src/cli.ts +63 -3
- package/src/clients/gemini.ts +96 -25
- package/src/clients/http.ts +7 -11
- package/src/clients/pricing/google.ts +122 -26
- package/src/conversion.ts +24 -54
- package/src/index.ts +8 -1
- package/src/login.ts +5 -6
- package/src/plugins/language.ts +0 -4
- package/src/plugins/plugins.ts +0 -14
- package/src/plugins/url.ts +31 -12
- package/src/services/GitHub.ts +2 -2
- package/src/services/KnowhowClient.ts +34 -34
- package/src/{plugins/downloader/downloader.ts → services/MediaProcessorService.ts} +109 -267
- package/src/services/S3.ts +16 -16
- package/src/services/index.ts +4 -4
- package/src/services/modules/index.ts +10 -2
- package/src/services/modules/types.ts +5 -2
- package/src/services/script-execution/ScriptExecutor.ts +29 -10
- package/src/services/script-execution/ScriptPolicy.ts +6 -2
- package/src/types.ts +1 -0
- package/src/utils/http.ts +127 -0
- package/src/workers/auth/PasskeySetup.ts +7 -11
- package/tests/clients/AIClient.test.ts +24 -21
- package/tests/manual/file-edits/figma.test.ts +3 -70
- package/tests/plugins/language/languagePlugin-content-triggers.test.ts +2 -0
- package/tests/plugins/language/languagePlugin.test.ts +2 -0
- package/tests/processors/ToolResponseCache.test.ts +2 -2
- package/tests/test.spec.ts +0 -14
- package/tests/unit/modules/moduleLoading.test.ts +7 -4
- package/tests/unit/plugins/pluginLoading.test.ts +6 -6
- package/ts_build/package.json +4 -32
- package/ts_build/src/agents/tools/ast/astAppendNode.d.ts +1 -1
- package/ts_build/src/agents/tools/ast/astAppendNode.js +2 -90
- package/ts_build/src/agents/tools/ast/astAppendNode.js.map +1 -1
- package/ts_build/src/agents/tools/ast/astDeleteNode.d.ts +1 -1
- package/ts_build/src/agents/tools/ast/astDeleteNode.js +2 -88
- package/ts_build/src/agents/tools/ast/astDeleteNode.js.map +1 -1
- package/ts_build/src/agents/tools/ast/astEditNode.d.ts +1 -1
- package/ts_build/src/agents/tools/ast/astEditNode.js +2 -90
- package/ts_build/src/agents/tools/ast/astEditNode.js.map +1 -1
- package/ts_build/src/agents/tools/ast/astGetPathForLine.d.ts +1 -1
- package/ts_build/src/agents/tools/ast/astGetPathForLine.js +2 -72
- package/ts_build/src/agents/tools/ast/astGetPathForLine.js.map +1 -1
- package/ts_build/src/agents/tools/ast/astListPaths.d.ts +1 -1
- package/ts_build/src/agents/tools/ast/astListPaths.js +2 -72
- package/ts_build/src/agents/tools/ast/astListPaths.js.map +1 -1
- package/ts_build/src/agents/tools/executeScript/index.d.ts +3 -2
- package/ts_build/src/agents/tools/executeScript/index.js +4 -1
- package/ts_build/src/agents/tools/executeScript/index.js.map +1 -1
- package/ts_build/src/agents/tools/googleSearch.js +2 -2
- package/ts_build/src/agents/tools/googleSearch.js.map +1 -1
- package/ts_build/src/agents/tools/index.d.ts +0 -3
- package/ts_build/src/agents/tools/index.js +0 -3
- package/ts_build/src/agents/tools/index.js.map +1 -1
- package/ts_build/src/agents/tools/list.js +0 -138
- package/ts_build/src/agents/tools/list.js.map +1 -1
- package/ts_build/src/agents/tools/loadWebpage.js +1 -89
- package/ts_build/src/agents/tools/loadWebpage.js.map +1 -1
- package/ts_build/src/agents/tools/textSearch.d.ts +1 -1
- package/ts_build/src/auth/browserLogin.js +7 -7
- package/ts_build/src/auth/browserLogin.js.map +1 -1
- package/ts_build/src/cli.d.ts +1 -1
- package/ts_build/src/cli.js +47 -1
- package/ts_build/src/cli.js.map +1 -1
- package/ts_build/src/clients/gemini.d.ts +1 -73
- package/ts_build/src/clients/gemini.js +57 -19
- package/ts_build/src/clients/gemini.js.map +1 -1
- package/ts_build/src/clients/http.js +5 -9
- package/ts_build/src/clients/http.js.map +1 -1
- package/ts_build/src/clients/pricing/google.d.ts +17 -73
- package/ts_build/src/clients/pricing/google.js +47 -10
- package/ts_build/src/clients/pricing/google.js.map +1 -1
- package/ts_build/src/conversion.d.ts +1 -4
- package/ts_build/src/conversion.js +12 -27
- package/ts_build/src/conversion.js.map +1 -1
- package/ts_build/src/index.d.ts +4 -0
- package/ts_build/src/index.js +7 -1
- package/ts_build/src/index.js.map +1 -1
- package/ts_build/src/login.js +5 -4
- package/ts_build/src/login.js.map +1 -1
- package/ts_build/src/plugins/downloader/downloader.js +3 -3
- package/ts_build/src/plugins/downloader/downloader.js.map +1 -1
- package/ts_build/src/plugins/language.js.map +1 -1
- package/ts_build/src/plugins/plugins.js +0 -14
- package/ts_build/src/plugins/plugins.js.map +1 -1
- package/ts_build/src/plugins/tree-sitter/editor.d.ts +3 -32
- package/ts_build/src/plugins/tree-sitter/editor.js +6 -208
- package/ts_build/src/plugins/tree-sitter/editor.js.map +1 -1
- package/ts_build/src/plugins/tree-sitter/parser.d.ts +19 -54
- package/ts_build/src/plugins/tree-sitter/parser.js +19 -293
- package/ts_build/src/plugins/tree-sitter/parser.js.map +1 -1
- package/ts_build/src/plugins/tree-sitter/simple-paths.d.ts +2 -15
- package/ts_build/src/plugins/tree-sitter/simple-paths.js +2 -324
- package/ts_build/src/plugins/tree-sitter/simple-paths.js.map +1 -1
- package/ts_build/src/plugins/url.js +27 -8
- package/ts_build/src/plugins/url.js.map +1 -1
- package/ts_build/src/services/GitHub.js +2 -2
- package/ts_build/src/services/GitHub.js.map +1 -1
- package/ts_build/src/services/KnowhowClient.d.ts +29 -29
- package/ts_build/src/services/KnowhowClient.js +33 -33
- package/ts_build/src/services/KnowhowClient.js.map +1 -1
- package/ts_build/src/services/MediaProcessorService.d.ts +22 -0
- package/ts_build/src/services/MediaProcessorService.js +215 -0
- package/ts_build/src/services/MediaProcessorService.js.map +1 -0
- package/ts_build/src/services/S3.js +12 -18
- package/ts_build/src/services/S3.js.map +1 -1
- package/ts_build/src/services/index.d.ts +3 -2
- package/ts_build/src/services/index.js +3 -3
- package/ts_build/src/services/index.js.map +1 -1
- package/ts_build/src/services/modules/index.js +10 -2
- package/ts_build/src/services/modules/index.js.map +1 -1
- package/ts_build/src/services/modules/types.d.ts +5 -2
- package/ts_build/src/services/script-execution/ScriptExecutor.js +22 -7
- package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -1
- package/ts_build/src/services/script-execution/ScriptPolicy.d.ts +1 -1
- package/ts_build/src/services/script-execution/ScriptPolicy.js +4 -2
- package/ts_build/src/services/script-execution/ScriptPolicy.js.map +1 -1
- package/ts_build/src/types.d.ts +1 -0
- package/ts_build/src/types.js +1 -0
- package/ts_build/src/types.js.map +1 -1
- package/ts_build/src/utils/http.d.ts +27 -0
- package/ts_build/src/utils/http.js +98 -0
- package/ts_build/src/utils/http.js.map +1 -0
- package/ts_build/src/workers/auth/PasskeySetup.js +6 -7
- package/ts_build/src/workers/auth/PasskeySetup.js.map +1 -1
- package/ts_build/tests/clients/AIClient.test.js +11 -14
- package/ts_build/tests/clients/AIClient.test.js.map +1 -1
- package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -1
- package/ts_build/tests/manual/file-edits/figma.test.js +1 -46
- package/ts_build/tests/manual/file-edits/figma.test.js.map +1 -1
- package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +2 -0
- package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +1 -1
- package/ts_build/tests/plugins/language/languagePlugin.test.js +2 -0
- package/ts_build/tests/plugins/language/languagePlugin.test.js.map +1 -1
- package/ts_build/tests/processors/ToolResponseCache.test.js +2 -2
- package/ts_build/tests/processors/ToolResponseCache.test.js.map +1 -1
- package/ts_build/tests/test.spec.js +0 -14
- package/ts_build/tests/test.spec.js.map +1 -1
- package/ts_build/tests/tree-sitter/tree-sitter.test.d.ts +0 -1
- package/ts_build/tests/tree-sitter/tree-sitter.test.js +2 -183
- package/ts_build/tests/tree-sitter/tree-sitter.test.js.map +1 -1
- package/ts_build/tests/unit/modules/moduleLoading.test.js +6 -4
- package/ts_build/tests/unit/modules/moduleLoading.test.js.map +1 -1
- package/ts_build/tests/unit/plugins/pluginLoading.test.js +4 -4
- package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +1 -1
- package/benchmarks/.dockerignore +0 -7
- package/benchmarks/README.md +0 -166
- package/benchmarks/docker/Dockerfile +0 -68
- package/benchmarks/example-config.yml +0 -27
- package/benchmarks/jest.config.js +0 -13
- package/benchmarks/package-lock.json +0 -4297
- package/benchmarks/package.json +0 -39
- package/benchmarks/results/27b0a06/2025-09-27/xai/xai-grok-code-fast-1.json +0 -2909
- package/benchmarks/results/4057aed/2025-08-14/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -1671
- package/benchmarks/results/4542435/2025-08-05/lms/lms-openai-gpt-oss-20b.json +0 -2814
- package/benchmarks/results/4542435/2025-08-05/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -2014
- package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3121
- package/benchmarks/results/5766aee/2025-08-02/lms-qwen/qwen3-coder-30b.json +0 -98
- package/benchmarks/results/6d73808/2025-08-07/openai/openai-gpt-5.json +0 -3256
- package/benchmarks/results/77bf0a6/2025-08-02/lms-qwen/qwen3-30b-a3b-2507.json +0 -4298
- package/benchmarks/results/8c0d445/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3031
- package/benchmarks/results/8c0d445/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -2990
- package/benchmarks/results/ac6b2ab/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3256
- package/benchmarks/results/ac6b2ab/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3007
- package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -3256
- package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-mini-2025-04-14.json +0 -3036
- package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-nano-2025-04-14.json +0 -3280
- package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -1920
- package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-coder-30b.json +0 -3281
- package/benchmarks/results/b502ed9/2025-08-03/lms-qwen/qwen3-coder-30b.json +0 -2896
- package/benchmarks/results/d1a8129/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3011
- package/benchmarks/results/e60471c/2025-08-03/lms/qwen3-30b-a3b-2507.json +0 -3003
- package/benchmarks/scripts/build-and-run.sh +0 -47
- package/benchmarks/scripts/clone-exercism.sh +0 -92
- package/benchmarks/scripts/validate.sh +0 -48
- package/benchmarks/src/__tests__/runner.test.ts +0 -27
- package/benchmarks/src/cli.ts +0 -90
- package/benchmarks/src/evaluators/EvaluatorRegistry.ts +0 -64
- package/benchmarks/src/evaluators/JavaScriptEvaluator.ts +0 -183
- package/benchmarks/src/evaluators/index.ts +0 -3
- package/benchmarks/src/evaluators/types.ts +0 -22
- package/benchmarks/src/index.ts +0 -3
- package/benchmarks/src/providers.ts +0 -13
- package/benchmarks/src/runner.ts +0 -824
- package/benchmarks/src/types.ts +0 -63
- package/benchmarks/tsconfig.json +0 -19
- package/leaderboard/README.md +0 -148
- package/leaderboard/app/api/benchmark-data/route.ts +0 -131
- package/leaderboard/app/api/benchmark-detail/route.ts +0 -172
- package/leaderboard/app/details/[model]/[provider]/[language]/page.tsx +0 -501
- package/leaderboard/app/exercise/[model]/[provider]/[language]/[exercise]/page.tsx +0 -375
- package/leaderboard/app/globals.css +0 -27
- package/leaderboard/app/layout.tsx +0 -21
- package/leaderboard/app/page.tsx +0 -170
- package/leaderboard/components/LeaderboardTable.tsx +0 -168
- package/leaderboard/components/PerformanceChart.tsx +0 -109
- package/leaderboard/next-env.d.ts +0 -5
- package/leaderboard/next.config.js +0 -4
- package/leaderboard/package-lock.json +0 -6363
- package/leaderboard/package.json +0 -28
- package/leaderboard/postcss.config.js +0 -6
- package/leaderboard/tailwind.config.js +0 -17
- package/leaderboard/tsconfig.json +0 -28
- package/leaderboard/types/benchmark.ts +0 -67
- package/leaderboard/utils/dataProcessor.ts +0 -33
- package/src/agents/tools/asana/definitions.ts +0 -199
- package/src/agents/tools/asana/index.ts +0 -108
- package/src/agents/tools/ast/astAppendNode.ts +0 -90
- package/src/agents/tools/ast/astDeleteNode.ts +0 -88
- package/src/agents/tools/ast/astEditNode.ts +0 -95
- package/src/agents/tools/ast/astGetPathForLine.ts +0 -73
- package/src/agents/tools/ast/astListPaths.ts +0 -66
- package/src/agents/tools/ast/index.ts +0 -7
- package/src/agents/tools/github/definitions.ts +0 -89
- package/src/agents/tools/github/index.ts +0 -67
- package/src/chat-old.ts +0 -446
- package/src/plugins/asana.ts +0 -146
- package/src/plugins/downloader/plugin.ts +0 -103
- package/src/plugins/downloader/types.ts +0 -92
- package/src/plugins/figma.ts +0 -158
- package/src/plugins/github.ts +0 -219
- package/src/plugins/jira.ts +0 -115
- package/src/plugins/linear.ts +0 -230
- package/src/plugins/notion.ts +0 -179
- package/src/plugins/tree-sitter/editor.ts +0 -369
- package/src/plugins/tree-sitter/lang-packs/index.ts +0 -23
- package/src/plugins/tree-sitter/lang-packs/java.ts +0 -59
- package/src/plugins/tree-sitter/lang-packs/javascript.ts +0 -57
- package/src/plugins/tree-sitter/lang-packs/python.ts +0 -45
- package/src/plugins/tree-sitter/lang-packs/types.ts +0 -79
- package/src/plugins/tree-sitter/lang-packs/typescript.ts +0 -49
- package/src/plugins/tree-sitter/parser.ts +0 -470
- package/src/plugins/tree-sitter/simple-paths.ts +0 -467
- package/tests/tree-sitter/editor.test.ts +0 -113
- package/tests/tree-sitter/invalid.test.ts +0 -299
- package/tests/tree-sitter/paths/common-edits.test.ts +0 -564
- package/tests/tree-sitter/paths/debug-exact-position.test.ts +0 -44
- package/tests/tree-sitter/paths/debug-line-indexing.test.ts +0 -49
- package/tests/tree-sitter/paths/debug-paths.test.ts +0 -90
- package/tests/tree-sitter/paths/paths.test.ts +0 -170
- package/tests/tree-sitter/paths/simple-paths.test.ts +0 -367
- package/tests/tree-sitter/sample-after.ts +0 -48
- package/tests/tree-sitter/sample-before.ts +0 -25
- package/tests/tree-sitter/test-files/completely-broken.ts +0 -7
- package/tests/tree-sitter/test-files/duplicate-braces.ts +0 -39
- package/tests/tree-sitter/test-files/invalid-nesting.ts +0 -39
- package/tests/tree-sitter/test-files/malformed-signature.ts +0 -39
- package/tests/tree-sitter/test-files/mismatched-parens.ts +0 -39
- package/tests/tree-sitter/test-files/missing-semicolon.ts +0 -39
- package/tests/tree-sitter/test-files/partially-broken.ts +0 -20
- package/tests/tree-sitter/test-files/specific-errors.ts +0 -14
- package/tests/tree-sitter/test-files/unclosed-string.ts +0 -39
- package/tests/tree-sitter/tree-sitter.test.ts +0 -251
|
@@ -1,299 +0,0 @@
|
|
|
1
|
-
import { LanguageAgnosticParser } from "../../src/plugins/tree-sitter/parser";
|
|
2
|
-
import { TreeEditor } from "../../src/plugins/tree-sitter/editor";
|
|
3
|
-
import { writeFileSync, mkdirSync } from "fs";
|
|
4
|
-
import { join } from "path";
|
|
5
|
-
|
|
6
|
-
describe("Invalid Syntax Handling", () => {
|
|
7
|
-
let parser: LanguageAgnosticParser;
|
|
8
|
-
|
|
9
|
-
beforeEach(() => {
|
|
10
|
-
parser = LanguageAgnosticParser.createTypeScriptParser();
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
// Create test files directory if it doesn't exist
|
|
14
|
-
const testFilesDir = join(__dirname, "test-files");
|
|
15
|
-
try {
|
|
16
|
-
mkdirSync(testFilesDir, { recursive: true });
|
|
17
|
-
} catch (e) {
|
|
18
|
-
// Directory might already exist
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const validTypeScriptCode = `export class Calculator {
|
|
22
|
-
private result: number = 0;
|
|
23
|
-
|
|
24
|
-
add(value: number): Calculator {
|
|
25
|
-
this.result += value;
|
|
26
|
-
return this;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
subtract(value: number): Calculator {
|
|
30
|
-
this.result -= value;
|
|
31
|
-
return this;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
multiply(value: number): Calculator {
|
|
35
|
-
this.result *= value;
|
|
36
|
-
return this;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
getResult(): number {
|
|
40
|
-
return this.result;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function createCalculator(): Calculator {
|
|
45
|
-
return new Calculator();
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
describe("Calculator Tests", () => {
|
|
49
|
-
it("should perform basic arithmetic", () => {
|
|
50
|
-
const calc = createCalculator();
|
|
51
|
-
const result = calc.add(5).multiply(2).subtract(3).getResult();
|
|
52
|
-
expect(result).toBe(7);
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
it("should chain operations correctly", () => {
|
|
56
|
-
const calc = new Calculator();
|
|
57
|
-
expect(calc.add(10).add(5).getResult()).toBe(15);
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
`;
|
|
61
|
-
|
|
62
|
-
it("should parse valid TypeScript syntax correctly", () => {
|
|
63
|
-
const tree = parser.parseString(validTypeScriptCode);
|
|
64
|
-
expect(tree.rootNode.hasError).toBe(false);
|
|
65
|
-
expect(tree.rootNode.text).toBe(validTypeScriptCode);
|
|
66
|
-
|
|
67
|
-
// Verify we can find expected elements
|
|
68
|
-
const classes = parser.findClassDeclarations(tree);
|
|
69
|
-
expect(classes).toHaveLength(1);
|
|
70
|
-
|
|
71
|
-
const methods = parser.findMethodDeclarations(tree);
|
|
72
|
-
expect(methods.length).toBeGreaterThan(0);
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
it("should detect syntax errors with duplicated closing braces", () => {
|
|
76
|
-
const invalidCode = validTypeScriptCode.replace(
|
|
77
|
-
"return this.result;\n }",
|
|
78
|
-
"return this.result;\n }}" // Extra closing brace
|
|
79
|
-
);
|
|
80
|
-
|
|
81
|
-
writeFileSync(join(testFilesDir, "duplicate-braces.ts"), invalidCode);
|
|
82
|
-
|
|
83
|
-
const tree = parser.parseString(invalidCode);
|
|
84
|
-
expect(tree.rootNode.hasError).toBe(true);
|
|
85
|
-
|
|
86
|
-
// Should still be able to parse most of the structure
|
|
87
|
-
const classes = parser.findClassDeclarations(tree);
|
|
88
|
-
expect(classes).toHaveLength(1);
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
it("should detect syntax errors with mismatched parentheses", () => {
|
|
92
|
-
const invalidCode = validTypeScriptCode.replace(
|
|
93
|
-
"add(value: number): Calculator {",
|
|
94
|
-
"add(value: number: Calculator {" // Missing closing parenthesis, extra colon
|
|
95
|
-
);
|
|
96
|
-
|
|
97
|
-
writeFileSync(join(testFilesDir, "mismatched-parens.ts"), invalidCode);
|
|
98
|
-
|
|
99
|
-
const tree = parser.parseString(invalidCode);
|
|
100
|
-
expect(tree.rootNode.hasError).toBe(true);
|
|
101
|
-
|
|
102
|
-
// Verify error location can be identified
|
|
103
|
-
const errorNodes = parser.findErrorNodes(tree.rootNode);
|
|
104
|
-
expect(errorNodes.length).toBeGreaterThan(0);
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it("should detect syntax errors with missing semicolons in critical positions", () => {
|
|
108
|
-
const invalidCode = validTypeScriptCode.replace(
|
|
109
|
-
"private result: number = 0;",
|
|
110
|
-
"private result: number = 0" // Missing semicolon
|
|
111
|
-
);
|
|
112
|
-
|
|
113
|
-
writeFileSync(join(testFilesDir, "missing-semicolon.ts"), invalidCode);
|
|
114
|
-
|
|
115
|
-
const tree = parser.parseString(invalidCode);
|
|
116
|
-
// Note: Missing semicolons might not always cause parse errors in TypeScript
|
|
117
|
-
// as ASI (Automatic Semicolon Insertion) can handle many cases
|
|
118
|
-
|
|
119
|
-
// But we can still analyze the tree structure
|
|
120
|
-
const classes = parser.findClassDeclarations(tree);
|
|
121
|
-
expect(classes).toHaveLength(1);
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
it("should detect syntax errors with malformed function signatures", () => {
|
|
125
|
-
const invalidCode = validTypeScriptCode.replace(
|
|
126
|
-
"subtract(value: number): Calculator {",
|
|
127
|
-
"subtract(value number): Calculator {" // Missing colon before type
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
writeFileSync(join(testFilesDir, "malformed-signature.ts"), invalidCode);
|
|
131
|
-
|
|
132
|
-
const tree = parser.parseString(invalidCode);
|
|
133
|
-
expect(tree.rootNode.hasError).toBe(true);
|
|
134
|
-
|
|
135
|
-
const errorNodes = parser.findErrorNodes(tree.rootNode);
|
|
136
|
-
expect(errorNodes.length).toBeGreaterThan(0);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it("should detect syntax errors with unclosed string literals", () => {
|
|
140
|
-
const invalidCode = validTypeScriptCode.replace(
|
|
141
|
-
"expect(result).toBe(7);",
|
|
142
|
-
'expect(result).toBe("unclosed string;' // Unclosed string literal
|
|
143
|
-
);
|
|
144
|
-
|
|
145
|
-
writeFileSync(join(testFilesDir, "unclosed-string.ts"), invalidCode);
|
|
146
|
-
|
|
147
|
-
const tree = parser.parseString(invalidCode);
|
|
148
|
-
expect(tree.rootNode.hasError).toBe(true);
|
|
149
|
-
|
|
150
|
-
const errorNodes = parser.findErrorNodes(tree.rootNode);
|
|
151
|
-
expect(errorNodes.length).toBeGreaterThan(0);
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
it("should detect syntax errors with invalid bracket nesting", () => {
|
|
155
|
-
const invalidCode = validTypeScriptCode.replace(
|
|
156
|
-
'describe("Calculator Tests", () => {',
|
|
157
|
-
'describe("Calculator Tests", (() => {' // Extra opening parenthesis
|
|
158
|
-
);
|
|
159
|
-
|
|
160
|
-
writeFileSync(join(testFilesDir, "invalid-nesting.ts"), invalidCode);
|
|
161
|
-
|
|
162
|
-
const tree = parser.parseString(invalidCode);
|
|
163
|
-
expect(tree.rootNode.hasError).toBe(true);
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it("should handle completely broken syntax gracefully", () => {
|
|
167
|
-
const completelyBroken = `
|
|
168
|
-
class {{{ invalid syntax here
|
|
169
|
-
function missing_name() {
|
|
170
|
-
return "broken"
|
|
171
|
-
missing closing brace
|
|
172
|
-
export const = undefined;
|
|
173
|
-
`;
|
|
174
|
-
|
|
175
|
-
writeFileSync(join(testFilesDir, "completely-broken.ts"), completelyBroken);
|
|
176
|
-
|
|
177
|
-
const tree = parser.parseString(completelyBroken);
|
|
178
|
-
expect(tree.rootNode.hasError).toBe(true);
|
|
179
|
-
|
|
180
|
-
// Even with broken syntax, tree-sitter should not crash
|
|
181
|
-
const errorNodes = parser.findErrorNodes(tree.rootNode);
|
|
182
|
-
expect(errorNodes.length).toBeGreaterThan(0);
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
it("should identify specific error locations in broken code", () => {
|
|
186
|
-
const invalidCode = `
|
|
187
|
-
export class TestClass {
|
|
188
|
-
method1() {
|
|
189
|
-
return "valid";
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
method2( { // Missing parameter, extra opening brace
|
|
193
|
-
return "broken";
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
method3() {
|
|
197
|
-
return "valid again";
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
`;
|
|
201
|
-
|
|
202
|
-
writeFileSync(join(testFilesDir, "specific-errors.ts"), invalidCode);
|
|
203
|
-
|
|
204
|
-
const tree = parser.parseString(invalidCode);
|
|
205
|
-
expect(tree.rootNode.hasError).toBe(true);
|
|
206
|
-
|
|
207
|
-
const errorNodes = parser.findErrorNodes(tree.rootNode);
|
|
208
|
-
expect(errorNodes.length).toBeGreaterThan(0);
|
|
209
|
-
|
|
210
|
-
// Check that we can still find some valid parts
|
|
211
|
-
const classes = parser.findClassDeclarations(tree);
|
|
212
|
-
expect(classes).toHaveLength(1);
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
it("should test TreeEditor behavior with invalid syntax", () => {
|
|
216
|
-
const editor = new TreeEditor(parser, validTypeScriptCode);
|
|
217
|
-
|
|
218
|
-
// Test that TreeEditor can handle the valid code
|
|
219
|
-
expect(editor.getCurrentText()).toBe(validTypeScriptCode);
|
|
220
|
-
expect(editor.getTree().rootNode.hasError).toBe(false);
|
|
221
|
-
|
|
222
|
-
// Test creating TreeEditor with invalid syntax directly
|
|
223
|
-
const invalidCode = validTypeScriptCode.replace(
|
|
224
|
-
"add(value: number): Calculator {",
|
|
225
|
-
"add(value number): Calculator {" // Missing colon before type
|
|
226
|
-
);
|
|
227
|
-
|
|
228
|
-
const invalidEditor = new TreeEditor(parser, invalidCode);
|
|
229
|
-
|
|
230
|
-
// The invalid editor tree should have errors
|
|
231
|
-
expect(invalidEditor.getTree().rootNode.hasError).toBe(true);
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
it("should test semantic diffing with broken syntax changes", () => {
|
|
235
|
-
const originalEditor = new TreeEditor(parser, validTypeScriptCode);
|
|
236
|
-
|
|
237
|
-
// Create a version with broken syntax
|
|
238
|
-
const brokenCode = validTypeScriptCode.replace(
|
|
239
|
-
"add(value: number): Calculator {",
|
|
240
|
-
"add(value number): Calculator {" // Missing colon before type
|
|
241
|
-
);
|
|
242
|
-
|
|
243
|
-
const brokenEditor = new TreeEditor(
|
|
244
|
-
parser,
|
|
245
|
-
brokenCode,
|
|
246
|
-
validTypeScriptCode
|
|
247
|
-
);
|
|
248
|
-
|
|
249
|
-
// Generate diff
|
|
250
|
-
const diff = brokenEditor.generateDiff();
|
|
251
|
-
expect(diff).toContain("-");
|
|
252
|
-
expect(diff).toContain("+");
|
|
253
|
-
|
|
254
|
-
// Verify the broken version has errors
|
|
255
|
-
expect(brokenEditor.getTree().rootNode.hasError).toBe(true);
|
|
256
|
-
|
|
257
|
-
// Verify original doesn't have errors
|
|
258
|
-
expect(originalEditor.getTree().rootNode.hasError).toBe(false);
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
it("should preserve partial tree structure even with syntax errors", () => {
|
|
262
|
-
const partiallyBrokenCode = `
|
|
263
|
-
export class Calculator {
|
|
264
|
-
private result: number = 0;
|
|
265
|
-
|
|
266
|
-
add(value: number): Calculator {
|
|
267
|
-
this.result += value;
|
|
268
|
-
return this;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// This method has broken syntax
|
|
272
|
-
subtract(value number): Calculator { // Missing colon
|
|
273
|
-
this.result -= value;
|
|
274
|
-
return this;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
multiply(value: number): Calculator {
|
|
278
|
-
this.result *= value;
|
|
279
|
-
return this;
|
|
280
|
-
}
|
|
281
|
-
}`;
|
|
282
|
-
|
|
283
|
-
writeFileSync(
|
|
284
|
-
join(testFilesDir, "partially-broken.ts"),
|
|
285
|
-
partiallyBrokenCode
|
|
286
|
-
);
|
|
287
|
-
|
|
288
|
-
const tree = parser.parseString(partiallyBrokenCode);
|
|
289
|
-
expect(tree.rootNode.hasError).toBe(true);
|
|
290
|
-
|
|
291
|
-
// Despite errors, we should still be able to find the class
|
|
292
|
-
const classes = parser.findClassDeclarations(tree);
|
|
293
|
-
expect(classes).toHaveLength(1);
|
|
294
|
-
|
|
295
|
-
// And some methods might still be parseable
|
|
296
|
-
const methods = parser.findMethodDeclarations(tree);
|
|
297
|
-
expect(methods.length).toBeGreaterThan(0);
|
|
298
|
-
});
|
|
299
|
-
});
|