@tyvm/knowhow 0.0.90 → 0.0.92

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 (272) hide show
  1. package/.depcheckrc +30 -0
  2. package/bin/knowhow.js +1 -1
  3. package/package.json +8 -34
  4. package/src/agents/configurable/ConfigAgent.ts +2 -2
  5. package/src/agents/tools/executeScript/index.ts +5 -0
  6. package/src/agents/tools/googleSearch.ts +2 -2
  7. package/src/agents/tools/index.ts +0 -3
  8. package/src/agents/tools/list.ts +0 -147
  9. package/src/agents/tools/loadWebpage.ts +3 -113
  10. package/src/auth/browserLogin.ts +10 -13
  11. package/src/chat/modules/AgentModule.ts +0 -1
  12. package/src/chat/types.ts +1 -1
  13. package/src/cli.ts +63 -3
  14. package/src/clients/gemini.ts +96 -25
  15. package/src/clients/http.ts +7 -11
  16. package/src/clients/pricing/google.ts +122 -26
  17. package/src/conversion.ts +24 -54
  18. package/src/index.ts +15 -20
  19. package/src/login.ts +5 -6
  20. package/src/plugins/language.ts +0 -4
  21. package/src/plugins/plugins.ts +0 -14
  22. package/src/plugins/url.ts +31 -12
  23. package/src/services/EmbeddingsService.ts +70 -0
  24. package/src/services/KnowhowClient.ts +34 -34
  25. package/src/{plugins/downloader/downloader.ts → services/MediaProcessorService.ts} +109 -267
  26. package/src/services/S3.ts +19 -87
  27. package/src/services/index.ts +8 -8
  28. package/src/services/modules/index.ts +12 -3
  29. package/src/services/modules/types.ts +8 -2
  30. package/src/services/script-execution/ScriptExecutor.ts +29 -10
  31. package/src/services/script-execution/ScriptPolicy.ts +6 -2
  32. package/src/types.ts +1 -0
  33. package/src/utils/http.ts +127 -0
  34. package/src/workers/auth/PasskeySetup.ts +7 -11
  35. package/tests/clients/AIClient.test.ts +24 -21
  36. package/tests/manual/file-edits/figma.test.ts +3 -70
  37. package/tests/plugins/language/languagePlugin-content-triggers.test.ts +2 -0
  38. package/tests/plugins/language/languagePlugin.test.ts +2 -0
  39. package/tests/processors/ToolResponseCache.test.ts +2 -2
  40. package/tests/test.spec.ts +0 -14
  41. package/tests/unit/modules/moduleLoading.test.ts +12 -4
  42. package/tests/unit/plugins/pluginLoading.test.ts +6 -6
  43. package/ts_build/package.json +8 -34
  44. package/ts_build/src/agents/tools/ast/astAppendNode.d.ts +1 -1
  45. package/ts_build/src/agents/tools/ast/astAppendNode.js +2 -90
  46. package/ts_build/src/agents/tools/ast/astAppendNode.js.map +1 -1
  47. package/ts_build/src/agents/tools/ast/astDeleteNode.d.ts +1 -1
  48. package/ts_build/src/agents/tools/ast/astDeleteNode.js +2 -88
  49. package/ts_build/src/agents/tools/ast/astDeleteNode.js.map +1 -1
  50. package/ts_build/src/agents/tools/ast/astEditNode.d.ts +1 -1
  51. package/ts_build/src/agents/tools/ast/astEditNode.js +2 -90
  52. package/ts_build/src/agents/tools/ast/astEditNode.js.map +1 -1
  53. package/ts_build/src/agents/tools/ast/astGetPathForLine.d.ts +1 -1
  54. package/ts_build/src/agents/tools/ast/astGetPathForLine.js +2 -72
  55. package/ts_build/src/agents/tools/ast/astGetPathForLine.js.map +1 -1
  56. package/ts_build/src/agents/tools/ast/astListPaths.d.ts +1 -1
  57. package/ts_build/src/agents/tools/ast/astListPaths.js +2 -72
  58. package/ts_build/src/agents/tools/ast/astListPaths.js.map +1 -1
  59. package/ts_build/src/agents/tools/executeScript/index.d.ts +3 -2
  60. package/ts_build/src/agents/tools/executeScript/index.js +4 -1
  61. package/ts_build/src/agents/tools/executeScript/index.js.map +1 -1
  62. package/ts_build/src/agents/tools/googleSearch.js +2 -2
  63. package/ts_build/src/agents/tools/googleSearch.js.map +1 -1
  64. package/ts_build/src/agents/tools/index.d.ts +0 -3
  65. package/ts_build/src/agents/tools/index.js +0 -3
  66. package/ts_build/src/agents/tools/index.js.map +1 -1
  67. package/ts_build/src/agents/tools/list.js +0 -138
  68. package/ts_build/src/agents/tools/list.js.map +1 -1
  69. package/ts_build/src/agents/tools/loadWebpage.js +1 -89
  70. package/ts_build/src/agents/tools/loadWebpage.js.map +1 -1
  71. package/ts_build/src/agents/tools/textSearch.d.ts +1 -1
  72. package/ts_build/src/auth/browserLogin.js +7 -7
  73. package/ts_build/src/auth/browserLogin.js.map +1 -1
  74. package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
  75. package/ts_build/src/chat/types.d.ts +1 -1
  76. package/ts_build/src/cli.d.ts +1 -1
  77. package/ts_build/src/cli.js +47 -1
  78. package/ts_build/src/cli.js.map +1 -1
  79. package/ts_build/src/clients/gemini.d.ts +1 -73
  80. package/ts_build/src/clients/gemini.js +57 -19
  81. package/ts_build/src/clients/gemini.js.map +1 -1
  82. package/ts_build/src/clients/http.js +5 -9
  83. package/ts_build/src/clients/http.js.map +1 -1
  84. package/ts_build/src/clients/pricing/google.d.ts +17 -73
  85. package/ts_build/src/clients/pricing/google.js +47 -10
  86. package/ts_build/src/clients/pricing/google.js.map +1 -1
  87. package/ts_build/src/conversion.d.ts +1 -4
  88. package/ts_build/src/conversion.js +12 -27
  89. package/ts_build/src/conversion.js.map +1 -1
  90. package/ts_build/src/index.d.ts +4 -0
  91. package/ts_build/src/index.js +15 -14
  92. package/ts_build/src/index.js.map +1 -1
  93. package/ts_build/src/login.js +5 -4
  94. package/ts_build/src/login.js.map +1 -1
  95. package/ts_build/src/plugins/downloader/downloader.js +3 -3
  96. package/ts_build/src/plugins/downloader/downloader.js.map +1 -1
  97. package/ts_build/src/plugins/language.js.map +1 -1
  98. package/ts_build/src/plugins/plugins.js +0 -14
  99. package/ts_build/src/plugins/plugins.js.map +1 -1
  100. package/ts_build/src/plugins/tree-sitter/editor.d.ts +3 -32
  101. package/ts_build/src/plugins/tree-sitter/editor.js +6 -208
  102. package/ts_build/src/plugins/tree-sitter/editor.js.map +1 -1
  103. package/ts_build/src/plugins/tree-sitter/parser.d.ts +19 -54
  104. package/ts_build/src/plugins/tree-sitter/parser.js +19 -293
  105. package/ts_build/src/plugins/tree-sitter/parser.js.map +1 -1
  106. package/ts_build/src/plugins/tree-sitter/simple-paths.d.ts +2 -15
  107. package/ts_build/src/plugins/tree-sitter/simple-paths.js +2 -324
  108. package/ts_build/src/plugins/tree-sitter/simple-paths.js.map +1 -1
  109. package/ts_build/src/plugins/url.js +27 -8
  110. package/ts_build/src/plugins/url.js.map +1 -1
  111. package/ts_build/src/services/EmbeddingsService.d.ts +14 -0
  112. package/ts_build/src/services/EmbeddingsService.js +33 -0
  113. package/ts_build/src/services/EmbeddingsService.js.map +1 -0
  114. package/ts_build/src/services/GitHub.js +2 -2
  115. package/ts_build/src/services/GitHub.js.map +1 -1
  116. package/ts_build/src/services/KnowhowClient.d.ts +29 -29
  117. package/ts_build/src/services/KnowhowClient.js +33 -33
  118. package/ts_build/src/services/KnowhowClient.js.map +1 -1
  119. package/ts_build/src/services/MediaProcessorService.d.ts +22 -0
  120. package/ts_build/src/services/MediaProcessorService.js +215 -0
  121. package/ts_build/src/services/MediaProcessorService.js.map +1 -0
  122. package/ts_build/src/services/S3.d.ts +0 -4
  123. package/ts_build/src/services/S3.js +14 -60
  124. package/ts_build/src/services/S3.js.map +1 -1
  125. package/ts_build/src/services/index.d.ts +6 -5
  126. package/ts_build/src/services/index.js +6 -6
  127. package/ts_build/src/services/index.js.map +1 -1
  128. package/ts_build/src/services/modules/index.js +12 -3
  129. package/ts_build/src/services/modules/index.js.map +1 -1
  130. package/ts_build/src/services/modules/types.d.ts +8 -2
  131. package/ts_build/src/services/script-execution/ScriptExecutor.js +22 -7
  132. package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -1
  133. package/ts_build/src/services/script-execution/ScriptPolicy.d.ts +1 -1
  134. package/ts_build/src/services/script-execution/ScriptPolicy.js +4 -2
  135. package/ts_build/src/services/script-execution/ScriptPolicy.js.map +1 -1
  136. package/ts_build/src/types.d.ts +1 -0
  137. package/ts_build/src/types.js +1 -0
  138. package/ts_build/src/types.js.map +1 -1
  139. package/ts_build/src/utils/http.d.ts +27 -0
  140. package/ts_build/src/utils/http.js +98 -0
  141. package/ts_build/src/utils/http.js.map +1 -0
  142. package/ts_build/src/workers/auth/PasskeySetup.js +6 -7
  143. package/ts_build/src/workers/auth/PasskeySetup.js.map +1 -1
  144. package/ts_build/tests/clients/AIClient.test.js +11 -14
  145. package/ts_build/tests/clients/AIClient.test.js.map +1 -1
  146. package/ts_build/tests/manual/file-edits/figma.test.d.ts +0 -1
  147. package/ts_build/tests/manual/file-edits/figma.test.js +1 -46
  148. package/ts_build/tests/manual/file-edits/figma.test.js.map +1 -1
  149. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js +2 -0
  150. package/ts_build/tests/plugins/language/languagePlugin-content-triggers.test.js.map +1 -1
  151. package/ts_build/tests/plugins/language/languagePlugin.test.js +2 -0
  152. package/ts_build/tests/plugins/language/languagePlugin.test.js.map +1 -1
  153. package/ts_build/tests/processors/ToolResponseCache.test.js +2 -2
  154. package/ts_build/tests/processors/ToolResponseCache.test.js.map +1 -1
  155. package/ts_build/tests/test.spec.js +0 -14
  156. package/ts_build/tests/test.spec.js.map +1 -1
  157. package/ts_build/tests/tree-sitter/tree-sitter.test.d.ts +0 -1
  158. package/ts_build/tests/tree-sitter/tree-sitter.test.js +2 -183
  159. package/ts_build/tests/tree-sitter/tree-sitter.test.js.map +1 -1
  160. package/ts_build/tests/unit/modules/moduleLoading.test.js +11 -4
  161. package/ts_build/tests/unit/modules/moduleLoading.test.js.map +1 -1
  162. package/ts_build/tests/unit/plugins/pluginLoading.test.js +4 -4
  163. package/ts_build/tests/unit/plugins/pluginLoading.test.js.map +1 -1
  164. package/benchmarks/.dockerignore +0 -7
  165. package/benchmarks/README.md +0 -166
  166. package/benchmarks/docker/Dockerfile +0 -68
  167. package/benchmarks/example-config.yml +0 -27
  168. package/benchmarks/jest.config.js +0 -13
  169. package/benchmarks/package-lock.json +0 -4297
  170. package/benchmarks/package.json +0 -39
  171. package/benchmarks/results/27b0a06/2025-09-27/xai/xai-grok-code-fast-1.json +0 -2909
  172. package/benchmarks/results/4057aed/2025-08-14/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -1671
  173. package/benchmarks/results/4542435/2025-08-05/lms/lms-openai-gpt-oss-20b.json +0 -2814
  174. package/benchmarks/results/4542435/2025-08-05/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -2014
  175. package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3121
  176. package/benchmarks/results/5766aee/2025-08-02/lms-qwen/qwen3-coder-30b.json +0 -98
  177. package/benchmarks/results/6d73808/2025-08-07/openai/openai-gpt-5.json +0 -3256
  178. package/benchmarks/results/77bf0a6/2025-08-02/lms-qwen/qwen3-30b-a3b-2507.json +0 -4298
  179. package/benchmarks/results/8c0d445/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3031
  180. package/benchmarks/results/8c0d445/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -2990
  181. package/benchmarks/results/ac6b2ab/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +0 -3256
  182. package/benchmarks/results/ac6b2ab/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3007
  183. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +0 -3256
  184. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-mini-2025-04-14.json +0 -3036
  185. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-nano-2025-04-14.json +0 -3280
  186. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-30b-a3b-2507.json +0 -1920
  187. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-coder-30b.json +0 -3281
  188. package/benchmarks/results/b502ed9/2025-08-03/lms-qwen/qwen3-coder-30b.json +0 -2896
  189. package/benchmarks/results/d1a8129/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +0 -3011
  190. package/benchmarks/results/e60471c/2025-08-03/lms/qwen3-30b-a3b-2507.json +0 -3003
  191. package/benchmarks/scripts/build-and-run.sh +0 -47
  192. package/benchmarks/scripts/clone-exercism.sh +0 -92
  193. package/benchmarks/scripts/validate.sh +0 -48
  194. package/benchmarks/src/__tests__/runner.test.ts +0 -27
  195. package/benchmarks/src/cli.ts +0 -90
  196. package/benchmarks/src/evaluators/EvaluatorRegistry.ts +0 -64
  197. package/benchmarks/src/evaluators/JavaScriptEvaluator.ts +0 -183
  198. package/benchmarks/src/evaluators/index.ts +0 -3
  199. package/benchmarks/src/evaluators/types.ts +0 -22
  200. package/benchmarks/src/index.ts +0 -3
  201. package/benchmarks/src/providers.ts +0 -13
  202. package/benchmarks/src/runner.ts +0 -824
  203. package/benchmarks/src/types.ts +0 -63
  204. package/benchmarks/tsconfig.json +0 -19
  205. package/leaderboard/README.md +0 -148
  206. package/leaderboard/app/api/benchmark-data/route.ts +0 -131
  207. package/leaderboard/app/api/benchmark-detail/route.ts +0 -172
  208. package/leaderboard/app/details/[model]/[provider]/[language]/page.tsx +0 -501
  209. package/leaderboard/app/exercise/[model]/[provider]/[language]/[exercise]/page.tsx +0 -375
  210. package/leaderboard/app/globals.css +0 -27
  211. package/leaderboard/app/layout.tsx +0 -21
  212. package/leaderboard/app/page.tsx +0 -170
  213. package/leaderboard/components/LeaderboardTable.tsx +0 -168
  214. package/leaderboard/components/PerformanceChart.tsx +0 -109
  215. package/leaderboard/next-env.d.ts +0 -5
  216. package/leaderboard/next.config.js +0 -4
  217. package/leaderboard/package-lock.json +0 -6363
  218. package/leaderboard/package.json +0 -28
  219. package/leaderboard/postcss.config.js +0 -6
  220. package/leaderboard/tailwind.config.js +0 -17
  221. package/leaderboard/tsconfig.json +0 -28
  222. package/leaderboard/types/benchmark.ts +0 -67
  223. package/leaderboard/utils/dataProcessor.ts +0 -33
  224. package/src/agents/tools/asana/definitions.ts +0 -199
  225. package/src/agents/tools/asana/index.ts +0 -108
  226. package/src/agents/tools/ast/astAppendNode.ts +0 -90
  227. package/src/agents/tools/ast/astDeleteNode.ts +0 -88
  228. package/src/agents/tools/ast/astEditNode.ts +0 -95
  229. package/src/agents/tools/ast/astGetPathForLine.ts +0 -73
  230. package/src/agents/tools/ast/astListPaths.ts +0 -66
  231. package/src/agents/tools/ast/index.ts +0 -7
  232. package/src/agents/tools/github/definitions.ts +0 -89
  233. package/src/agents/tools/github/index.ts +0 -67
  234. package/src/chat-old.ts +0 -446
  235. package/src/plugins/asana.ts +0 -146
  236. package/src/plugins/downloader/plugin.ts +0 -103
  237. package/src/plugins/downloader/types.ts +0 -92
  238. package/src/plugins/figma.ts +0 -158
  239. package/src/plugins/github.ts +0 -219
  240. package/src/plugins/jira.ts +0 -115
  241. package/src/plugins/linear.ts +0 -230
  242. package/src/plugins/notion.ts +0 -179
  243. package/src/plugins/tree-sitter/editor.ts +0 -369
  244. package/src/plugins/tree-sitter/lang-packs/index.ts +0 -23
  245. package/src/plugins/tree-sitter/lang-packs/java.ts +0 -59
  246. package/src/plugins/tree-sitter/lang-packs/javascript.ts +0 -57
  247. package/src/plugins/tree-sitter/lang-packs/python.ts +0 -45
  248. package/src/plugins/tree-sitter/lang-packs/types.ts +0 -79
  249. package/src/plugins/tree-sitter/lang-packs/typescript.ts +0 -49
  250. package/src/plugins/tree-sitter/parser.ts +0 -470
  251. package/src/plugins/tree-sitter/simple-paths.ts +0 -467
  252. package/src/services/GitHub.ts +0 -59
  253. package/tests/tree-sitter/editor.test.ts +0 -113
  254. package/tests/tree-sitter/invalid.test.ts +0 -299
  255. package/tests/tree-sitter/paths/common-edits.test.ts +0 -564
  256. package/tests/tree-sitter/paths/debug-exact-position.test.ts +0 -44
  257. package/tests/tree-sitter/paths/debug-line-indexing.test.ts +0 -49
  258. package/tests/tree-sitter/paths/debug-paths.test.ts +0 -90
  259. package/tests/tree-sitter/paths/paths.test.ts +0 -170
  260. package/tests/tree-sitter/paths/simple-paths.test.ts +0 -367
  261. package/tests/tree-sitter/sample-after.ts +0 -48
  262. package/tests/tree-sitter/sample-before.ts +0 -25
  263. package/tests/tree-sitter/test-files/completely-broken.ts +0 -7
  264. package/tests/tree-sitter/test-files/duplicate-braces.ts +0 -39
  265. package/tests/tree-sitter/test-files/invalid-nesting.ts +0 -39
  266. package/tests/tree-sitter/test-files/malformed-signature.ts +0 -39
  267. package/tests/tree-sitter/test-files/mismatched-parens.ts +0 -39
  268. package/tests/tree-sitter/test-files/missing-semicolon.ts +0 -39
  269. package/tests/tree-sitter/test-files/partially-broken.ts +0 -20
  270. package/tests/tree-sitter/test-files/specific-errors.ts +0 -14
  271. package/tests/tree-sitter/test-files/unclosed-string.ts +0 -39
  272. 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
- });