@liendev/parser 0.39.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 (153) hide show
  1. package/dist/ast/chunker.d.ts +30 -0
  2. package/dist/ast/chunker.d.ts.map +1 -0
  3. package/dist/ast/chunker.js +310 -0
  4. package/dist/ast/chunker.js.map +1 -0
  5. package/dist/ast/complexity/cognitive.d.ts +16 -0
  6. package/dist/ast/complexity/cognitive.d.ts.map +1 -0
  7. package/dist/ast/complexity/cognitive.js +137 -0
  8. package/dist/ast/complexity/cognitive.js.map +1 -0
  9. package/dist/ast/complexity/cyclomatic.d.ts +12 -0
  10. package/dist/ast/complexity/cyclomatic.d.ts.map +1 -0
  11. package/dist/ast/complexity/cyclomatic.js +54 -0
  12. package/dist/ast/complexity/cyclomatic.js.map +1 -0
  13. package/dist/ast/complexity/halstead.d.ts +56 -0
  14. package/dist/ast/complexity/halstead.d.ts.map +1 -0
  15. package/dist/ast/complexity/halstead.js +196 -0
  16. package/dist/ast/complexity/halstead.js.map +1 -0
  17. package/dist/ast/complexity/index.d.ts +13 -0
  18. package/dist/ast/complexity/index.d.ts.map +1 -0
  19. package/dist/ast/complexity/index.js +12 -0
  20. package/dist/ast/complexity/index.js.map +1 -0
  21. package/dist/ast/extractors/index.d.ts +35 -0
  22. package/dist/ast/extractors/index.d.ts.map +1 -0
  23. package/dist/ast/extractors/index.js +41 -0
  24. package/dist/ast/extractors/index.js.map +1 -0
  25. package/dist/ast/extractors/symbol-helpers.d.ts +20 -0
  26. package/dist/ast/extractors/symbol-helpers.d.ts.map +1 -0
  27. package/dist/ast/extractors/symbol-helpers.js +58 -0
  28. package/dist/ast/extractors/symbol-helpers.js.map +1 -0
  29. package/dist/ast/extractors/types.d.ts +108 -0
  30. package/dist/ast/extractors/types.d.ts.map +1 -0
  31. package/dist/ast/extractors/types.js +2 -0
  32. package/dist/ast/extractors/types.js.map +1 -0
  33. package/dist/ast/languages/javascript.d.ts +134 -0
  34. package/dist/ast/languages/javascript.d.ts.map +1 -0
  35. package/dist/ast/languages/javascript.js +787 -0
  36. package/dist/ast/languages/javascript.js.map +1 -0
  37. package/dist/ast/languages/php.d.ts +84 -0
  38. package/dist/ast/languages/php.d.ts.map +1 -0
  39. package/dist/ast/languages/php.js +452 -0
  40. package/dist/ast/languages/php.js.map +1 -0
  41. package/dist/ast/languages/python.d.ts +96 -0
  42. package/dist/ast/languages/python.d.ts.map +1 -0
  43. package/dist/ast/languages/python.js +448 -0
  44. package/dist/ast/languages/python.js.map +1 -0
  45. package/dist/ast/languages/registry.d.ts +30 -0
  46. package/dist/ast/languages/registry.d.ts.map +1 -0
  47. package/dist/ast/languages/registry.js +95 -0
  48. package/dist/ast/languages/registry.js.map +1 -0
  49. package/dist/ast/languages/rust.d.ts +113 -0
  50. package/dist/ast/languages/rust.d.ts.map +1 -0
  51. package/dist/ast/languages/rust.js +614 -0
  52. package/dist/ast/languages/rust.js.map +1 -0
  53. package/dist/ast/languages/types.d.ts +52 -0
  54. package/dist/ast/languages/types.d.ts.map +1 -0
  55. package/dist/ast/languages/types.js +2 -0
  56. package/dist/ast/languages/types.js.map +1 -0
  57. package/dist/ast/languages/typescript.d.ts +3 -0
  58. package/dist/ast/languages/typescript.d.ts.map +1 -0
  59. package/dist/ast/languages/typescript.js +134 -0
  60. package/dist/ast/languages/typescript.js.map +1 -0
  61. package/dist/ast/parser.d.ts +29 -0
  62. package/dist/ast/parser.d.ts.map +1 -0
  63. package/dist/ast/parser.js +67 -0
  64. package/dist/ast/parser.js.map +1 -0
  65. package/dist/ast/symbols.d.ts +74 -0
  66. package/dist/ast/symbols.d.ts.map +1 -0
  67. package/dist/ast/symbols.js +171 -0
  68. package/dist/ast/symbols.js.map +1 -0
  69. package/dist/ast/traversers/index.d.ts +19 -0
  70. package/dist/ast/traversers/index.d.ts.map +1 -0
  71. package/dist/ast/traversers/index.js +21 -0
  72. package/dist/ast/traversers/index.js.map +1 -0
  73. package/dist/ast/traversers/types.d.ts +98 -0
  74. package/dist/ast/traversers/types.d.ts.map +1 -0
  75. package/dist/ast/traversers/types.js +2 -0
  76. package/dist/ast/traversers/types.js.map +1 -0
  77. package/dist/ast/types.d.ts +54 -0
  78. package/dist/ast/types.d.ts.map +1 -0
  79. package/dist/ast/types.js +2 -0
  80. package/dist/ast/types.js.map +1 -0
  81. package/dist/chunk-only-index.d.ts +25 -0
  82. package/dist/chunk-only-index.d.ts.map +1 -0
  83. package/dist/chunk-only-index.js +107 -0
  84. package/dist/chunk-only-index.js.map +1 -0
  85. package/dist/chunker.d.ts +12 -0
  86. package/dist/chunker.d.ts.map +1 -0
  87. package/dist/chunker.js +98 -0
  88. package/dist/chunker.js.map +1 -0
  89. package/dist/constants.d.ts +8 -0
  90. package/dist/constants.d.ts.map +1 -0
  91. package/dist/constants.js +11 -0
  92. package/dist/constants.js.map +1 -0
  93. package/dist/content-hash.d.ts +20 -0
  94. package/dist/content-hash.d.ts.map +1 -0
  95. package/dist/content-hash.js +91 -0
  96. package/dist/content-hash.js.map +1 -0
  97. package/dist/dependency-analyzer.d.ts +79 -0
  98. package/dist/dependency-analyzer.d.ts.map +1 -0
  99. package/dist/dependency-analyzer.js +408 -0
  100. package/dist/dependency-analyzer.js.map +1 -0
  101. package/dist/ecosystem-presets.d.ts +32 -0
  102. package/dist/ecosystem-presets.d.ts.map +1 -0
  103. package/dist/ecosystem-presets.js +325 -0
  104. package/dist/ecosystem-presets.js.map +1 -0
  105. package/dist/gitignore.d.ts +22 -0
  106. package/dist/gitignore.d.ts.map +1 -0
  107. package/dist/gitignore.js +128 -0
  108. package/dist/gitignore.js.map +1 -0
  109. package/dist/index.d.ts +32 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +68 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/insights/chunk-complexity.d.ts +89 -0
  114. package/dist/insights/chunk-complexity.d.ts.map +1 -0
  115. package/dist/insights/chunk-complexity.js +332 -0
  116. package/dist/insights/chunk-complexity.js.map +1 -0
  117. package/dist/insights/types.d.ts +73 -0
  118. package/dist/insights/types.d.ts.map +1 -0
  119. package/dist/insights/types.js +9 -0
  120. package/dist/insights/types.js.map +1 -0
  121. package/dist/json-template-chunker.d.ts +12 -0
  122. package/dist/json-template-chunker.d.ts.map +1 -0
  123. package/dist/json-template-chunker.js +87 -0
  124. package/dist/json-template-chunker.js.map +1 -0
  125. package/dist/liquid-chunker.d.ts +16 -0
  126. package/dist/liquid-chunker.d.ts.map +1 -0
  127. package/dist/liquid-chunker.js +274 -0
  128. package/dist/liquid-chunker.js.map +1 -0
  129. package/dist/scanner.d.ts +16 -0
  130. package/dist/scanner.d.ts.map +1 -0
  131. package/dist/scanner.js +95 -0
  132. package/dist/scanner.js.map +1 -0
  133. package/dist/symbol-extractor.d.ts +18 -0
  134. package/dist/symbol-extractor.d.ts.map +1 -0
  135. package/dist/symbol-extractor.js +343 -0
  136. package/dist/symbol-extractor.js.map +1 -0
  137. package/dist/test-associations.d.ts +16 -0
  138. package/dist/test-associations.d.ts.map +1 -0
  139. package/dist/test-associations.js +43 -0
  140. package/dist/test-associations.js.map +1 -0
  141. package/dist/types.d.ts +75 -0
  142. package/dist/types.d.ts.map +1 -0
  143. package/dist/types.js +2 -0
  144. package/dist/types.js.map +1 -0
  145. package/dist/utils/path-matching.d.ts +71 -0
  146. package/dist/utils/path-matching.d.ts.map +1 -0
  147. package/dist/utils/path-matching.js +258 -0
  148. package/dist/utils/path-matching.js.map +1 -0
  149. package/dist/utils/repo-id.d.ts +6 -0
  150. package/dist/utils/repo-id.d.ts.map +1 -0
  151. package/dist/utils/repo-id.js +12 -0
  152. package/dist/utils/repo-id.js.map +1 -0
  153. package/package.json +66 -0
