edhindex 1.1.0 → 2.0.0

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 (190) hide show
  1. package/README.md +31 -11
  2. package/dist/cli/index.js +1 -1
  3. package/dist/embeddings/transformers.d.ts.map +1 -1
  4. package/dist/graph/builder.d.ts.map +1 -1
  5. package/dist/graph/builder.js +13 -0
  6. package/dist/graph/builder.js.map +1 -1
  7. package/dist/graph/serve.js.map +1 -1
  8. package/dist/graph/service.d.ts.map +1 -1
  9. package/dist/graph/storage.d.ts.map +1 -1
  10. package/dist/graph/types.d.ts +1 -1
  11. package/dist/graph/types.d.ts.map +1 -1
  12. package/dist/graph/types.js.map +1 -1
  13. package/dist/indexer/fixture.test.js.map +1 -1
  14. package/dist/indexer/indexer.d.ts.map +1 -1
  15. package/dist/indexer/parser.js.map +1 -1
  16. package/dist/language/adapters/astro.d.ts +12 -0
  17. package/dist/language/adapters/astro.d.ts.map +1 -0
  18. package/dist/language/adapters/astro.js +195 -0
  19. package/dist/language/adapters/astro.js.map +1 -0
  20. package/dist/language/adapters/c.d.ts.map +1 -1
  21. package/dist/language/adapters/c.js.map +1 -1
  22. package/dist/language/adapters/config.d.ts +14 -0
  23. package/dist/language/adapters/config.d.ts.map +1 -0
  24. package/dist/language/adapters/config.js +136 -0
  25. package/dist/language/adapters/config.js.map +1 -0
  26. package/dist/language/adapters/cpp.d.ts.map +1 -1
  27. package/dist/language/adapters/cpp.js.map +1 -1
  28. package/dist/language/adapters/csharp.d.ts.map +1 -1
  29. package/dist/language/adapters/csharp.js.map +1 -1
  30. package/dist/language/adapters/css.d.ts.map +1 -1
  31. package/dist/language/adapters/css.js.map +1 -1
  32. package/dist/language/adapters/csv.d.ts +11 -0
  33. package/dist/language/adapters/csv.d.ts.map +1 -0
  34. package/dist/language/adapters/csv.js +103 -0
  35. package/dist/language/adapters/csv.js.map +1 -0
  36. package/dist/language/adapters/dart.d.ts +7 -0
  37. package/dist/language/adapters/dart.d.ts.map +1 -0
  38. package/dist/language/adapters/dart.js +37 -0
  39. package/dist/language/adapters/dart.js.map +1 -0
  40. package/dist/language/adapters/dockerfile.d.ts +12 -0
  41. package/dist/language/adapters/dockerfile.d.ts.map +1 -0
  42. package/dist/language/adapters/dockerfile.js +71 -0
  43. package/dist/language/adapters/dockerfile.js.map +1 -0
  44. package/dist/language/adapters/documentation.d.ts +12 -0
  45. package/dist/language/adapters/documentation.d.ts.map +1 -0
  46. package/dist/language/adapters/documentation.js +146 -0
  47. package/dist/language/adapters/documentation.js.map +1 -0
  48. package/dist/language/adapters/go.d.ts.map +1 -1
  49. package/dist/language/adapters/go.js.map +1 -1
  50. package/dist/language/adapters/haskell.d.ts +7 -0
  51. package/dist/language/adapters/haskell.d.ts.map +1 -0
  52. package/dist/language/adapters/haskell.js +33 -0
  53. package/dist/language/adapters/haskell.js.map +1 -0
  54. package/dist/language/adapters/html.d.ts.map +1 -1
  55. package/dist/language/adapters/html.js.map +1 -1
  56. package/dist/language/adapters/java.d.ts.map +1 -1
  57. package/dist/language/adapters/java.js.map +1 -1
  58. package/dist/language/adapters/javascript.d.ts.map +1 -1
  59. package/dist/language/adapters/javascript.js.map +1 -1
  60. package/dist/language/adapters/json-variants.d.ts +11 -0
  61. package/dist/language/adapters/json-variants.d.ts.map +1 -0
  62. package/dist/language/adapters/json-variants.js +57 -0
  63. package/dist/language/adapters/json-variants.js.map +1 -0
  64. package/dist/language/adapters/json.d.ts.map +1 -1
  65. package/dist/language/adapters/json.js.map +1 -1
  66. package/dist/language/adapters/kotlin.d.ts +7 -0
  67. package/dist/language/adapters/kotlin.d.ts.map +1 -0
  68. package/dist/language/adapters/kotlin.js +35 -0
  69. package/dist/language/adapters/kotlin.js.map +1 -0
  70. package/dist/language/adapters/lua.d.ts +7 -0
  71. package/dist/language/adapters/lua.d.ts.map +1 -0
  72. package/dist/language/adapters/lua.js +32 -0
  73. package/dist/language/adapters/lua.js.map +1 -0
  74. package/dist/language/adapters/markdown.d.ts +12 -0
  75. package/dist/language/adapters/markdown.d.ts.map +1 -0
  76. package/dist/language/adapters/markdown.js +76 -0
  77. package/dist/language/adapters/markdown.js.map +1 -0
  78. package/dist/language/adapters/php.d.ts.map +1 -1
  79. package/dist/language/adapters/php.js.map +1 -1
  80. package/dist/language/adapters/python.d.ts.map +1 -1
  81. package/dist/language/adapters/python.js.map +1 -1
  82. package/dist/language/adapters/ruby.d.ts.map +1 -1
  83. package/dist/language/adapters/ruby.js.map +1 -1
  84. package/dist/language/adapters/rust.d.ts.map +1 -1
  85. package/dist/language/adapters/rust.js.map +1 -1
  86. package/dist/language/adapters/salesforce.d.ts +15 -0
  87. package/dist/language/adapters/salesforce.d.ts.map +1 -0
  88. package/dist/language/adapters/salesforce.js +223 -0
  89. package/dist/language/adapters/salesforce.js.map +1 -0
  90. package/dist/language/adapters/scala.d.ts +7 -0
  91. package/dist/language/adapters/scala.d.ts.map +1 -0
  92. package/dist/language/adapters/scala.js +37 -0
  93. package/dist/language/adapters/scala.js.map +1 -0
  94. package/dist/language/adapters/solidity.d.ts +7 -0
  95. package/dist/language/adapters/solidity.d.ts.map +1 -0
  96. package/dist/language/adapters/solidity.js +40 -0
  97. package/dist/language/adapters/solidity.js.map +1 -0
  98. package/dist/language/adapters/sql.d.ts +12 -0
  99. package/dist/language/adapters/sql.d.ts.map +1 -0
  100. package/dist/language/adapters/sql.js +93 -0
  101. package/dist/language/adapters/sql.js.map +1 -0
  102. package/dist/language/adapters/svelte.d.ts +11 -0
  103. package/dist/language/adapters/svelte.d.ts.map +1 -0
  104. package/dist/language/adapters/svelte.js +76 -0
  105. package/dist/language/adapters/svelte.js.map +1 -0
  106. package/dist/language/adapters/svg.d.ts +13 -0
  107. package/dist/language/adapters/svg.d.ts.map +1 -0
  108. package/dist/language/adapters/svg.js +130 -0
  109. package/dist/language/adapters/svg.js.map +1 -0
  110. package/dist/language/adapters/swift.d.ts +7 -0
  111. package/dist/language/adapters/swift.d.ts.map +1 -0
  112. package/dist/language/adapters/swift.js +42 -0
  113. package/dist/language/adapters/swift.js.map +1 -0
  114. package/dist/language/adapters/terraform.d.ts +7 -0
  115. package/dist/language/adapters/terraform.d.ts.map +1 -0
  116. package/dist/language/adapters/terraform.js +23 -0
  117. package/dist/language/adapters/terraform.js.map +1 -0
  118. package/dist/language/adapters/text.d.ts +14 -0
  119. package/dist/language/adapters/text.d.ts.map +1 -0
  120. package/dist/language/adapters/text.js +178 -0
  121. package/dist/language/adapters/text.js.map +1 -0
  122. package/dist/language/adapters/toml.d.ts +12 -0
  123. package/dist/language/adapters/toml.d.ts.map +1 -0
  124. package/dist/language/adapters/toml.js +79 -0
  125. package/dist/language/adapters/toml.js.map +1 -0
  126. package/dist/language/adapters/typescript.d.ts.map +1 -1
  127. package/dist/language/adapters/typescript.js.map +1 -1
  128. package/dist/language/adapters/vue.d.ts +11 -0
  129. package/dist/language/adapters/vue.d.ts.map +1 -0
  130. package/dist/language/adapters/vue.js +67 -0
  131. package/dist/language/adapters/vue.js.map +1 -0
  132. package/dist/language/adapters/xml.d.ts +12 -0
  133. package/dist/language/adapters/xml.d.ts.map +1 -0
  134. package/dist/language/adapters/xml.js +71 -0
  135. package/dist/language/adapters/xml.js.map +1 -0
  136. package/dist/language/adapters/yaml.d.ts +11 -0
  137. package/dist/language/adapters/yaml.d.ts.map +1 -0
  138. package/dist/language/adapters/yaml.js +60 -0
  139. package/dist/language/adapters/yaml.js.map +1 -0
  140. package/dist/language/base.d.ts.map +1 -1
  141. package/dist/language/base.js.map +1 -1
  142. package/dist/language/generic.d.ts.map +1 -1
  143. package/dist/language/registry.d.ts.map +1 -1
  144. package/dist/language/registry.js +51 -0
  145. package/dist/language/registry.js.map +1 -1
  146. package/dist/language/types.d.ts +14 -1
  147. package/dist/language/types.d.ts.map +1 -1
  148. package/dist/language/types.js +13 -0
  149. package/dist/language/types.js.map +1 -1
  150. package/dist/logging.d.ts.map +1 -1
  151. package/dist/mcp/server.js.map +1 -1
  152. package/dist/mcp-config.js.map +1 -1
  153. package/dist/retrieval/search.d.ts.map +1 -1
  154. package/dist/storage/fts.d.ts.map +1 -1
  155. package/dist/storage/metadata.d.ts.map +1 -1
  156. package/dist/vector/lancedb.d.ts.map +1 -1
  157. package/dist/watcher/index.d.ts.map +1 -1
  158. package/package.json +54 -2
  159. package/src/cli/index.ts +1 -1
  160. package/src/graph/builder.ts +13 -0
  161. package/src/graph/types.ts +14 -1
  162. package/src/language/adapters/astro.ts +206 -0
  163. package/src/language/adapters/config.ts +144 -0
  164. package/src/language/adapters/csv.ts +110 -0
  165. package/src/language/adapters/dart.ts +39 -0
  166. package/src/language/adapters/dockerfile.ts +78 -0
  167. package/src/language/adapters/documentation.ts +158 -0
  168. package/src/language/adapters/haskell.ts +35 -0
  169. package/src/language/adapters/json-variants.ts +60 -0
  170. package/src/language/adapters/kotlin.ts +37 -0
  171. package/src/language/adapters/lua.ts +34 -0
  172. package/src/language/adapters/markdown.ts +81 -0
  173. package/src/language/adapters/salesforce.ts +236 -0
  174. package/src/language/adapters/scala.ts +39 -0
  175. package/src/language/adapters/solidity.ts +42 -0
  176. package/src/language/adapters/sql.ts +99 -0
  177. package/src/language/adapters/svelte.ts +80 -0
  178. package/src/language/adapters/svg.ts +137 -0
  179. package/src/language/adapters/swift.ts +44 -0
  180. package/src/language/adapters/terraform.ts +25 -0
  181. package/src/language/adapters/text.ts +195 -0
  182. package/src/language/adapters/toml.ts +82 -0
  183. package/src/language/adapters/vue.ts +70 -0
  184. package/src/language/adapters/xml.ts +74 -0
  185. package/src/language/adapters/yaml.ts +63 -0
  186. package/src/language/registry.ts +53 -0
  187. package/src/language/types.ts +13 -0
  188. package/src/types/better-sqlite3.d.ts +55 -0
  189. package/src/types/cli-progress.d.ts +32 -0
  190. package/src/types/vitest.d.ts +11 -0
