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.
- package/README.md +31 -11
- package/dist/cli/index.js +1 -1
- package/dist/embeddings/transformers.d.ts.map +1 -1
- package/dist/graph/builder.d.ts.map +1 -1
- package/dist/graph/builder.js +13 -0
- package/dist/graph/builder.js.map +1 -1
- package/dist/graph/serve.js.map +1 -1
- package/dist/graph/service.d.ts.map +1 -1
- package/dist/graph/storage.d.ts.map +1 -1
- package/dist/graph/types.d.ts +1 -1
- package/dist/graph/types.d.ts.map +1 -1
- package/dist/graph/types.js.map +1 -1
- package/dist/indexer/fixture.test.js.map +1 -1
- package/dist/indexer/indexer.d.ts.map +1 -1
- package/dist/indexer/parser.js.map +1 -1
- package/dist/language/adapters/astro.d.ts +12 -0
- package/dist/language/adapters/astro.d.ts.map +1 -0
- package/dist/language/adapters/astro.js +195 -0
- package/dist/language/adapters/astro.js.map +1 -0
- package/dist/language/adapters/c.d.ts.map +1 -1
- package/dist/language/adapters/c.js.map +1 -1
- package/dist/language/adapters/config.d.ts +14 -0
- package/dist/language/adapters/config.d.ts.map +1 -0
- package/dist/language/adapters/config.js +136 -0
- package/dist/language/adapters/config.js.map +1 -0
- package/dist/language/adapters/cpp.d.ts.map +1 -1
- package/dist/language/adapters/cpp.js.map +1 -1
- package/dist/language/adapters/csharp.d.ts.map +1 -1
- package/dist/language/adapters/csharp.js.map +1 -1
- package/dist/language/adapters/css.d.ts.map +1 -1
- package/dist/language/adapters/css.js.map +1 -1
- package/dist/language/adapters/csv.d.ts +11 -0
- package/dist/language/adapters/csv.d.ts.map +1 -0
- package/dist/language/adapters/csv.js +103 -0
- package/dist/language/adapters/csv.js.map +1 -0
- package/dist/language/adapters/dart.d.ts +7 -0
- package/dist/language/adapters/dart.d.ts.map +1 -0
- package/dist/language/adapters/dart.js +37 -0
- package/dist/language/adapters/dart.js.map +1 -0
- package/dist/language/adapters/dockerfile.d.ts +12 -0
- package/dist/language/adapters/dockerfile.d.ts.map +1 -0
- package/dist/language/adapters/dockerfile.js +71 -0
- package/dist/language/adapters/dockerfile.js.map +1 -0
- package/dist/language/adapters/documentation.d.ts +12 -0
- package/dist/language/adapters/documentation.d.ts.map +1 -0
- package/dist/language/adapters/documentation.js +146 -0
- package/dist/language/adapters/documentation.js.map +1 -0
- package/dist/language/adapters/go.d.ts.map +1 -1
- package/dist/language/adapters/go.js.map +1 -1
- package/dist/language/adapters/haskell.d.ts +7 -0
- package/dist/language/adapters/haskell.d.ts.map +1 -0
- package/dist/language/adapters/haskell.js +33 -0
- package/dist/language/adapters/haskell.js.map +1 -0
- package/dist/language/adapters/html.d.ts.map +1 -1
- package/dist/language/adapters/html.js.map +1 -1
- package/dist/language/adapters/java.d.ts.map +1 -1
- package/dist/language/adapters/java.js.map +1 -1
- package/dist/language/adapters/javascript.d.ts.map +1 -1
- package/dist/language/adapters/javascript.js.map +1 -1
- package/dist/language/adapters/json-variants.d.ts +11 -0
- package/dist/language/adapters/json-variants.d.ts.map +1 -0
- package/dist/language/adapters/json-variants.js +57 -0
- package/dist/language/adapters/json-variants.js.map +1 -0
- package/dist/language/adapters/json.d.ts.map +1 -1
- package/dist/language/adapters/json.js.map +1 -1
- package/dist/language/adapters/kotlin.d.ts +7 -0
- package/dist/language/adapters/kotlin.d.ts.map +1 -0
- package/dist/language/adapters/kotlin.js +35 -0
- package/dist/language/adapters/kotlin.js.map +1 -0
- package/dist/language/adapters/lua.d.ts +7 -0
- package/dist/language/adapters/lua.d.ts.map +1 -0
- package/dist/language/adapters/lua.js +32 -0
- package/dist/language/adapters/lua.js.map +1 -0
- package/dist/language/adapters/markdown.d.ts +12 -0
- package/dist/language/adapters/markdown.d.ts.map +1 -0
- package/dist/language/adapters/markdown.js +76 -0
- package/dist/language/adapters/markdown.js.map +1 -0
- package/dist/language/adapters/php.d.ts.map +1 -1
- package/dist/language/adapters/php.js.map +1 -1
- package/dist/language/adapters/python.d.ts.map +1 -1
- package/dist/language/adapters/python.js.map +1 -1
- package/dist/language/adapters/ruby.d.ts.map +1 -1
- package/dist/language/adapters/ruby.js.map +1 -1
- package/dist/language/adapters/rust.d.ts.map +1 -1
- package/dist/language/adapters/rust.js.map +1 -1
- package/dist/language/adapters/salesforce.d.ts +15 -0
- package/dist/language/adapters/salesforce.d.ts.map +1 -0
- package/dist/language/adapters/salesforce.js +223 -0
- package/dist/language/adapters/salesforce.js.map +1 -0
- package/dist/language/adapters/scala.d.ts +7 -0
- package/dist/language/adapters/scala.d.ts.map +1 -0
- package/dist/language/adapters/scala.js +37 -0
- package/dist/language/adapters/scala.js.map +1 -0
- package/dist/language/adapters/solidity.d.ts +7 -0
- package/dist/language/adapters/solidity.d.ts.map +1 -0
- package/dist/language/adapters/solidity.js +40 -0
- package/dist/language/adapters/solidity.js.map +1 -0
- package/dist/language/adapters/sql.d.ts +12 -0
- package/dist/language/adapters/sql.d.ts.map +1 -0
- package/dist/language/adapters/sql.js +93 -0
- package/dist/language/adapters/sql.js.map +1 -0
- package/dist/language/adapters/svelte.d.ts +11 -0
- package/dist/language/adapters/svelte.d.ts.map +1 -0
- package/dist/language/adapters/svelte.js +76 -0
- package/dist/language/adapters/svelte.js.map +1 -0
- package/dist/language/adapters/svg.d.ts +13 -0
- package/dist/language/adapters/svg.d.ts.map +1 -0
- package/dist/language/adapters/svg.js +130 -0
- package/dist/language/adapters/svg.js.map +1 -0
- package/dist/language/adapters/swift.d.ts +7 -0
- package/dist/language/adapters/swift.d.ts.map +1 -0
- package/dist/language/adapters/swift.js +42 -0
- package/dist/language/adapters/swift.js.map +1 -0
- package/dist/language/adapters/terraform.d.ts +7 -0
- package/dist/language/adapters/terraform.d.ts.map +1 -0
- package/dist/language/adapters/terraform.js +23 -0
- package/dist/language/adapters/terraform.js.map +1 -0
- package/dist/language/adapters/text.d.ts +14 -0
- package/dist/language/adapters/text.d.ts.map +1 -0
- package/dist/language/adapters/text.js +178 -0
- package/dist/language/adapters/text.js.map +1 -0
- package/dist/language/adapters/toml.d.ts +12 -0
- package/dist/language/adapters/toml.d.ts.map +1 -0
- package/dist/language/adapters/toml.js +79 -0
- package/dist/language/adapters/toml.js.map +1 -0
- package/dist/language/adapters/typescript.d.ts.map +1 -1
- package/dist/language/adapters/typescript.js.map +1 -1
- package/dist/language/adapters/vue.d.ts +11 -0
- package/dist/language/adapters/vue.d.ts.map +1 -0
- package/dist/language/adapters/vue.js +67 -0
- package/dist/language/adapters/vue.js.map +1 -0
- package/dist/language/adapters/xml.d.ts +12 -0
- package/dist/language/adapters/xml.d.ts.map +1 -0
- package/dist/language/adapters/xml.js +71 -0
- package/dist/language/adapters/xml.js.map +1 -0
- package/dist/language/adapters/yaml.d.ts +11 -0
- package/dist/language/adapters/yaml.d.ts.map +1 -0
- package/dist/language/adapters/yaml.js +60 -0
- package/dist/language/adapters/yaml.js.map +1 -0
- package/dist/language/base.d.ts.map +1 -1
- package/dist/language/base.js.map +1 -1
- package/dist/language/generic.d.ts.map +1 -1
- package/dist/language/registry.d.ts.map +1 -1
- package/dist/language/registry.js +51 -0
- package/dist/language/registry.js.map +1 -1
- package/dist/language/types.d.ts +14 -1
- package/dist/language/types.d.ts.map +1 -1
- package/dist/language/types.js +13 -0
- package/dist/language/types.js.map +1 -1
- package/dist/logging.d.ts.map +1 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp-config.js.map +1 -1
- package/dist/retrieval/search.d.ts.map +1 -1
- package/dist/storage/fts.d.ts.map +1 -1
- package/dist/storage/metadata.d.ts.map +1 -1
- package/dist/vector/lancedb.d.ts.map +1 -1
- package/dist/watcher/index.d.ts.map +1 -1
- package/package.json +54 -2
- package/src/cli/index.ts +1 -1
- package/src/graph/builder.ts +13 -0
- package/src/graph/types.ts +14 -1
- package/src/language/adapters/astro.ts +206 -0
- package/src/language/adapters/config.ts +144 -0
- package/src/language/adapters/csv.ts +110 -0
- package/src/language/adapters/dart.ts +39 -0
- package/src/language/adapters/dockerfile.ts +78 -0
- package/src/language/adapters/documentation.ts +158 -0
- package/src/language/adapters/haskell.ts +35 -0
- package/src/language/adapters/json-variants.ts +60 -0
- package/src/language/adapters/kotlin.ts +37 -0
- package/src/language/adapters/lua.ts +34 -0
- package/src/language/adapters/markdown.ts +81 -0
- package/src/language/adapters/salesforce.ts +236 -0
- package/src/language/adapters/scala.ts +39 -0
- package/src/language/adapters/solidity.ts +42 -0
- package/src/language/adapters/sql.ts +99 -0
- package/src/language/adapters/svelte.ts +80 -0
- package/src/language/adapters/svg.ts +137 -0
- package/src/language/adapters/swift.ts +44 -0
- package/src/language/adapters/terraform.ts +25 -0
- package/src/language/adapters/text.ts +195 -0
- package/src/language/adapters/toml.ts +82 -0
- package/src/language/adapters/vue.ts +70 -0
- package/src/language/adapters/xml.ts +74 -0
- package/src/language/adapters/yaml.ts +63 -0
- package/src/language/registry.ts +53 -0
- package/src/language/types.ts +13 -0
- package/src/types/better-sqlite3.d.ts +55 -0
- package/src/types/cli-progress.d.ts +32 -0
- package/src/types/vitest.d.ts +11 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { BaseTreeSitterAdapter, GrammarConfig } from '../base.js';
|
|
3
|
+
import { SymbolType } from '../types.js';
|
|
4
|
+
|
|
5
|
+
const GRAMMAR: GrammarConfig = {
|
|
6
|
+
language: 'hcl',
|
|
7
|
+
wasmPath: new URL('../../node_modules/@tree-sitter-grammars/tree-sitter-hcl/tree-sitter-hcl.wasm', import.meta.url).pathname,
|
|
8
|
+
queryPatterns: {
|
|
9
|
+
block: '(block (identifier) @name)',
|
|
10
|
+
attribute: '(attribute (identifier) @name)',
|
|
11
|
+
},
|
|
12
|
+
typeMap: {
|
|
13
|
+
block: SymbolType.Module,
|
|
14
|
+
attribute: SymbolType.Property,
|
|
15
|
+
},
|
|
16
|
+
nameNodeTypes: ['identifier'],
|
|
17
|
+
importNodeTypes: [],
|
|
18
|
+
exportNodeTypes: [],
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export class TerraformAdapter extends BaseTreeSitterAdapter {
|
|
22
|
+
protected grammar = GRAMMAR;
|
|
23
|
+
languageName(): string { return 'Terraform'; }
|
|
24
|
+
fileExtensions(): string[] { return ['.tf', '.tfvars']; }
|
|
25
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { LanguageAdapter, ParseResult, CodeSymbol, SymbolType } from '../types.js';
|
|
2
|
+
|
|
3
|
+
export class TextAdapter implements LanguageAdapter {
|
|
4
|
+
languageName(): string { return 'Text'; }
|
|
5
|
+
fileExtensions(): string[] { return ['.txt', '.log']; }
|
|
6
|
+
fileNames(): string[] { return []; }
|
|
7
|
+
canParse(filePath: string): boolean {
|
|
8
|
+
const lower = filePath.toLowerCase();
|
|
9
|
+
return lower.endsWith('.txt') || lower.endsWith('.log');
|
|
10
|
+
}
|
|
11
|
+
supportsSymbols(): boolean { return true; }
|
|
12
|
+
|
|
13
|
+
async parse(content: string, filePath: string): Promise<ParseResult> {
|
|
14
|
+
const lines = content.split('\n');
|
|
15
|
+
const symbols: CodeSymbol[] = [];
|
|
16
|
+
const imports: string[] = [];
|
|
17
|
+
const exports: string[] = [];
|
|
18
|
+
const comments: string[] = [];
|
|
19
|
+
|
|
20
|
+
if (filePath.endsWith('.log')) {
|
|
21
|
+
this.extractLogEntries(lines, symbols, filePath);
|
|
22
|
+
} else {
|
|
23
|
+
this.extractTextSections(lines, symbols, filePath);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return { symbols, imports, exports, comments };
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
private extractLogEntries(lines: string[], symbols: CodeSymbol[], filePath: string) {
|
|
30
|
+
const logPatterns = [
|
|
31
|
+
{ regex: /^\d{4}-\d{2}-\d{2}[T ]\d{2}:\d{2}:\d{2}/i, type: SymbolType.Function },
|
|
32
|
+
{ regex: /^\[?\d{4}-\d{2}-\d{2}\]?/i, type: SymbolType.Function },
|
|
33
|
+
{ regex: /^(ERROR|WARN|INFO|DEBUG|FATAL)/i, type: SymbolType.Function },
|
|
34
|
+
{ regex: /^Exception|Error|Warning/i, type: SymbolType.Function },
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
for (let i = 0; i < lines.length; i++) {
|
|
38
|
+
const line = lines[i].trim();
|
|
39
|
+
|
|
40
|
+
if (!line) continue;
|
|
41
|
+
|
|
42
|
+
for (const pattern of logPatterns) {
|
|
43
|
+
if (pattern.regex.test(line)) {
|
|
44
|
+
symbols.push({
|
|
45
|
+
id: `${filePath}:${i + 1}`,
|
|
46
|
+
name: line.substring(0, 50),
|
|
47
|
+
type: pattern.type,
|
|
48
|
+
language: 'log',
|
|
49
|
+
file: filePath,
|
|
50
|
+
startLine: i + 1,
|
|
51
|
+
endLine: i + 1,
|
|
52
|
+
parent: null,
|
|
53
|
+
children: [],
|
|
54
|
+
metadata: { fullLine: line },
|
|
55
|
+
});
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Extract stack traces
|
|
61
|
+
if (line.includes('at ') && line.includes('(') && line.includes(')')) {
|
|
62
|
+
symbols.push({
|
|
63
|
+
id: `${filePath}:${i + 1}:stack`,
|
|
64
|
+
name: 'stackTrace',
|
|
65
|
+
type: SymbolType.Function,
|
|
66
|
+
language: 'log',
|
|
67
|
+
file: filePath,
|
|
68
|
+
startLine: i + 1,
|
|
69
|
+
endLine: i + 1,
|
|
70
|
+
parent: null,
|
|
71
|
+
children: [],
|
|
72
|
+
metadata: { trace: line },
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private extractTextSections(lines: string[], symbols: CodeSymbol[], filePath: string) {
|
|
79
|
+
let currentSection: string | null = null;
|
|
80
|
+
let currentSectionId: string | null = null;
|
|
81
|
+
let sectionStart = 0;
|
|
82
|
+
|
|
83
|
+
for (let i = 0; i < lines.length; i++) {
|
|
84
|
+
const line = lines[i].trim();
|
|
85
|
+
|
|
86
|
+
// Detect section headers (lines that are all uppercase, or followed by underline)
|
|
87
|
+
const isHeader = this.isSectionHeader(line, lines[i + 1]);
|
|
88
|
+
|
|
89
|
+
if (isHeader && line.length > 0) {
|
|
90
|
+
// Save previous section
|
|
91
|
+
if (currentSection) {
|
|
92
|
+
symbols.push({
|
|
93
|
+
id: currentSectionId!,
|
|
94
|
+
name: currentSection,
|
|
95
|
+
type: SymbolType.Section,
|
|
96
|
+
language: 'text',
|
|
97
|
+
file: filePath,
|
|
98
|
+
startLine: sectionStart,
|
|
99
|
+
endLine: i,
|
|
100
|
+
parent: null,
|
|
101
|
+
children: [],
|
|
102
|
+
metadata: {},
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Start new section
|
|
107
|
+
currentSection = line;
|
|
108
|
+
currentSectionId = `${filePath}:${i + 1}`;
|
|
109
|
+
sectionStart = i + 1;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Save last section
|
|
114
|
+
if (currentSection) {
|
|
115
|
+
symbols.push({
|
|
116
|
+
id: currentSectionId!,
|
|
117
|
+
name: currentSection,
|
|
118
|
+
type: SymbolType.Section,
|
|
119
|
+
language: 'text',
|
|
120
|
+
file: filePath,
|
|
121
|
+
startLine: sectionStart,
|
|
122
|
+
endLine: lines.length,
|
|
123
|
+
parent: null,
|
|
124
|
+
children: [],
|
|
125
|
+
metadata: {},
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// If no sections found, create paragraph-based symbols
|
|
130
|
+
if (symbols.length === 0) {
|
|
131
|
+
this.extractParagraphs(lines, symbols, filePath);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
private isSectionHeader(line: string, nextLine: string | undefined): boolean {
|
|
136
|
+
if (!line || line.length < 3) return false;
|
|
137
|
+
|
|
138
|
+
// Check if line is all uppercase
|
|
139
|
+
if (line === line.toUpperCase() && /[A-Z]/.test(line)) return true;
|
|
140
|
+
|
|
141
|
+
// Check if next line is underline (=== or ---)
|
|
142
|
+
if (nextLine) {
|
|
143
|
+
const underline = nextLine.trim();
|
|
144
|
+
if (/^[=-]{3,}$/.test(underline)) return true;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
private extractParagraphs(lines: string[], symbols: CodeSymbol[], filePath: string) {
|
|
151
|
+
let paragraphStart = 0;
|
|
152
|
+
let paragraphText = '';
|
|
153
|
+
|
|
154
|
+
for (let i = 0; i < lines.length; i++) {
|
|
155
|
+
const line = lines[i].trim();
|
|
156
|
+
|
|
157
|
+
if (line === '') {
|
|
158
|
+
if (paragraphText.length > 0) {
|
|
159
|
+
symbols.push({
|
|
160
|
+
id: `${filePath}:${paragraphStart + 1}`,
|
|
161
|
+
name: paragraphText.substring(0, 50),
|
|
162
|
+
type: SymbolType.Section,
|
|
163
|
+
language: 'text',
|
|
164
|
+
file: filePath,
|
|
165
|
+
startLine: paragraphStart + 1,
|
|
166
|
+
endLine: i,
|
|
167
|
+
parent: null,
|
|
168
|
+
children: [],
|
|
169
|
+
metadata: { size: paragraphText.length },
|
|
170
|
+
});
|
|
171
|
+
paragraphText = '';
|
|
172
|
+
}
|
|
173
|
+
paragraphStart = i + 1;
|
|
174
|
+
} else {
|
|
175
|
+
paragraphText += (paragraphText ? ' ' : '') + line;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Handle last paragraph
|
|
180
|
+
if (paragraphText.length > 0) {
|
|
181
|
+
symbols.push({
|
|
182
|
+
id: `${filePath}:${paragraphStart + 1}`,
|
|
183
|
+
name: paragraphText.substring(0, 50),
|
|
184
|
+
type: SymbolType.Section,
|
|
185
|
+
language: 'text',
|
|
186
|
+
file: filePath,
|
|
187
|
+
startLine: paragraphStart + 1,
|
|
188
|
+
endLine: lines.length,
|
|
189
|
+
parent: null,
|
|
190
|
+
children: [],
|
|
191
|
+
metadata: { size: paragraphText.length },
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { BaseTreeSitterAdapter, GrammarConfig } from '../base.js';
|
|
3
|
+
import { SymbolType, CodeSymbol } from '../types.js';
|
|
4
|
+
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
|
|
7
|
+
const GRAMMAR: GrammarConfig = {
|
|
8
|
+
language: 'toml',
|
|
9
|
+
wasmPath: new URL('../../node_modules/tree-sitter-wasms/out/tree-sitter-toml.wasm', import.meta.url).pathname,
|
|
10
|
+
queryPatterns: {},
|
|
11
|
+
typeMap: {},
|
|
12
|
+
nameNodeTypes: ['bare_key', 'string'],
|
|
13
|
+
importNodeTypes: [],
|
|
14
|
+
exportNodeTypes: [],
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export class TomlAdapter extends BaseTreeSitterAdapter {
|
|
18
|
+
protected grammar = GRAMMAR;
|
|
19
|
+
languageName(): string { return 'TOML'; }
|
|
20
|
+
fileExtensions(): string[] { return ['.toml']; }
|
|
21
|
+
|
|
22
|
+
protected async extractSymbolsFromTree(tree: any, filePath: string, content: string): Promise<CodeSymbol[]> {
|
|
23
|
+
const symbols: CodeSymbol[] = [];
|
|
24
|
+
this.walkToml(tree.rootNode, symbols, filePath, '');
|
|
25
|
+
return symbols;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
private walkToml(node: any, symbols: CodeSymbol[], filePath: string, parentId: string) {
|
|
29
|
+
if (node.type === 'table' || node.type === 'table_array_element') {
|
|
30
|
+
const key = this.extractTomlKey(node);
|
|
31
|
+
if (key) {
|
|
32
|
+
const id = `${filePath}:${node.startPosition.row + 1}`;
|
|
33
|
+
symbols.push({
|
|
34
|
+
id, name: key, type: SymbolType.Section, language: 'toml',
|
|
35
|
+
file: filePath, startLine: node.startPosition.row + 1,
|
|
36
|
+
endLine: node.endPosition.row + 1, parent: parentId || null, children: [], metadata: {},
|
|
37
|
+
});
|
|
38
|
+
parentId = id;
|
|
39
|
+
}
|
|
40
|
+
} else if (node.type === 'pair') {
|
|
41
|
+
const key = this.extractPairKey(node);
|
|
42
|
+
if (key) {
|
|
43
|
+
const id = `${filePath}:${node.startPosition.row + 1}`;
|
|
44
|
+
symbols.push({
|
|
45
|
+
id, name: key, type: SymbolType.Property, language: 'toml',
|
|
46
|
+
file: filePath, startLine: node.startPosition.row + 1,
|
|
47
|
+
endLine: node.endPosition.row + 1, parent: parentId || null, children: [], metadata: {},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
53
|
+
const child = node.child(i);
|
|
54
|
+
if (child) this.walkToml(child, symbols, filePath, parentId);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private extractTomlKey(node: any): string | null {
|
|
59
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
60
|
+
const child = node.child(i);
|
|
61
|
+
if (!child) continue;
|
|
62
|
+
if (child.type === 'bare_key' || child.type === 'string') {
|
|
63
|
+
return child.text?.replace(/"/g, '') || null;
|
|
64
|
+
}
|
|
65
|
+
if (child.type === 'dotted_key') {
|
|
66
|
+
return child.text || null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private extractPairKey(node: any): string | null {
|
|
73
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
74
|
+
const child = node.child(i);
|
|
75
|
+
if (!child) continue;
|
|
76
|
+
if (child.type === 'bare_key' || child.type === 'string') {
|
|
77
|
+
return child.text?.replace(/"/g, '') || null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
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: 'vue',
|
|
7
|
+
wasmPath: new URL('../../node_modules/tree-sitter-wasms/out/tree-sitter-vue.wasm', import.meta.url).pathname,
|
|
8
|
+
queryPatterns: {},
|
|
9
|
+
typeMap: {},
|
|
10
|
+
nameNodeTypes: ['tag_name', 'attribute_name', 'directive_attribute'],
|
|
11
|
+
importNodeTypes: [],
|
|
12
|
+
exportNodeTypes: [],
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export class VueAdapter extends BaseTreeSitterAdapter {
|
|
16
|
+
protected grammar = GRAMMAR;
|
|
17
|
+
languageName(): string { return 'Vue'; }
|
|
18
|
+
fileExtensions(): string[] { return ['.vue']; }
|
|
19
|
+
|
|
20
|
+
protected async extractSymbolsFromTree(tree: any, filePath: string, content: string): Promise<CodeSymbol[]> {
|
|
21
|
+
const symbols: CodeSymbol[] = [];
|
|
22
|
+
this.walkVue(tree.rootNode, symbols, filePath);
|
|
23
|
+
return symbols;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
private walkVue(node: any, symbols: CodeSymbol[], filePath: string) {
|
|
27
|
+
// Extract top-level sections: <template>, <script>, <style>
|
|
28
|
+
if (node.type === 'element') {
|
|
29
|
+
const tagName = this.extractTagName(node);
|
|
30
|
+
if (tagName && ['template', 'script', 'style'].includes(tagName.toLowerCase())) {
|
|
31
|
+
const id = `${filePath}:${node.startPosition.row + 1}`;
|
|
32
|
+
symbols.push({
|
|
33
|
+
id, name: tagName, type: SymbolType.Section, language: 'vue',
|
|
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: 'vue',
|
|
44
|
+
file: filePath, startLine: node.startPosition.row + 1,
|
|
45
|
+
endLine: node.endPosition.row + 1, parent: null, children: [], metadata: {},
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
51
|
+
const child = node.child(i);
|
|
52
|
+
if (child) this.walkVue(child, symbols, filePath);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private extractTagName(node: any): string | null {
|
|
57
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
58
|
+
const child = node.child(i);
|
|
59
|
+
if (!child) continue;
|
|
60
|
+
if (child.type === 'tag_name') return child.text;
|
|
61
|
+
if (child.type === 'start_tag' || child.type === 'self_closing_tag') {
|
|
62
|
+
for (let j = 0; j < child.childCount; j++) {
|
|
63
|
+
const grandchild = child.child(j);
|
|
64
|
+
if (grandchild && grandchild.type === 'tag_name') return grandchild.text;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
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: 'xml',
|
|
7
|
+
wasmPath: new URL('../../node_modules/@tree-sitter-grammars/tree-sitter-xml/tree-sitter-xml.wasm', import.meta.url).pathname,
|
|
8
|
+
queryPatterns: {},
|
|
9
|
+
typeMap: {},
|
|
10
|
+
nameNodeTypes: ['tag_name', 'attribute_name'],
|
|
11
|
+
importNodeTypes: [],
|
|
12
|
+
exportNodeTypes: [],
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export class XmlAdapter extends BaseTreeSitterAdapter {
|
|
16
|
+
protected grammar = GRAMMAR;
|
|
17
|
+
languageName(): string { return 'XML'; }
|
|
18
|
+
fileExtensions(): string[] { return ['.xml']; }
|
|
19
|
+
|
|
20
|
+
protected async extractSymbolsFromTree(tree: any, filePath: string, content: string): Promise<CodeSymbol[]> {
|
|
21
|
+
const symbols: CodeSymbol[] = [];
|
|
22
|
+
this.collectElements(tree.rootNode, symbols, filePath, '');
|
|
23
|
+
return symbols;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
private collectElements(node: any, symbols: CodeSymbol[], filePath: string, parentId: string) {
|
|
27
|
+
if (node.type === 'element') {
|
|
28
|
+
const tagName = this.extractTagName(node);
|
|
29
|
+
if (tagName) {
|
|
30
|
+
const id = `${filePath}:${node.startPosition.row + 1}`;
|
|
31
|
+
const symbolType = this.getSymbolType(tagName);
|
|
32
|
+
|
|
33
|
+
symbols.push({
|
|
34
|
+
id, name: tagName, type: symbolType, language: 'xml',
|
|
35
|
+
file: filePath, startLine: node.startPosition.row + 1,
|
|
36
|
+
endLine: node.endPosition.row + 1, parent: parentId || null, children: [], metadata: {},
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Recurse into child elements
|
|
40
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
41
|
+
const child = node.child(i);
|
|
42
|
+
if (child) this.collectElements(child, symbols, filePath, id);
|
|
43
|
+
}
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
49
|
+
const child = node.child(i);
|
|
50
|
+
if (child) this.collectElements(child, symbols, filePath, parentId);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private extractTagName(node: any): string | null {
|
|
55
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
56
|
+
const child = node.child(i);
|
|
57
|
+
if (!child) continue;
|
|
58
|
+
if (child.type === 'tag_name') return child.text;
|
|
59
|
+
if (child.type === 'start_tag' || child.type === 'self_closing_tag') {
|
|
60
|
+
for (let j = 0; j < child.childCount; j++) {
|
|
61
|
+
const grandchild = child.child(j);
|
|
62
|
+
if (grandchild && grandchild.type === 'tag_name') return grandchild.text;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private getSymbolType(tagName: string): SymbolType {
|
|
70
|
+
const significant = ['configuration', 'settings', 'properties', 'beans', 'component', 'module', 'project'];
|
|
71
|
+
if (significant.includes(tagName.toLowerCase())) return SymbolType.Module;
|
|
72
|
+
return SymbolType.Property;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { BaseTreeSitterAdapter, GrammarConfig } from '../base.js';
|
|
3
|
+
import { SymbolType, CodeSymbol } from '../types.js';
|
|
4
|
+
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
|
|
7
|
+
const GRAMMAR: GrammarConfig = {
|
|
8
|
+
language: 'yaml',
|
|
9
|
+
wasmPath: new URL('../../node_modules/tree-sitter-wasms/out/tree-sitter-yaml.wasm', import.meta.url).pathname,
|
|
10
|
+
queryPatterns: {},
|
|
11
|
+
typeMap: {},
|
|
12
|
+
nameNodeTypes: ['string_scalar', 'plain_scalar'],
|
|
13
|
+
importNodeTypes: [],
|
|
14
|
+
exportNodeTypes: [],
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export class YamlAdapter extends BaseTreeSitterAdapter {
|
|
18
|
+
protected grammar = GRAMMAR;
|
|
19
|
+
languageName(): string { return 'YAML'; }
|
|
20
|
+
fileExtensions(): string[] { return ['.yaml', '.yml']; }
|
|
21
|
+
|
|
22
|
+
protected async extractSymbolsFromTree(tree: any, filePath: string, content: string): Promise<CodeSymbol[]> {
|
|
23
|
+
const symbols: CodeSymbol[] = [];
|
|
24
|
+
this.walkYaml(tree.rootNode, symbols, filePath, '');
|
|
25
|
+
return symbols;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
private walkYaml(node: any, symbols: CodeSymbol[], filePath: string, parentId: string) {
|
|
29
|
+
if (node.type === 'block_mapping_pair' || node.type === 'flow_pair') {
|
|
30
|
+
const key = this.extractYamlKey(node);
|
|
31
|
+
if (key) {
|
|
32
|
+
const id = `${filePath}:${node.startPosition.row + 1}`;
|
|
33
|
+
symbols.push({
|
|
34
|
+
id, name: key, type: SymbolType.Property, language: 'yaml',
|
|
35
|
+
file: filePath, startLine: node.startPosition.row + 1,
|
|
36
|
+
endLine: node.endPosition.row + 1, parent: parentId || null, children: [], metadata: {},
|
|
37
|
+
});
|
|
38
|
+
// Recurse into nested mappings
|
|
39
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
40
|
+
const child = node.child(i);
|
|
41
|
+
if (child && (child.type === 'block_mapping' || child.type === 'flow_mapping')) {
|
|
42
|
+
this.walkYaml(child, symbols, filePath, id);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
48
|
+
const child = node.child(i);
|
|
49
|
+
if (child) this.walkYaml(child, symbols, filePath, parentId);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
private extractYamlKey(node: any): string | null {
|
|
54
|
+
for (let i = 0; i < node.childCount; i++) {
|
|
55
|
+
const child = node.child(i);
|
|
56
|
+
if (!child) continue;
|
|
57
|
+
if (child.type === 'string_scalar' || child.type === 'plain_scalar') {
|
|
58
|
+
return child.text || null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
}
|
package/src/language/registry.ts
CHANGED
|
@@ -13,6 +13,30 @@ import { PhpAdapter } from './adapters/php.js';
|
|
|
13
13
|
import { HtmlAdapter } from './adapters/html.js';
|
|
14
14
|
import { CssAdapter } from './adapters/css.js';
|
|
15
15
|
import { JsonAdapter } from './adapters/json.js';
|
|
16
|
+
import { SwiftAdapter } from './adapters/swift.js';
|
|
17
|
+
import { KotlinAdapter } from './adapters/kotlin.js';
|
|
18
|
+
import { DartAdapter } from './adapters/dart.js';
|
|
19
|
+
import { ScalaAdapter } from './adapters/scala.js';
|
|
20
|
+
import { HaskellAdapter } from './adapters/haskell.js';
|
|
21
|
+
import { SolidityAdapter } from './adapters/solidity.js';
|
|
22
|
+
import { LuaAdapter } from './adapters/lua.js';
|
|
23
|
+
import { YamlAdapter } from './adapters/yaml.js';
|
|
24
|
+
import { TomlAdapter } from './adapters/toml.js';
|
|
25
|
+
import { SqlAdapter } from './adapters/sql.js';
|
|
26
|
+
import { MarkdownAdapter } from './adapters/markdown.js';
|
|
27
|
+
import { XmlAdapter } from './adapters/xml.js';
|
|
28
|
+
import { VueAdapter } from './adapters/vue.js';
|
|
29
|
+
import { SvelteAdapter } from './adapters/svelte.js';
|
|
30
|
+
import { TerraformAdapter } from './adapters/terraform.js';
|
|
31
|
+
import { DockerfileAdapter } from './adapters/dockerfile.js';
|
|
32
|
+
import { SalesforceAdapter } from './adapters/salesforce.js';
|
|
33
|
+
import { CsvAdapter } from './adapters/csv.js';
|
|
34
|
+
import { JsonVariantsAdapter } from './adapters/json-variants.js';
|
|
35
|
+
import { ConfigAdapter } from './adapters/config.js';
|
|
36
|
+
import { DocumentationAdapter } from './adapters/documentation.js';
|
|
37
|
+
import { SvgAdapter } from './adapters/svg.js';
|
|
38
|
+
import { TextAdapter } from './adapters/text.js';
|
|
39
|
+
import { AstroAdapter } from './adapters/astro.js';
|
|
16
40
|
import { GenericAdapter } from './generic.js';
|
|
17
41
|
|
|
18
42
|
export type AdapterEntry = {
|
|
@@ -33,6 +57,7 @@ export class LanguageRegistry {
|
|
|
33
57
|
}
|
|
34
58
|
|
|
35
59
|
private registerDefaults() {
|
|
60
|
+
// Tier 1: Full symbol extraction (programming languages)
|
|
36
61
|
this.register('ts', new TypeScriptAdapter(), 1);
|
|
37
62
|
this.register('js', new JavaScriptAdapter(), 1);
|
|
38
63
|
this.register('py', new PythonAdapter(), 1);
|
|
@@ -44,9 +69,37 @@ export class LanguageRegistry {
|
|
|
44
69
|
this.register('cpp', new CppAdapter(), 1);
|
|
45
70
|
this.register('csharp', new CSharpAdapter(), 1);
|
|
46
71
|
this.register('php', new PhpAdapter(), 1);
|
|
72
|
+
this.register('swift', new SwiftAdapter(), 1);
|
|
73
|
+
this.register('kotlin', new KotlinAdapter(), 1);
|
|
74
|
+
this.register('dart', new DartAdapter(), 1);
|
|
75
|
+
this.register('scala', new ScalaAdapter(), 1);
|
|
76
|
+
this.register('haskell', new HaskellAdapter(), 1);
|
|
77
|
+
this.register('solidity', new SolidityAdapter(), 1);
|
|
78
|
+
this.register('lua', new LuaAdapter(), 1);
|
|
79
|
+
|
|
80
|
+
// Tier 2: Structural extraction (markup, config, data)
|
|
47
81
|
this.register('html', new HtmlAdapter(), 2);
|
|
48
82
|
this.register('css', new CssAdapter(), 2);
|
|
49
83
|
this.register('json', new JsonAdapter(), 2);
|
|
84
|
+
this.register('yaml', new YamlAdapter(), 2);
|
|
85
|
+
this.register('toml', new TomlAdapter(), 2);
|
|
86
|
+
this.register('sql', new SqlAdapter(), 2);
|
|
87
|
+
this.register('markdown', new MarkdownAdapter(), 2);
|
|
88
|
+
|
|
89
|
+
// Tier 2: Additional markup and config languages
|
|
90
|
+
this.register('xml', new XmlAdapter(), 2);
|
|
91
|
+
this.register('vue', new VueAdapter(), 2);
|
|
92
|
+
this.register('svelte', new SvelteAdapter(), 2);
|
|
93
|
+
this.register('terraform', new TerraformAdapter(), 2);
|
|
94
|
+
this.register('dockerfile', new DockerfileAdapter(), 2);
|
|
95
|
+
this.register('salesforce', new SalesforceAdapter(), 2);
|
|
96
|
+
this.register('csv', new CsvAdapter(), 2);
|
|
97
|
+
this.register('json-variants', new JsonVariantsAdapter(), 2);
|
|
98
|
+
this.register('config', new ConfigAdapter(), 2);
|
|
99
|
+
this.register('documentation', new DocumentationAdapter(), 2);
|
|
100
|
+
this.register('svg', new SvgAdapter(), 2);
|
|
101
|
+
this.register('text', new TextAdapter(), 2);
|
|
102
|
+
this.register('astro', new AstroAdapter(), 2);
|
|
50
103
|
}
|
|
51
104
|
|
|
52
105
|
register(key: string, adapter: LanguageAdapter, tier: 1 | 2 | 3) {
|
package/src/language/types.ts
CHANGED
|
@@ -18,6 +18,19 @@ export enum SymbolType {
|
|
|
18
18
|
Export = 'export',
|
|
19
19
|
Comment = 'comment',
|
|
20
20
|
Unknown = 'unknown',
|
|
21
|
+
Package = 'package',
|
|
22
|
+
Constructor = 'constructor',
|
|
23
|
+
Extension = 'extension',
|
|
24
|
+
Field = 'field',
|
|
25
|
+
TypeAlias = 'type_alias',
|
|
26
|
+
Document = 'document',
|
|
27
|
+
Section = 'section',
|
|
28
|
+
Table = 'table',
|
|
29
|
+
Selector = 'selector',
|
|
30
|
+
Rule = 'rule',
|
|
31
|
+
Actor = 'actor',
|
|
32
|
+
Object = 'object',
|
|
33
|
+
Protocol = 'protocol',
|
|
21
34
|
}
|
|
22
35
|
|
|
23
36
|
export interface CodeSymbol {
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
declare module 'better-sqlite3' {
|
|
2
|
+
namespace Database {
|
|
3
|
+
interface Database {
|
|
4
|
+
prepare(sql: string): Statement;
|
|
5
|
+
exec(sql: string): Database;
|
|
6
|
+
pragma(pragma: string, options?: { simple?: boolean }): any;
|
|
7
|
+
function(name: string, cb: (...args: any[]) => any): Database;
|
|
8
|
+
aggregate(name: string, options: any): Database;
|
|
9
|
+
loadExtension(path: string, entryPoint?: string): Database;
|
|
10
|
+
close(): Database;
|
|
11
|
+
defaultSafeIntegers(toggleState?: boolean): Database;
|
|
12
|
+
unsafeMode(unsafe?: boolean): Database;
|
|
13
|
+
transaction(fn: (...args: any[]) => any): (...args: any[]) => any;
|
|
14
|
+
savepoint(fn: (...args: any[]) => any): (...args: any[]) => any;
|
|
15
|
+
checkpoint(databaseName?: string): Database;
|
|
16
|
+
readonly(toggleState?: boolean): Database;
|
|
17
|
+
open: boolean;
|
|
18
|
+
inTransaction: boolean;
|
|
19
|
+
name: string;
|
|
20
|
+
memory: boolean;
|
|
21
|
+
readonly: boolean;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface Statement {
|
|
25
|
+
database: Database;
|
|
26
|
+
source: string;
|
|
27
|
+
reader: boolean;
|
|
28
|
+
readonly: boolean;
|
|
29
|
+
busy: boolean;
|
|
30
|
+
run(...params: any[]): RunResult;
|
|
31
|
+
get(...params: any[]): any;
|
|
32
|
+
all(...params: any[]): any[];
|
|
33
|
+
iterate(...params: any[]): IterableIterator<any>;
|
|
34
|
+
pluck(toggleState?: boolean): Statement;
|
|
35
|
+
expand(toggleState?: boolean): Statement;
|
|
36
|
+
raw(toggleState?: boolean): Statement;
|
|
37
|
+
columns(toggleState?: boolean): Statement;
|
|
38
|
+
bind(...params: any[]): Statement;
|
|
39
|
+
safeIntegers(toggleState?: boolean): Statement;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface RunResult {
|
|
43
|
+
changes: number;
|
|
44
|
+
lastInsertRowid: number | bigint;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
interface DatabaseConstructor {
|
|
49
|
+
new(filename?: string | Buffer, options?: any): Database.Database;
|
|
50
|
+
(filename?: string | Buffer, options?: any): Database.Database;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const Database: DatabaseConstructor;
|
|
54
|
+
export = Database;
|
|
55
|
+
}
|