@@ -0,0 +1,343 @@
1
+ /**
2
+ * Symbol extraction utilities for different programming languages.
3
+ * Extracts function, class, and interface names from code chunks for better indexing.
4
+ */
5
+ const LANGUAGE_EXTRACTORS = {
6
+ typescript: {
7
+ functions: extractTSFunctions,
8
+ classes: extractTSClasses,
9
+ interfaces: extractTSInterfaces,
10
+ },
11
+ tsx: {
12
+ functions: extractTSFunctions,
13
+ classes: extractTSClasses,
14
+ interfaces: extractTSInterfaces,
15
+ },
16
+ javascript: { functions: extractJSFunctions, classes: extractJSClasses },
17
+ jsx: { functions: extractJSFunctions, classes: extractJSClasses },
18
+ python: { functions: extractPythonFunctions, classes: extractPythonClasses },
19
+ py: { functions: extractPythonFunctions, classes: extractPythonClasses },
20
+ php: {
21
+ functions: extractPHPFunctions,
22
+ classes: extractPHPClasses,
23
+ interfaces: extractPHPInterfaces,
24
+ },
25
+ vue: { functions: extractVueFunctions, classes: extractVueComponents },
26
+ go: { functions: extractGoFunctions, interfaces: extractGoInterfaces },
27
+ java: {
28
+ functions: extractJavaFunctions,
29
+ classes: extractJavaClasses,
30
+ interfaces: extractJavaInterfaces,
31
+ },
32
+ csharp: {
33
+ functions: extractCSharpFunctions,
34
+ classes: extractCSharpClasses,
35
+ interfaces: extractCSharpInterfaces,
36
+ },
37
+ cs: {
38
+ functions: extractCSharpFunctions,
39
+ classes: extractCSharpClasses,
40
+ interfaces: extractCSharpInterfaces,
41
+ },
42
+ ruby: { functions: extractRubyFunctions, classes: extractRubyClasses },
43
+ rb: { functions: extractRubyFunctions, classes: extractRubyClasses },
44
+ rust: { functions: extractRustFunctions },
45
+ rs: { functions: extractRustFunctions },
46
+ };
47
+ /**
48
+ * Extract symbols (functions, classes, interfaces) from code content.
49
+ *
50
+ * @param content - The code content to extract symbols from
51
+ * @param language - The programming language of the content
52
+ * @returns Extracted symbols organized by type
53
+ */
54
+ export function extractSymbols(content, language) {
55
+ const extractors = LANGUAGE_EXTRACTORS[language.toLowerCase()];
56
+ if (!extractors) {
57
+ return { functions: [], classes: [], interfaces: [] };
58
+ }
59
+ return {
60
+ functions: extractors.functions(content),
61
+ classes: extractors.classes?.(content) ?? [],
62
+ interfaces: extractors.interfaces?.(content) ?? [],
63
+ };
64
+ }
65
+ // TypeScript / JavaScript Functions
66
+ function extractTSFunctions(content) {
67
+ const names = new Set();
68
+ // Regular functions: function name(...) or async function name(...)
69
+ const functionMatches = content.matchAll(/(?:async\s+)?function\s+(\w+)\s*\(/g);
70
+ for (const match of functionMatches) {
71
+ names.add(match[1]);
72
+ }
73
+ // Arrow functions: const/let/var name = (...) =>
74
+ const arrowMatches = content.matchAll(/(?:const|let|var)\s+(\w+)\s*=\s*(?:async\s*)?\([^)]*\)\s*=>/g);
75
+ for (const match of arrowMatches) {
76
+ names.add(match[1]);
77
+ }
78
+ // Method definitions: name(...) { or async name(...) {
79
+ const methodMatches = content.matchAll(/(?:async\s+)?(\w+)\s*\([^)]*\)\s*[:{]/g);
80
+ for (const match of methodMatches) {
81
+ // Exclude common keywords
82
+ if (!['if', 'for', 'while', 'switch', 'catch'].includes(match[1])) {
83
+ names.add(match[1]);
84
+ }
85
+ }
86
+ // Export function
87
+ const exportMatches = content.matchAll(/export\s+(?:async\s+)?function\s+(\w+)\s*\(/g);
88
+ for (const match of exportMatches) {
89
+ names.add(match[1]);
90
+ }
91
+ return Array.from(names);
92
+ }
93
+ function extractJSFunctions(content) {
94
+ return extractTSFunctions(content); // Same patterns
95
+ }
96
+ function extractTSClasses(content) {
97
+ const names = new Set();
98
+ // Class declarations: class Name or export class Name
99
+ const classMatches = content.matchAll(/(?:export\s+)?(?:abstract\s+)?class\s+(\w+)/g);
100
+ for (const match of classMatches) {
101
+ names.add(match[1]);
102
+ }
103
+ return Array.from(names);
104
+ }
105
+ function extractJSClasses(content) {
106
+ return extractTSClasses(content); // Same patterns
107
+ }
108
+ function extractTSInterfaces(content) {
109
+ const names = new Set();
110
+ // Interface declarations: interface Name or export interface Name
111
+ const interfaceMatches = content.matchAll(/(?:export\s+)?interface\s+(\w+)/g);
112
+ for (const match of interfaceMatches) {
113
+ names.add(match[1]);
114
+ }
115
+ // Type aliases: type Name = or export type Name =
116
+ const typeMatches = content.matchAll(/(?:export\s+)?type\s+(\w+)\s*=/g);
117
+ for (const match of typeMatches) {
118
+ names.add(match[1]);
119
+ }
120
+ return Array.from(names);
121
+ }
122
+ // Python Functions
123
+ function extractPythonFunctions(content) {
124
+ const names = new Set();
125
+ // Function definitions: def name(...):
126
+ const functionMatches = content.matchAll(/def\s+(\w+)\s*\(/g);
127
+ for (const match of functionMatches) {
128
+ names.add(match[1]);
129
+ }
130
+ // Async functions: async def name(...):
131
+ const asyncMatches = content.matchAll(/async\s+def\s+(\w+)\s*\(/g);
132
+ for (const match of asyncMatches) {
133
+ names.add(match[1]);
134
+ }
135
+ return Array.from(names);
136
+ }
137
+ function extractPythonClasses(content) {
138
+ const names = new Set();
139
+ // Class definitions: class Name or class Name(Base):
140
+ const classMatches = content.matchAll(/class\s+(\w+)(?:\s*\(|:)/g);
141
+ for (const match of classMatches) {
142
+ names.add(match[1]);
143
+ }
144
+ return Array.from(names);
145
+ }
146
+ // PHP Functions
147
+ function extractPHPFunctions(content) {
148
+ const names = new Set();
149
+ // Function definitions: function name(...) or public function name(...)
150
+ const functionMatches = content.matchAll(/(?:public|private|protected)?\s*function\s+(\w+)\s*\(/g);
151
+ for (const match of functionMatches) {
152
+ names.add(match[1]);
153
+ }
154
+ return Array.from(names);
155
+ }
156
+ function extractPHPClasses(content) {
157
+ const names = new Set();
158
+ // Class definitions: class Name or abstract class Name
159
+ const classMatches = content.matchAll(/(?:abstract\s+)?class\s+(\w+)/g);
160
+ for (const match of classMatches) {
161
+ names.add(match[1]);
162
+ }
163
+ return Array.from(names);
164
+ }
165
+ function extractPHPInterfaces(content) {
166
+ const names = new Set();
167
+ // Interface definitions: interface Name
168
+ const interfaceMatches = content.matchAll(/interface\s+(\w+)/g);
169
+ for (const match of interfaceMatches) {
170
+ names.add(match[1]);
171
+ }
172
+ // Trait definitions: trait Name
173
+ const traitMatches = content.matchAll(/trait\s+(\w+)/g);
174
+ for (const match of traitMatches) {
175
+ names.add(match[1]);
176
+ }
177
+ return Array.from(names);
178
+ }
179
+ // Go Functions
180
+ function extractGoFunctions(content) {
181
+ const names = new Set();
182
+ // Function definitions: func Name(...) or func (r *Receiver) Name(...)
183
+ const functionMatches = content.matchAll(/func\s+(?:\(\w+\s+\*?\w+\)\s+)?(\w+)\s*\(/g);
184
+ for (const match of functionMatches) {
185
+ names.add(match[1]);
186
+ }
187
+ return Array.from(names);
188
+ }
189
+ function extractGoInterfaces(content) {
190
+ const names = new Set();
191
+ // Interface definitions: type Name interface {
192
+ const interfaceMatches = content.matchAll(/type\s+(\w+)\s+interface\s*\{/g);
193
+ for (const match of interfaceMatches) {
194
+ names.add(match[1]);
195
+ }
196
+ // Struct definitions: type Name struct {
197
+ const structMatches = content.matchAll(/type\s+(\w+)\s+struct\s*\{/g);
198
+ for (const match of structMatches) {
199
+ names.add(match[1]);
200
+ }
201
+ return Array.from(names);
202
+ }
203
+ // Java Functions
204
+ function extractJavaFunctions(content) {
205
+ const names = new Set();
206
+ // Method definitions: public/private/protected return_type name(...)
207
+ const methodMatches = content.matchAll(/(?:public|private|protected)\s+(?:static\s+)?(?:\w+(?:<[^>]+>)?)\s+(\w+)\s*\(/g);
208
+ for (const match of methodMatches) {
209
+ names.add(match[1]);
210
+ }
211
+ return Array.from(names);
212
+ }
213
+ function extractJavaClasses(content) {
214
+ const names = new Set();
215
+ // Class definitions: public class Name or abstract class Name
216
+ const classMatches = content.matchAll(/(?:public\s+)?(?:abstract\s+)?class\s+(\w+)/g);
217
+ for (const match of classMatches) {
218
+ names.add(match[1]);
219
+ }
220
+ return Array.from(names);
221
+ }
222
+ function extractJavaInterfaces(content) {
223
+ const names = new Set();
224
+ // Interface definitions: public interface Name
225
+ const interfaceMatches = content.matchAll(/(?:public\s+)?interface\s+(\w+)/g);
226
+ for (const match of interfaceMatches) {
227
+ names.add(match[1]);
228
+ }
229
+ return Array.from(names);
230
+ }
231
+ // C# Functions
232
+ function extractCSharpFunctions(content) {
233
+ const names = new Set();
234
+ // Method definitions: public/private/protected return_type Name(...)
235
+ const methodMatches = content.matchAll(/(?:public|private|protected|internal)\s+(?:static\s+)?(?:async\s+)?(?:\w+(?:<[^>]+>)?)\s+(\w+)\s*\(/g);
236
+ for (const match of methodMatches) {
237
+ names.add(match[1]);
238
+ }
239
+ return Array.from(names);
240
+ }
241
+ function extractCSharpClasses(content) {
242
+ const names = new Set();
243
+ // Class definitions: public class Name or abstract class Name
244
+ const classMatches = content.matchAll(/(?:public|internal)?\s*(?:abstract\s+)?class\s+(\w+)/g);
245
+ for (const match of classMatches) {
246
+ names.add(match[1]);
247
+ }
248
+ return Array.from(names);
249
+ }
250
+ function extractCSharpInterfaces(content) {
251
+ const names = new Set();
252
+ // Interface definitions: public interface Name
253
+ const interfaceMatches = content.matchAll(/(?:public|internal)?\s*interface\s+(\w+)/g);
254
+ for (const match of interfaceMatches) {
255
+ names.add(match[1]);
256
+ }
257
+ return Array.from(names);
258
+ }
259
+ // Ruby Functions
260
+ function extractRubyFunctions(content) {
261
+ const names = new Set();
262
+ // Method definitions: def name or def self.name
263
+ const methodMatches = content.matchAll(/def\s+(?:self\.)?(\w+)/g);
264
+ for (const match of methodMatches) {
265
+ names.add(match[1]);
266
+ }
267
+ return Array.from(names);
268
+ }
269
+ function extractRubyClasses(content) {
270
+ const names = new Set();
271
+ // Class definitions: class Name or class Name < Base
272
+ const classMatches = content.matchAll(/class\s+(\w+)/g);
273
+ for (const match of classMatches) {
274
+ names.add(match[1]);
275
+ }
276
+ // Module definitions: module Name
277
+ const moduleMatches = content.matchAll(/module\s+(\w+)/g);
278
+ for (const match of moduleMatches) {
279
+ names.add(match[1]);
280
+ }
281
+ return Array.from(names);
282
+ }
283
+ // Rust Functions
284
+ function extractRustFunctions(content) {
285
+ const names = new Set();
286
+ // Function definitions: fn name(...) or pub fn name(...)
287
+ const functionMatches = content.matchAll(/(?:pub\s+)?fn\s+(\w+)\s*\(/g);
288
+ for (const match of functionMatches) {
289
+ names.add(match[1]);
290
+ }
291
+ // Struct definitions: struct Name {
292
+ const structMatches = content.matchAll(/(?:pub\s+)?struct\s+(\w+)/g);
293
+ for (const match of structMatches) {
294
+ names.add(match[1]);
295
+ }
296
+ // Trait definitions: trait Name {
297
+ const traitMatches = content.matchAll(/(?:pub\s+)?trait\s+(\w+)/g);
298
+ for (const match of traitMatches) {
299
+ names.add(match[1]);
300
+ }
301
+ return Array.from(names);
302
+ }
303
+ // Vue Functions
304
+ function extractVueFunctions(content) {
305
+ const names = new Set();
306
+ // Extract script content from Vue SFC
307
+ const scriptMatch = content.match(/<script[^>]*>([\s\S]*?)<\/script>/);
308
+ if (!scriptMatch)
309
+ return [];
310
+ const scriptContent = scriptMatch[1];
311
+ // Composition API: const/function name = ...
312
+ const compositionMatches = scriptContent.matchAll(/(?:const|function)\s+(\w+)\s*=/g);
313
+ for (const match of compositionMatches) {
314
+ names.add(match[1]);
315
+ }
316
+ // Options API methods
317
+ const methodMatches = scriptContent.matchAll(/(\w+)\s*\([^)]*\)\s*{/g);
318
+ for (const match of methodMatches) {
319
+ names.add(match[1]);
320
+ }
321
+ return Array.from(names);
322
+ }
323
+ // Vue Components
324
+ function extractVueComponents(content) {
325
+ const names = new Set();
326
+ // Extract component name from filename convention or export
327
+ const scriptMatch = content.match(/<script[^>]*>([\s\S]*?)<\/script>/);
328
+ if (!scriptMatch)
329
+ return [];
330
+ const scriptContent = scriptMatch[1];
331
+ // export default { name: 'ComponentName' }
332
+ const nameMatch = scriptContent.match(/name:\s*['"](\w+)['"]/);
333
+ if (nameMatch) {
334
+ names.add(nameMatch[1]);
335
+ }
336
+ // defineComponent or <script setup> components
337
+ const defineComponentMatch = scriptContent.match(/defineComponent\s*\(/);
338
+ if (defineComponentMatch) {
339
+ names.add('VueComponent');
340
+ }
341
+ return Array.from(names);
342
+ }
343
+ //# sourceMappingURL=symbol-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"symbol-extractor.js","sourceRoot":"","sources":["../src/symbol-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Portable test association discovery from in-memory chunks.
3
+ * Finds test files that import given source files by analyzing chunk metadata.
4
+ */
5
+ import type { CodeChunk } from './types.js';
6
+ /**
7
+ * Find test files that import the given source files.
8
+ * Works entirely from in-memory chunks — no VectorDB or filesystem needed.
9
+ *
10
+ * @param filepaths - Source file paths to find tests for
11
+ * @param chunks - All indexed chunks (test + source files)
12
+ * @param workspaceRoot - Workspace root for path normalization (defaults to cwd)
13
+ * @returns Map of source filepath → array of test file paths that import it
14
+ */
15
+ export declare function findTestAssociationsFromChunks(filepaths: string[], chunks: CodeChunk[], workspaceRoot?: string): Map<string, string[]>;
16
+ //# sourceMappingURL=test-associations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-associations.d.ts","sourceRoot":"","sources":["../src/test-associations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,MAAM,EAAE,EACnB,MAAM,EAAE,SAAS,EAAE,EACnB,aAAa,GAAE,MAAsB,GACpC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAgCvB"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Portable test association discovery from in-memory chunks.
3
+ * Finds test files that import given source files by analyzing chunk metadata.
4
+ */
5
+ import { isTestFile, normalizePath, matchesFile } from './utils/path-matching.js';
6
+ /**
7
+ * Find test files that import the given source files.
8
+ * Works entirely from in-memory chunks — no VectorDB or filesystem needed.
9
+ *
10
+ * @param filepaths - Source file paths to find tests for
11
+ * @param chunks - All indexed chunks (test + source files)
12
+ * @param workspaceRoot - Workspace root for path normalization (defaults to cwd)
13
+ * @returns Map of source filepath → array of test file paths that import it
14
+ */
15
+ export function findTestAssociationsFromChunks(filepaths, chunks, workspaceRoot = process.cwd()) {
16
+ const result = new Map();
17
+ // Build a path normalization cache for performance
18
+ const cache = new Map();
19
+ const normalize = (p) => {
20
+ if (cache.has(p))
21
+ return cache.get(p);
22
+ const normalized = normalizePath(p, workspaceRoot);
23
+ cache.set(p, normalized);
24
+ return normalized;
25
+ };
26
+ // Pre-filter to only test chunks for performance
27
+ const testChunks = chunks.filter(chunk => isTestFile(chunk.metadata.file));
28
+ for (const filepath of filepaths) {
29
+ const normalizedTarget = normalize(filepath);
30
+ const testFiles = new Set();
31
+ for (const chunk of testChunks) {
32
+ const imports = chunk.metadata.imports || [];
33
+ if (imports.some(imp => matchesFile(normalize(imp), normalizedTarget))) {
34
+ testFiles.add(chunk.metadata.file);
35
+ }
36
+ }
37
+ if (testFiles.size > 0) {
38
+ result.set(filepath, Array.from(testFiles));
39
+ }
40
+ }
41
+ return result;
42
+ }
43
+ //# sourceMappingURL=test-associations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-associations.js","sourceRoot":"","sources":["../src/test-associations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGlF;;;;;;;;GAQG;AACH,MAAM,UAAU,8BAA8B,CAC5C,SAAmB,EACnB,MAAmB,EACnB,gBAAwB,OAAO,CAAC,GAAG,EAAE;IAErC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE3C,mDAAmD;IACnD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE;QACtC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC;QACvC,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QACnD,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACzB,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;IAEF,iDAAiD;IACjD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAE3E,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,gBAAgB,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QAEpC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;YAC7C,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC;gBACvE,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;QAED,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,75 @@
1
+ export interface CodeChunk {
2
+ content: string;
3
+ metadata: ChunkMetadata;
4
+ }
5
+ export interface ChunkMetadata {
6
+ file: string;
7
+ startLine: number;
8
+ endLine: number;
9
+ type: 'function' | 'class' | 'block' | 'template';
10
+ language: string;
11
+ symbols?: {
12
+ functions: string[];
13
+ classes: string[];
14
+ interfaces: string[];
15
+ };
16
+ symbolName?: string;
17
+ symbolType?: 'function' | 'method' | 'class' | 'interface' | 'schema' | 'style' | 'javascript' | 'template';
18
+ parentClass?: string;
19
+ complexity?: number;
20
+ cognitiveComplexity?: number;
21
+ parameters?: string[];
22
+ signature?: string;
23
+ returnType?: string;
24
+ imports?: string[];
25
+ /**
26
+ * Symbols exported by this file. Extracted from export statements.
27
+ * Example: ['validateEmail', 'validatePhone', 'ValidationError']
28
+ */
29
+ exports?: string[];
30
+ /**
31
+ * Map of import paths to the symbols imported from them.
32
+ * Example: { './validate': ['validateEmail', 'validatePhone'] }
33
+ */
34
+ importedSymbols?: Record<string, string[]>;
35
+ /**
36
+ * Call sites within this chunk - symbols called and their locations.
37
+ * Tracked for chunks whose symbolType supports complexity analysis (e.g. functions and methods).
38
+ */
39
+ callSites?: Array<{
40
+ symbol: string;
41
+ line: number;
42
+ }>;
43
+ halsteadVolume?: number;
44
+ halsteadDifficulty?: number;
45
+ halsteadEffort?: number;
46
+ halsteadBugs?: number;
47
+ /**
48
+ * Unique repository identifier for multi-tenant scenarios.
49
+ * Used for cross-repo search and tenant isolation in Qdrant backend.
50
+ * Typically derived from project root path or GitHub repository identifier.
51
+ */
52
+ repoId?: string;
53
+ /**
54
+ * Organization identifier for multi-tenant scenarios.
55
+ * Used for tenant isolation in Qdrant backend.
56
+ * Set from config.storage.qdrant.orgId when using Qdrant backend.
57
+ */
58
+ orgId?: string;
59
+ /**
60
+ * Git branch name for branch/commit tracking in Qdrant backend.
61
+ * Used to isolate indexes by branch (e.g., main vs PR branches).
62
+ */
63
+ branch?: string;
64
+ /**
65
+ * Git commit SHA for branch/commit tracking in Qdrant backend.
66
+ * Used to isolate indexes by commit (e.g., for PR analysis).
67
+ */
68
+ commitSha?: string;
69
+ }
70
+ export interface ScanOptions {
71
+ rootDir: string;
72
+ includePatterns?: string[];
73
+ excludePatterns?: string[];
74
+ }
75
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,CAAC;IAClD,QAAQ,EAAE,MAAM,CAAC;IAEjB,OAAO,CAAC,EAAE;QACR,SAAS,EAAE,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IAGF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EACP,UAAU,GACV,QAAQ,GACR,OAAO,GACP,WAAW,GACX,QAAQ,GACR,OAAO,GACP,YAAY,GACZ,UAAU,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAGnB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAE3C;;;OAGG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IAGH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Shared path matching utilities for dependency analysis.
3
+ *
4
+ * These functions handle path normalization and matching logic used by
5
+ * the get_dependents tool to find reverse dependencies.
6
+ */
7
+ /**
8
+ * Normalizes a file path for comparison.
9
+ *
10
+ * - Removes quotes and trims whitespace
11
+ * - Converts backslashes to forward slashes
12
+ * - Strips file extensions for all AST-supported languages
13
+ * - Converts absolute paths to relative (if within workspace root)
14
+ *
15
+ * @param path - The path to normalize
16
+ * @param workspaceRoot - The workspace root directory (normalized with forward slashes)
17
+ * @returns Normalized path
18
+ */
19
+ export declare function normalizePath(path: string, workspaceRoot: string): string;
20
+ /**
21
+ * Checks if a pattern matches at path component boundaries.
22
+ *
23
+ * Ensures matches occur at proper path boundaries (/) to avoid false positives like:
24
+ * - "logger" matching "logger-utils" ❌
25
+ * - "src/logger" matching "src/logger-service" ❌
26
+ *
27
+ * @param str - The string to search in
28
+ * @param pattern - The pattern to search for
29
+ * @returns True if pattern matches at a boundary
30
+ */
31
+ export declare function matchesAtBoundary(str: string, pattern: string): boolean;
32
+ /**
33
+ * Determines if an import path matches a target file path.
34
+ *
35
+ * Handles various matching strategies:
36
+ * 1. Exact match
37
+ * 2. Target path appears in import (at boundaries)
38
+ * 3. Import path appears in target (at boundaries)
39
+ * 4. Relative imports (./logger vs src/utils/logger)
40
+ * 5. PHP namespace imports (App\Models\User vs app/Models/User.php)
41
+ * 6. Python module imports (django.http → django/http/__init__.py or django/http/*.py)
42
+ *
43
+ * @param normalizedImport - Normalized import path
44
+ * @param normalizedTarget - Normalized target file path
45
+ * @returns True if the import matches the target file
46
+ */
47
+ export declare function matchesFile(normalizedImport: string, normalizedTarget: string): boolean;
48
+ /**
49
+ * Gets a canonical path representation (relative to workspace, with extension).
50
+ *
51
+ * @param filepath - The file path to canonicalize
52
+ * @param workspaceRoot - The workspace root directory (normalized with forward slashes)
53
+ * @returns Canonical path
54
+ */
55
+ export declare function getCanonicalPath(filepath: string, workspaceRoot: string): string;
56
+ /**
57
+ * Determines if a file is a test file based on naming conventions.
58
+ *
59
+ * Uses precise regex patterns to avoid false positives:
60
+ * - Files with .test. or .spec. extensions (e.g., foo.test.ts, bar.spec.js)
61
+ * - Files in test/, tests/, or __tests__/ directories
62
+ *
63
+ * Avoids false positives like:
64
+ * - contest.ts (contains ".test." but isn't a test)
65
+ * - latest/config.ts (contains "/test/" but isn't a test)
66
+ *
67
+ * @param filepath - The file path to check
68
+ * @returns True if the file is a test file
69
+ */
70
+ export declare function isTestFile(filepath: string): boolean;
71
+ //# sourceMappingURL=path-matching.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-matching.d.ts","sourceRoot":"","sources":["../../src/utils/path-matching.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA0BH;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAezE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAcvE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,WAAW,CAAC,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAqCvF;AA2HD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAMhF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIpD"}