@@ -0,0 +1,236 @@
1
+ import { LanguageAdapter, ParseResult, CodeSymbol, SymbolType } from '../types.js';
2
+
3
+ export class SalesforceAdapter implements LanguageAdapter {
4
+ languageName(): string { return 'Salesforce'; }
5
+ fileExtensions(): string[] {
6
+ return [
7
+ '.cls', '.trigger', '.page', '.component', '.cmp', '.app', '.evt', '.intf',
8
+ '.design', '.auradoc', '.js-meta.xml', '.object-meta.xml', '.field-meta.xml',
9
+ '.permissionset-meta.xml', '.profile-meta.xml', '.layout-meta.xml',
10
+ '.flexipage-meta.xml', '.flow-meta.xml', '.workflow-meta.xml',
11
+ '.approvalProcess-meta.xml', '.quickAction-meta.xml', '.labels-meta.xml',
12
+ '.globalValueSet-meta.xml', '.remoteSite-meta.xml', '.connectedApp-meta.xml',
13
+ '.customMetadata-meta.xml', '.customApplication-meta.xml', '.tabs-meta.xml',
14
+ '.sharingRules-meta.xml', '.queue-meta.xml', '.role-meta.xml',
15
+ '.group-meta.xml', '.email-meta.xml', '.reportType-meta.xml',
16
+ '.dashboard-meta.xml', '.report-meta.xml',
17
+ ];
18
+ }
19
+ fileNames(): string[] { return []; }
20
+ canParse(filePath: string): boolean {
21
+ const lower = filePath.toLowerCase();
22
+ for (const ext of this.fileExtensions()) {
23
+ if (lower.endsWith(ext)) return true;
24
+ }
25
+ return false;
26
+ }
27
+ supportsSymbols(): boolean { return true; }
28
+
29
+ async parse(content: string, filePath: string): Promise<ParseResult> {
30
+ const lines = content.split('\n');
31
+ const symbols: CodeSymbol[] = [];
32
+ const imports: string[] = [];
33
+ const exports: string[] = [];
34
+ const comments: string[] = [];
35
+
36
+ if (filePath.endsWith('.cls') || filePath.endsWith('.trigger')) {
37
+ this.extractApexCode(lines, symbols, filePath);
38
+ } else if (filePath.endsWith('.page') || filePath.endsWith('.component')) {
39
+ this.extractVisualforce(lines, symbols, filePath);
40
+ } else if (filePath.endsWith('.cmp') || filePath.endsWith('.app') || filePath.endsWith('.evt') || filePath.endsWith('.intf')) {
41
+ this.extractAura(lines, symbols, filePath);
42
+ } else {
43
+ this.extractMetadata(lines, symbols, filePath);
44
+ }
45
+
46
+ this.extractComments(lines, comments);
47
+
48
+ return { symbols, imports, exports, comments };
49
+ }
50
+
51
+ private extractApexCode(lines: string[], symbols: CodeSymbol[], filePath: string) {
52
+ const patterns = [
53
+ { regex: /^public\s+(?:with\s+sharing\s+|without\s+sharing\s+)?class\s+(\w+)/gi, type: SymbolType.Class },
54
+ { regex: /^private\s+(?:with\s+sharing\s+|without\s+sharing\s+)?class\s+(\w+)/gi, type: SymbolType.Class },
55
+ { regex: /^global\s+(?:with\s+sharing\s+|without\s+sharing\s+)?class\s+(\w+)/gi, type: SymbolType.Class },
56
+ { regex: /^public\s+interface\s+(\w+)/gi, type: SymbolType.Interface },
57
+ { regex: /^public\s+enum\s+(\w+)/gi, type: SymbolType.Enum },
58
+ { regex: /^public\s+(?:static\s+)?(?:void|integer|string|boolean|list|map|set)\s+(\w+)\s*\(/gi, type: SymbolType.Function },
59
+ { regex: /^private\s+(?:static\s+)?(?:void|integer|string|boolean|list|map|set)\s+(\w+)\s*\(/gi, type: SymbolType.Function },
60
+ { regex: /^public\s+trigger\s+(\w+)\s+on\s+(\w+)/gi, type: SymbolType.Function },
61
+ { regex: /^trigger\s+(\w+)\s+on\s+(\w+)/gi, type: SymbolType.Function },
62
+ ];
63
+
64
+ for (let i = 0; i < lines.length; i++) {
65
+ const line = lines[i].trim();
66
+
67
+ for (const pattern of patterns) {
68
+ pattern.regex.lastIndex = 0;
69
+ const match = pattern.regex.exec(line);
70
+ if (match) {
71
+ symbols.push({
72
+ id: `${filePath}:${i + 1}`,
73
+ name: match[1],
74
+ type: pattern.type,
75
+ language: 'salesforce',
76
+ file: filePath,
77
+ startLine: i + 1,
78
+ endLine: i + 1,
79
+ parent: null,
80
+ children: [],
81
+ metadata: {},
82
+ });
83
+ }
84
+ }
85
+ }
86
+ }
87
+
88
+ private extractVisualforce(lines: string[], symbols: CodeSymbol[], filePath: string) {
89
+ for (let i = 0; i < lines.length; i++) {
90
+ const line = lines[i].trim();
91
+
92
+ // Extract apex:page, apex:form, apex:inputField, etc.
93
+ const tagMatch = line.match(/<apex:(\w+)/i);
94
+ if (tagMatch) {
95
+ symbols.push({
96
+ id: `${filePath}:${i + 1}`,
97
+ name: tagMatch[1],
98
+ type: SymbolType.Class,
99
+ language: 'salesforce',
100
+ file: filePath,
101
+ startLine: i + 1,
102
+ endLine: i + 1,
103
+ parent: null,
104
+ children: [],
105
+ metadata: {},
106
+ });
107
+ }
108
+ }
109
+ }
110
+
111
+ private extractAura(lines: string[], symbols: CodeSymbol[], filePath: string) {
112
+ for (let i = 0; i < lines.length; i++) {
113
+ const line = lines[i].trim();
114
+
115
+ // Extract aura:component, aura:attribute, aura:handler, etc.
116
+ const tagMatch = line.match(/<aura:(\w+)/i);
117
+ if (tagMatch) {
118
+ symbols.push({
119
+ id: `${filePath}:${i + 1}`,
120
+ name: tagMatch[1],
121
+ type: SymbolType.Class,
122
+ language: 'salesforce',
123
+ file: filePath,
124
+ startLine: i + 1,
125
+ endLine: i + 1,
126
+ parent: null,
127
+ children: [],
128
+ metadata: {},
129
+ });
130
+ }
131
+
132
+ // Extract LWC components
133
+ const lwcMatch = line.match(/<(\w+-\w+)/i);
134
+ if (lwcMatch) {
135
+ symbols.push({
136
+ id: `${filePath}:${i + 1}`,
137
+ name: lwcMatch[1],
138
+ type: SymbolType.Class,
139
+ language: 'salesforce',
140
+ file: filePath,
141
+ startLine: i + 1,
142
+ endLine: i + 1,
143
+ parent: null,
144
+ children: [],
145
+ metadata: {},
146
+ });
147
+ }
148
+ }
149
+ }
150
+
151
+ private extractMetadata(lines: string[], symbols: CodeSymbol[], filePath: string) {
152
+ // For XML-based metadata files, extract root element and key attributes
153
+ for (let i = 0; i < lines.length; i++) {
154
+ const line = lines[i].trim();
155
+
156
+ // Extract root XML element
157
+ const rootMatch = line.match(/<(\w+)[\s>]/);
158
+ if (rootMatch && i < 5) {
159
+ symbols.push({
160
+ id: `${filePath}:${i + 1}`,
161
+ name: rootMatch[1],
162
+ type: SymbolType.Module,
163
+ language: 'salesforce',
164
+ file: filePath,
165
+ startLine: i + 1,
166
+ endLine: i + 1,
167
+ parent: null,
168
+ children: [],
169
+ metadata: {},
170
+ });
171
+ }
172
+
173
+ // Extract key elements
174
+ const elementMatch = line.match(/<(\w+)>(.+?)<\/\1>/);
175
+ if (elementMatch) {
176
+ symbols.push({
177
+ id: `${filePath}:${i + 1}`,
178
+ name: elementMatch[1],
179
+ type: SymbolType.Property,
180
+ language: 'salesforce',
181
+ file: filePath,
182
+ startLine: i + 1,
183
+ endLine: i + 1,
184
+ parent: null,
185
+ children: [],
186
+ metadata: { value: elementMatch[2] },
187
+ });
188
+ }
189
+ }
190
+ }
191
+
192
+ private extractComments(lines: string[], comments: string[]) {
193
+ let inBlockComment = false;
194
+ let blockComment = '';
195
+
196
+ for (const line of lines) {
197
+ const trimmed = line.trim();
198
+
199
+ // Apex/Java style comments
200
+ if (inBlockComment) {
201
+ const endIdx = line.indexOf('*/');
202
+ if (endIdx >= 0) {
203
+ blockComment += line.substring(0, endIdx + 2);
204
+ comments.push(blockComment.trim());
205
+ blockComment = '';
206
+ inBlockComment = false;
207
+ } else {
208
+ blockComment += line + '\n';
209
+ }
210
+ } else {
211
+ const startIdx = line.indexOf('/*');
212
+ if (startIdx >= 0) {
213
+ const endIdx = line.indexOf('*/', startIdx + 2);
214
+ if (endIdx >= 0) {
215
+ comments.push(line.substring(startIdx, endIdx + 2).trim());
216
+ } else {
217
+ blockComment = line.substring(startIdx) + '\n';
218
+ inBlockComment = true;
219
+ }
220
+ }
221
+
222
+ if (trimmed.startsWith('//')) {
223
+ comments.push(trimmed);
224
+ }
225
+
226
+ // XML comments
227
+ if (trimmed.startsWith('<!--')) {
228
+ const endIdx = line.indexOf('-->');
229
+ if (endIdx >= 0) {
230
+ comments.push(line.substring(0, endIdx + 3).trim());
231
+ }
232
+ }
233
+ }
234
+ }
235
+ }
236
+ }
@@ -0,0 +1,39 @@
1
+ import { createRequire } from 'node:module';
2
+ import { BaseTreeSitterAdapter, GrammarConfig } from '../base.js';
3
+ import { SymbolType } from '../types.js';
4
+
5
+ const require = createRequire(import.meta.url);
6
+
7
+ const GRAMMAR: GrammarConfig = {
8
+ language: 'scala',
9
+ wasmPath: new URL('../../node_modules/tree-sitter-wasms/out/tree-sitter-scala.wasm', import.meta.url).pathname,
10
+ queryPatterns: {
11
+ class_definition: '(class_definition name: (identifier) @name)',
12
+ trait_definition: '(trait_definition name: (identifier) @name)',
13
+ object_definition: '(object_definition name: (identifier) @name)',
14
+ function_definition: '(function_definition name: (identifier) @name)',
15
+ val_definition: '(val_definition name: (identifier) @name)',
16
+ var_definition: '(var_definition name: (identifier) @name)',
17
+ },
18
+ typeMap: {
19
+ class_definition: SymbolType.Class,
20
+ trait_definition: SymbolType.Trait,
21
+ object_definition: SymbolType.Object,
22
+ enum_definition: SymbolType.Enum,
23
+ function_definition: SymbolType.Function,
24
+ method_definition: SymbolType.Method,
25
+ val_definition: SymbolType.Constant,
26
+ var_definition: SymbolType.Variable,
27
+ import_declaration: SymbolType.Import,
28
+ package_clause: SymbolType.Package,
29
+ },
30
+ nameNodeTypes: ['identifier'],
31
+ importNodeTypes: ['import_declaration'],
32
+ exportNodeTypes: [],
33
+ };
34
+
35
+ export class ScalaAdapter extends BaseTreeSitterAdapter {
36
+ protected grammar = GRAMMAR;
37
+ languageName(): string { return 'Scala'; }
38
+ fileExtensions(): string[] { return ['.scala', '.sc']; }
39
+ }
@@ -0,0 +1,42 @@
1
+ import { createRequire } from 'node:module';
2
+ import { BaseTreeSitterAdapter, GrammarConfig } from '../base.js';
3
+ import { SymbolType } from '../types.js';
4
+
5
+ const require = createRequire(import.meta.url);
6
+
7
+ const GRAMMAR: GrammarConfig = {
8
+ language: 'solidity',
9
+ wasmPath: new URL('../../node_modules/tree-sitter-wasms/out/tree-sitter-solidity.wasm', import.meta.url).pathname,
10
+ queryPatterns: {
11
+ contract_declaration: '(contract_declaration name: (identifier) @name)',
12
+ interface_declaration: '(interface_declaration name: (identifier) @name)',
13
+ library_declaration: '(library_declaration name: (identifier) @name)',
14
+ struct_declaration: '(struct_declaration name: (identifier) @name)',
15
+ enum_declaration: '(enum_declaration name: (identifier) @name)',
16
+ event_declaration: '(event_declaration name: (identifier) @name)',
17
+ modifier_definition: '(modifier_definition name: (identifier) @name)',
18
+ function_definition: '(function_definition name: (identifier) @name)',
19
+ },
20
+ typeMap: {
21
+ contract_declaration: SymbolType.Class,
22
+ interface_declaration: SymbolType.Interface,
23
+ library_declaration: SymbolType.Module,
24
+ struct_declaration: SymbolType.Struct,
25
+ enum_declaration: SymbolType.Enum,
26
+ event_declaration: SymbolType.Function,
27
+ modifier_definition: SymbolType.Method,
28
+ constructor_definition: SymbolType.Constructor,
29
+ function_definition: SymbolType.Function,
30
+ state_variable_declaration: SymbolType.Variable,
31
+ import_directive: SymbolType.Import,
32
+ },
33
+ nameNodeTypes: ['identifier'],
34
+ importNodeTypes: ['import_directive'],
35
+ exportNodeTypes: [],
36
+ };
37
+
38
+ export class SolidityAdapter extends BaseTreeSitterAdapter {
39
+ protected grammar = GRAMMAR;
40
+ languageName(): string { return 'Solidity'; }
41
+ fileExtensions(): string[] { return ['.sol']; }
42
+ }
@@ -0,0 +1,99 @@
1
+ import { LanguageAdapter, ParseResult, CodeSymbol, SymbolType } from '../types.js';
2
+
3
+ export class SqlAdapter implements LanguageAdapter {
4
+ languageName(): string { return 'SQL'; }
5
+ fileExtensions(): string[] { return ['.sql']; }
6
+ fileNames(): string[] { return []; }
7
+ canParse(filePath: string): boolean {
8
+ return filePath.toLowerCase().endsWith('.sql');
9
+ }
10
+ supportsSymbols(): boolean { return true; }
11
+
12
+ async parse(content: string, filePath: string): Promise<ParseResult> {
13
+ const lines = content.split('\n');
14
+ const symbols: CodeSymbol[] = [];
15
+ const imports: string[] = [];
16
+ const exports: string[] = [];
17
+ const comments: string[] = [];
18
+
19
+ // Extract SQL objects using regex patterns
20
+ this.extractSqlObjects(lines, symbols, filePath);
21
+
22
+ // Extract comments
23
+ this.extractComments(lines, comments);
24
+
25
+ return { symbols, imports, exports, comments };
26
+ }
27
+
28
+ private extractSqlObjects(lines: string[], symbols: CodeSymbol[], filePath: string) {
29
+ const patterns = [
30
+ { regex: /CREATE\s+TABLE\s+(?:IF\s+NOT\s+EXISTS\s+)?[`"']?(\w+)[`"']?/gi, type: SymbolType.Table },
31
+ { regex: /CREATE\s+VIEW\s+[`"']?(\w+)[`"']?/gi, type: SymbolType.Table },
32
+ { regex: /CREATE\s+INDEX\s+[`"']?(\w+)[`"']?/gi, type: SymbolType.Property },
33
+ { regex: /CREATE\s+(?:UNIQUE\s+)?INDEX\s+[`"']?(\w+)[`"']?/gi, type: SymbolType.Property },
34
+ { regex: /CREATE\s+TRIGGER\s+[`"']?(\w+)[`"']?/gi, type: SymbolType.Function },
35
+ { regex: /CREATE\s+(?:OR\s+REPLACE\s+)?FUNCTION\s+[`"']?(\w+)[`"']?/gi, type: SymbolType.Function },
36
+ { regex: /CREATE\s+(?:OR\s+REPLACE\s+)?PROCEDURE\s+[`"']?(\w+)[`"']?/gi, type: SymbolType.Function },
37
+ { regex: /CREATE\s+SCHEMA\s+[`"']?(\w+)[`"']?/gi, type: SymbolType.Namespace },
38
+ { regex: /CREATE\s+DATABASE\s+[`"']?(\w+)[`"']?/gi, type: SymbolType.Module },
39
+ ];
40
+
41
+ for (let i = 0; i < lines.length; i++) {
42
+ const line = lines[i];
43
+ for (const pattern of patterns) {
44
+ const matches = line.matchAll(pattern.regex);
45
+ for (const match of matches) {
46
+ if (match[1]) {
47
+ symbols.push({
48
+ id: `${filePath}:${i + 1}`,
49
+ name: match[1],
50
+ type: pattern.type,
51
+ language: 'sql',
52
+ file: filePath,
53
+ startLine: i + 1,
54
+ endLine: i + 1,
55
+ parent: null,
56
+ children: [],
57
+ metadata: {},
58
+ });
59
+ }
60
+ }
61
+ }
62
+ }
63
+ }
64
+
65
+ private extractComments(lines: string[], comments: string[]) {
66
+ let inBlockComment = false;
67
+ let blockComment = '';
68
+
69
+ for (const line of lines) {
70
+ if (inBlockComment) {
71
+ const endIdx = line.indexOf('*/');
72
+ if (endIdx >= 0) {
73
+ blockComment += line.substring(0, endIdx + 2);
74
+ comments.push(blockComment.trim());
75
+ blockComment = '';
76
+ inBlockComment = false;
77
+ } else {
78
+ blockComment += line + '\n';
79
+ }
80
+ } else {
81
+ const startIdx = line.indexOf('/*');
82
+ if (startIdx >= 0) {
83
+ const endIdx = line.indexOf('*/', startIdx + 2);
84
+ if (endIdx >= 0) {
85
+ comments.push(line.substring(startIdx, endIdx + 2).trim());
86
+ } else {
87
+ blockComment = line.substring(startIdx) + '\n';
88
+ inBlockComment = true;
89
+ }
90
+ }
91
+
92
+ const lineCommentIdx = line.indexOf('--');
93
+ if (lineCommentIdx >= 0) {
94
+ comments.push(line.substring(lineCommentIdx).trim());
95
+ }
96
+ }
97
+ }
98
+ }
99
+ }
@@ -0,0 +1,80 @@
1
+ import { createRequire } from 'node:module';
2
+ import { BaseTreeSitterAdapter, GrammarConfig } from '../base.js';
3
+ import { SymbolType, CodeSymbol } from '../types.js';
4
+
5
+ const GRAMMAR: GrammarConfig = {
6
+ language: 'svelte',
7
+ wasmPath: new URL('../../node_modules/@tree-sitter-grammars/tree-sitter-svelte/tree-sitter-svelte.wasm', import.meta.url).pathname,
8
+ queryPatterns: {},
9
+ typeMap: {},
10
+ nameNodeTypes: ['tag_name', 'attribute_name'],
11
+ importNodeTypes: [],
12
+ exportNodeTypes: [],
13
+ };
14
+
15
+ export class SvelteAdapter extends BaseTreeSitterAdapter {
16
+ protected grammar = GRAMMAR;
17
+ languageName(): string { return 'Svelte'; }
18
+ fileExtensions(): string[] { return ['.svelte']; }
19
+
20
+ protected async extractSymbolsFromTree(tree: any, filePath: string, content: string): Promise<CodeSymbol[]> {
21
+ const symbols: CodeSymbol[] = [];
22
+ this.walkSvelte(tree.rootNode, symbols, filePath);
23
+ return symbols;
24
+ }
25
+
26
+ private walkSvelte(node: any, symbols: CodeSymbol[], filePath: string) {
27
+ // Extract top-level sections: <script>, <style>, <template>
28
+ if (node.type === 'element' || node.type === 'script_element' || node.type === 'style_element') {
29
+ const tagName = this.extractTagName(node);
30
+ if (tagName && ['script', 'style', 'template'].includes(tagName.toLowerCase())) {
31
+ const id = `${filePath}:${node.startPosition.row + 1}`;
32
+ symbols.push({
33
+ id, name: tagName, type: SymbolType.Section, language: 'svelte',
34
+ file: filePath, startLine: node.startPosition.row + 1,
35
+ endLine: node.endPosition.row + 1, parent: null, children: [], metadata: {},
36
+ });
37
+ }
38
+
39
+ // Extract custom components (PascalCase or kebab-case with -)
40
+ if (tagName && (tagName[0] === tagName[0].toUpperCase() || tagName.includes('-'))) {
41
+ const id = `${filePath}:${node.startPosition.row + 1}`;
42
+ symbols.push({
43
+ id, name: tagName, type: SymbolType.Class, language: 'svelte',
44
+ file: filePath, startLine: node.startPosition.row + 1,
45
+ endLine: node.endPosition.row + 1, parent: null, children: [], metadata: {},
46
+ });
47
+ }
48
+ }
49
+
50
+ // Extract Svelte-specific blocks: {#if}, {#each}, {#await}
51
+ if (node.type === 'if_block' || node.type === 'each_block' || node.type === 'await_block') {
52
+ const id = `${filePath}:${node.startPosition.row + 1}`;
53
+ symbols.push({
54
+ id, name: node.type.replace('_block', ''), type: SymbolType.Function, language: 'svelte',
55
+ file: filePath, startLine: node.startPosition.row + 1,
56
+ endLine: node.endPosition.row + 1, parent: null, children: [], metadata: {},
57
+ });
58
+ }
59
+
60
+ for (let i = 0; i < node.childCount; i++) {
61
+ const child = node.child(i);
62
+ if (child) this.walkSvelte(child, symbols, filePath);
63
+ }
64
+ }
65
+
66
+ private extractTagName(node: any): string | null {
67
+ for (let i = 0; i < node.childCount; i++) {
68
+ const child = node.child(i);
69
+ if (!child) continue;
70
+ if (child.type === 'tag_name') return child.text;
71
+ if (child.type === 'start_tag' || child.type === 'self_closing_tag') {
72
+ for (let j = 0; j < child.childCount; j++) {
73
+ const grandchild = child.child(j);
74
+ if (grandchild && grandchild.type === 'tag_name') return grandchild.text;
75
+ }
76
+ }
77
+ }
78
+ return null;
79
+ }
80
+ }
@@ -0,0 +1,137 @@
1
+ import { LanguageAdapter, ParseResult, CodeSymbol, SymbolType } from '../types.js';
2
+
3
+ export class SvgAdapter implements LanguageAdapter {
4
+ languageName(): string { return 'SVG'; }
5
+ fileExtensions(): string[] { return ['.svg']; }
6
+ fileNames(): string[] { return []; }
7
+ canParse(filePath: string): boolean {
8
+ return filePath.toLowerCase().endsWith('.svg');
9
+ }
10
+ supportsSymbols(): boolean { return true; }
11
+
12
+ async parse(content: string, filePath: string): Promise<ParseResult> {
13
+ const lines = content.split('\n');
14
+ const symbols: CodeSymbol[] = [];
15
+ const imports: string[] = [];
16
+ const exports: string[] = [];
17
+ const comments: string[] = [];
18
+
19
+ this.extractSvgElements(lines, symbols, filePath);
20
+ this.extractComments(lines, comments);
21
+
22
+ return { symbols, imports, exports, comments };
23
+ }
24
+
25
+ private extractSvgElements(lines: string[], symbols: CodeSymbol[], filePath: string) {
26
+ const significantElements = [
27
+ 'svg', 'g', 'defs', 'symbol', 'use', 'path', 'rect', 'circle', 'ellipse',
28
+ 'line', 'polyline', 'polygon', 'text', 'tspan', 'textPath', 'image',
29
+ 'switch', 'foreignObject', 'marker', 'pattern', 'clipPath', 'mask',
30
+ 'filter', 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite',
31
+ 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feFlood',
32
+ 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology',
33
+ 'feOffset', 'feSpecularLighting', 'feTile', 'feTurbulence', 'animate',
34
+ 'animateTransform', 'animateMotion', 'set',
35
+ ];
36
+
37
+ for (let i = 0; i < lines.length; i++) {
38
+ const line = lines[i].trim();
39
+
40
+ // Extract SVG elements
41
+ const elementMatch = line.match(/<(\w+)(?:\s|>|\/)/);
42
+ if (elementMatch) {
43
+ const elementName = elementMatch[1].toLowerCase();
44
+ if (significantElements.includes(elementName)) {
45
+ const symbolType = this.getSymbolType(elementName);
46
+ symbols.push({
47
+ id: `${filePath}:${i + 1}`,
48
+ name: elementName,
49
+ type: symbolType,
50
+ language: 'svg',
51
+ file: filePath,
52
+ startLine: i + 1,
53
+ endLine: i + 1,
54
+ parent: null,
55
+ children: [],
56
+ metadata: {},
57
+ });
58
+ }
59
+ }
60
+
61
+ // Extract id attributes as properties
62
+ const idMatch = line.match(/\bid=["']([^"']+)["']/);
63
+ if (idMatch) {
64
+ symbols.push({
65
+ id: `${filePath}:${i + 1}:id`,
66
+ name: idMatch[1],
67
+ type: SymbolType.Property,
68
+ language: 'svg',
69
+ file: filePath,
70
+ startLine: i + 1,
71
+ endLine: i + 1,
72
+ parent: null,
73
+ children: [],
74
+ metadata: {},
75
+ });
76
+ }
77
+
78
+ // Extract class attributes
79
+ const classMatch = line.match(/\bclass=["']([^"']+)["']/);
80
+ if (classMatch) {
81
+ const classes = classMatch[1].split(/\s+/);
82
+ for (const cls of classes) {
83
+ if (cls.trim()) {
84
+ symbols.push({
85
+ id: `${filePath}:${i + 1}:class:${cls}`,
86
+ name: cls,
87
+ type: SymbolType.Property,
88
+ language: 'svg',
89
+ file: filePath,
90
+ startLine: i + 1,
91
+ endLine: i + 1,
92
+ parent: null,
93
+ children: [],
94
+ metadata: {},
95
+ });
96
+ }
97
+ }
98
+ }
99
+ }
100
+ }
101
+
102
+ private getSymbolType(elementName: string): SymbolType {
103
+ const structural = ['svg', 'g', 'defs', 'symbol', 'marker', 'pattern', 'clipPath', 'mask', 'filter'];
104
+ if (structural.includes(elementName)) return SymbolType.Module;
105
+ return SymbolType.Property;
106
+ }
107
+
108
+ private extractComments(lines: string[], comments: string[]) {
109
+ let inComment = false;
110
+ let comment = '';
111
+
112
+ for (const line of lines) {
113
+ if (inComment) {
114
+ const endIdx = line.indexOf('-->');
115
+ if (endIdx >= 0) {
116
+ comment += line.substring(0, endIdx + 3);
117
+ comments.push(comment.trim());
118
+ comment = '';
119
+ inComment = false;
120
+ } else {
121
+ comment += line + '\n';
122
+ }
123
+ } else {
124
+ const startIdx = line.indexOf('<!--');
125
+ if (startIdx >= 0) {
126
+ const endIdx = line.indexOf('-->', startIdx + 4);
127
+ if (endIdx >= 0) {
128
+ comments.push(line.substring(startIdx, endIdx + 3).trim());
129
+ } else {
130
+ comment = line.substring(startIdx) + '\n';
131
+ inComment = true;
132
+ }
133
+ }
134
+ }
135
+ }
136
+ }
137
+ }
@@ -0,0 +1,44 @@
1
+ import { createRequire } from 'node:module';
2
+ import { BaseTreeSitterAdapter, GrammarConfig } from '../base.js';
3
+ import { SymbolType } from '../types.js';
4
+
5
+ const require = createRequire(import.meta.url);
6
+
7
+ const GRAMMAR: GrammarConfig = {
8
+ language: 'swift',
9
+ wasmPath: new URL('../../node_modules/tree-sitter-wasms/out/tree-sitter-swift.wasm', import.meta.url).pathname,
10
+ queryPatterns: {
11
+ class_declaration: '(class_declaration name: (type_identifier) @name)',
12
+ struct_declaration: '(struct_declaration name: (type_identifier) @name)',
13
+ enum_declaration: '(enum_declaration name: (type_identifier) @name)',
14
+ protocol_declaration: '(protocol_declaration name: (type_identifier) @name)',
15
+ extension_declaration: '(extension_declaration type: (user_type) @name)',
16
+ actor_declaration: '(actor_declaration name: (type_identifier) @name)',
17
+ function_declaration: '(function_declaration name: (simple_identifier) @name)',
18
+ initializer_declaration: '(initializer_declaration) @name',
19
+ },
20
+ typeMap: {
21
+ class_declaration: SymbolType.Class,
22
+ struct_declaration: SymbolType.Struct,
23
+ enum_declaration: SymbolType.Enum,
24
+ protocol_declaration: SymbolType.Protocol,
25
+ extension_declaration: SymbolType.Extension,
26
+ actor_declaration: SymbolType.Actor,
27
+ function_declaration: SymbolType.Function,
28
+ method_declaration: SymbolType.Method,
29
+ initializer_declaration: SymbolType.Constructor,
30
+ property_declaration: SymbolType.Property,
31
+ variable_declaration: SymbolType.Variable,
32
+ type_alias_declaration: SymbolType.TypeAlias,
33
+ import_declaration: SymbolType.Import,
34
+ },
35
+ nameNodeTypes: ['simple_identifier', 'type_identifier'],
36
+ importNodeTypes: ['import_declaration'],
37
+ exportNodeTypes: [],
38
+ };
39
+
40
+ export class SwiftAdapter extends BaseTreeSitterAdapter {
41
+ protected grammar = GRAMMAR;
42
+ languageName(): string { return 'Swift'; }
43
+ fileExtensions(): string[] { return ['.swift']; }
44
+ }