@mduenas/codegraph 0.4.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 (192) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +641 -0
  3. package/dist/bin/codegraph.d.ts +20 -0
  4. package/dist/bin/codegraph.d.ts.map +1 -0
  5. package/dist/bin/codegraph.js +704 -0
  6. package/dist/bin/codegraph.js.map +1 -0
  7. package/dist/config.d.ts +51 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +291 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/context/formatter.d.ts +30 -0
  12. package/dist/context/formatter.d.ts.map +1 -0
  13. package/dist/context/formatter.js +244 -0
  14. package/dist/context/formatter.js.map +1 -0
  15. package/dist/context/index.d.ts +86 -0
  16. package/dist/context/index.d.ts.map +1 -0
  17. package/dist/context/index.js +402 -0
  18. package/dist/context/index.js.map +1 -0
  19. package/dist/db/index.d.ts +64 -0
  20. package/dist/db/index.d.ts.map +1 -0
  21. package/dist/db/index.js +170 -0
  22. package/dist/db/index.js.map +1 -0
  23. package/dist/db/migrations.d.ts +44 -0
  24. package/dist/db/migrations.d.ts.map +1 -0
  25. package/dist/db/migrations.js +105 -0
  26. package/dist/db/migrations.js.map +1 -0
  27. package/dist/db/queries.d.ts +148 -0
  28. package/dist/db/queries.d.ts.map +1 -0
  29. package/dist/db/queries.js +669 -0
  30. package/dist/db/queries.js.map +1 -0
  31. package/dist/directory.d.ts +45 -0
  32. package/dist/directory.d.ts.map +1 -0
  33. package/dist/directory.js +191 -0
  34. package/dist/directory.js.map +1 -0
  35. package/dist/errors.d.ts +136 -0
  36. package/dist/errors.d.ts.map +1 -0
  37. package/dist/errors.js +219 -0
  38. package/dist/errors.js.map +1 -0
  39. package/dist/extraction/grammars.d.ts +36 -0
  40. package/dist/extraction/grammars.d.ts.map +1 -0
  41. package/dist/extraction/grammars.js +181 -0
  42. package/dist/extraction/grammars.js.map +1 -0
  43. package/dist/extraction/index.d.ts +91 -0
  44. package/dist/extraction/index.d.ts.map +1 -0
  45. package/dist/extraction/index.js +493 -0
  46. package/dist/extraction/index.js.map +1 -0
  47. package/dist/extraction/tree-sitter.d.ts +176 -0
  48. package/dist/extraction/tree-sitter.d.ts.map +1 -0
  49. package/dist/extraction/tree-sitter.js +1798 -0
  50. package/dist/extraction/tree-sitter.js.map +1 -0
  51. package/dist/graph/index.d.ts +8 -0
  52. package/dist/graph/index.d.ts.map +1 -0
  53. package/dist/graph/index.js +13 -0
  54. package/dist/graph/index.js.map +1 -0
  55. package/dist/graph/queries.d.ts +106 -0
  56. package/dist/graph/queries.d.ts.map +1 -0
  57. package/dist/graph/queries.js +355 -0
  58. package/dist/graph/queries.js.map +1 -0
  59. package/dist/graph/traversal.d.ts +127 -0
  60. package/dist/graph/traversal.d.ts.map +1 -0
  61. package/dist/graph/traversal.js +465 -0
  62. package/dist/graph/traversal.js.map +1 -0
  63. package/dist/index.d.ts +496 -0
  64. package/dist/index.d.ts.map +1 -0
  65. package/dist/index.js +818 -0
  66. package/dist/index.js.map +1 -0
  67. package/dist/installer/banner.d.ts +40 -0
  68. package/dist/installer/banner.d.ts.map +1 -0
  69. package/dist/installer/banner.js +162 -0
  70. package/dist/installer/banner.js.map +1 -0
  71. package/dist/installer/claude-md-template.d.ts +10 -0
  72. package/dist/installer/claude-md-template.d.ts.map +1 -0
  73. package/dist/installer/claude-md-template.js +46 -0
  74. package/dist/installer/claude-md-template.js.map +1 -0
  75. package/dist/installer/config-writer.d.ts +36 -0
  76. package/dist/installer/config-writer.d.ts.map +1 -0
  77. package/dist/installer/config-writer.js +282 -0
  78. package/dist/installer/config-writer.js.map +1 -0
  79. package/dist/installer/index.d.ts +13 -0
  80. package/dist/installer/index.d.ts.map +1 -0
  81. package/dist/installer/index.js +155 -0
  82. package/dist/installer/index.js.map +1 -0
  83. package/dist/installer/prompts.d.ts +18 -0
  84. package/dist/installer/prompts.d.ts.map +1 -0
  85. package/dist/installer/prompts.js +113 -0
  86. package/dist/installer/prompts.js.map +1 -0
  87. package/dist/mcp/index.d.ts +64 -0
  88. package/dist/mcp/index.d.ts.map +1 -0
  89. package/dist/mcp/index.js +207 -0
  90. package/dist/mcp/index.js.map +1 -0
  91. package/dist/mcp/tools.d.ts +93 -0
  92. package/dist/mcp/tools.d.ts.map +1 -0
  93. package/dist/mcp/tools.js +442 -0
  94. package/dist/mcp/tools.js.map +1 -0
  95. package/dist/mcp/transport.d.ts +89 -0
  96. package/dist/mcp/transport.d.ts.map +1 -0
  97. package/dist/mcp/transport.js +170 -0
  98. package/dist/mcp/transport.js.map +1 -0
  99. package/dist/resolution/frameworks/csharp.d.ts +8 -0
  100. package/dist/resolution/frameworks/csharp.d.ts.map +1 -0
  101. package/dist/resolution/frameworks/csharp.js +274 -0
  102. package/dist/resolution/frameworks/csharp.js.map +1 -0
  103. package/dist/resolution/frameworks/express.d.ts +8 -0
  104. package/dist/resolution/frameworks/express.d.ts.map +1 -0
  105. package/dist/resolution/frameworks/express.js +208 -0
  106. package/dist/resolution/frameworks/express.js.map +1 -0
  107. package/dist/resolution/frameworks/go.d.ts +8 -0
  108. package/dist/resolution/frameworks/go.d.ts.map +1 -0
  109. package/dist/resolution/frameworks/go.js +225 -0
  110. package/dist/resolution/frameworks/go.js.map +1 -0
  111. package/dist/resolution/frameworks/index.d.ts +33 -0
  112. package/dist/resolution/frameworks/index.d.ts.map +1 -0
  113. package/dist/resolution/frameworks/index.js +113 -0
  114. package/dist/resolution/frameworks/index.js.map +1 -0
  115. package/dist/resolution/frameworks/java.d.ts +8 -0
  116. package/dist/resolution/frameworks/java.d.ts.map +1 -0
  117. package/dist/resolution/frameworks/java.js +239 -0
  118. package/dist/resolution/frameworks/java.js.map +1 -0
  119. package/dist/resolution/frameworks/laravel.d.ts +13 -0
  120. package/dist/resolution/frameworks/laravel.d.ts.map +1 -0
  121. package/dist/resolution/frameworks/laravel.js +198 -0
  122. package/dist/resolution/frameworks/laravel.js.map +1 -0
  123. package/dist/resolution/frameworks/python.d.ts +10 -0
  124. package/dist/resolution/frameworks/python.d.ts.map +1 -0
  125. package/dist/resolution/frameworks/python.js +331 -0
  126. package/dist/resolution/frameworks/python.js.map +1 -0
  127. package/dist/resolution/frameworks/react.d.ts +8 -0
  128. package/dist/resolution/frameworks/react.d.ts.map +1 -0
  129. package/dist/resolution/frameworks/react.js +294 -0
  130. package/dist/resolution/frameworks/react.js.map +1 -0
  131. package/dist/resolution/frameworks/ruby.d.ts +8 -0
  132. package/dist/resolution/frameworks/ruby.d.ts.map +1 -0
  133. package/dist/resolution/frameworks/ruby.js +262 -0
  134. package/dist/resolution/frameworks/ruby.js.map +1 -0
  135. package/dist/resolution/frameworks/rust.d.ts +8 -0
  136. package/dist/resolution/frameworks/rust.d.ts.map +1 -0
  137. package/dist/resolution/frameworks/rust.js +222 -0
  138. package/dist/resolution/frameworks/rust.js.map +1 -0
  139. package/dist/resolution/frameworks/swift.d.ts +10 -0
  140. package/dist/resolution/frameworks/swift.d.ts.map +1 -0
  141. package/dist/resolution/frameworks/swift.js +486 -0
  142. package/dist/resolution/frameworks/swift.js.map +1 -0
  143. package/dist/resolution/import-resolver.d.ts +20 -0
  144. package/dist/resolution/import-resolver.d.ts.map +1 -0
  145. package/dist/resolution/import-resolver.js +445 -0
  146. package/dist/resolution/import-resolver.js.map +1 -0
  147. package/dist/resolution/index.d.ts +72 -0
  148. package/dist/resolution/index.d.ts.map +1 -0
  149. package/dist/resolution/index.js +301 -0
  150. package/dist/resolution/index.js.map +1 -0
  151. package/dist/resolution/name-matcher.d.ts +27 -0
  152. package/dist/resolution/name-matcher.d.ts.map +1 -0
  153. package/dist/resolution/name-matcher.js +210 -0
  154. package/dist/resolution/name-matcher.js.map +1 -0
  155. package/dist/resolution/types.d.ts +108 -0
  156. package/dist/resolution/types.d.ts.map +1 -0
  157. package/dist/resolution/types.js +8 -0
  158. package/dist/resolution/types.js.map +1 -0
  159. package/dist/sync/git-hooks.d.ts +66 -0
  160. package/dist/sync/git-hooks.d.ts.map +1 -0
  161. package/dist/sync/git-hooks.js +281 -0
  162. package/dist/sync/git-hooks.js.map +1 -0
  163. package/dist/sync/index.d.ts +13 -0
  164. package/dist/sync/index.d.ts.map +1 -0
  165. package/dist/sync/index.js +18 -0
  166. package/dist/sync/index.js.map +1 -0
  167. package/dist/types.d.ts +410 -0
  168. package/dist/types.d.ts.map +1 -0
  169. package/dist/types.js +165 -0
  170. package/dist/types.js.map +1 -0
  171. package/dist/utils.d.ts +116 -0
  172. package/dist/utils.d.ts.map +1 -0
  173. package/dist/utils.js +295 -0
  174. package/dist/utils.js.map +1 -0
  175. package/dist/vectors/embedder.d.ts +140 -0
  176. package/dist/vectors/embedder.d.ts.map +1 -0
  177. package/dist/vectors/embedder.js +336 -0
  178. package/dist/vectors/embedder.js.map +1 -0
  179. package/dist/vectors/index.d.ts +9 -0
  180. package/dist/vectors/index.d.ts.map +1 -0
  181. package/dist/vectors/index.js +20 -0
  182. package/dist/vectors/index.js.map +1 -0
  183. package/dist/vectors/manager.d.ts +119 -0
  184. package/dist/vectors/manager.d.ts.map +1 -0
  185. package/dist/vectors/manager.js +274 -0
  186. package/dist/vectors/manager.js.map +1 -0
  187. package/dist/vectors/search.d.ts +134 -0
  188. package/dist/vectors/search.d.ts.map +1 -0
  189. package/dist/vectors/search.js +409 -0
  190. package/dist/vectors/search.js.map +1 -0
  191. package/package.json +67 -0
  192. package/scripts/postinstall.js +68 -0
@@ -0,0 +1,331 @@
1
+ "use strict";
2
+ /**
3
+ * Python Framework Resolver
4
+ *
5
+ * Handles Django, Flask, and FastAPI patterns.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.fastapiResolver = exports.flaskResolver = exports.djangoResolver = void 0;
9
+ exports.djangoResolver = {
10
+ name: 'django',
11
+ detect(context) {
12
+ // Check for Django in requirements.txt or setup.py
13
+ const requirements = context.readFile('requirements.txt');
14
+ if (requirements && requirements.includes('django')) {
15
+ return true;
16
+ }
17
+ const setup = context.readFile('setup.py');
18
+ if (setup && setup.includes('django')) {
19
+ return true;
20
+ }
21
+ const pyproject = context.readFile('pyproject.toml');
22
+ if (pyproject && pyproject.includes('django')) {
23
+ return true;
24
+ }
25
+ // Check for manage.py (Django signature)
26
+ return context.fileExists('manage.py');
27
+ },
28
+ resolve(ref, context) {
29
+ // Pattern 1: Model references
30
+ if (ref.referenceName.endsWith('Model') || /^[A-Z][a-z]+$/.test(ref.referenceName)) {
31
+ const result = resolveModel(ref.referenceName, context);
32
+ if (result) {
33
+ return {
34
+ original: ref,
35
+ targetNodeId: result,
36
+ confidence: 0.8,
37
+ resolvedBy: 'framework',
38
+ };
39
+ }
40
+ }
41
+ // Pattern 2: View references
42
+ if (ref.referenceName.endsWith('View') || ref.referenceName.endsWith('ViewSet')) {
43
+ const result = resolveView(ref.referenceName, context);
44
+ if (result) {
45
+ return {
46
+ original: ref,
47
+ targetNodeId: result,
48
+ confidence: 0.8,
49
+ resolvedBy: 'framework',
50
+ };
51
+ }
52
+ }
53
+ // Pattern 3: Form references
54
+ if (ref.referenceName.endsWith('Form')) {
55
+ const result = resolveForm(ref.referenceName, context);
56
+ if (result) {
57
+ return {
58
+ original: ref,
59
+ targetNodeId: result,
60
+ confidence: 0.8,
61
+ resolvedBy: 'framework',
62
+ };
63
+ }
64
+ }
65
+ return null;
66
+ },
67
+ extractNodes(filePath, content) {
68
+ const nodes = [];
69
+ const now = Date.now();
70
+ // Extract URL patterns
71
+ // path('route/', view, name='name')
72
+ const urlPatterns = [
73
+ /path\s*\(\s*['"]([^'"]+)['"],\s*(\w+)/g,
74
+ /url\s*\(\s*r?['"]([^'"]+)['"],\s*(\w+)/g,
75
+ ];
76
+ for (const pattern of urlPatterns) {
77
+ let match;
78
+ while ((match = pattern.exec(content)) !== null) {
79
+ const [, urlPath] = match;
80
+ const line = content.slice(0, match.index).split('\n').length;
81
+ nodes.push({
82
+ id: `route:${filePath}:${urlPath}:${line}`,
83
+ kind: 'route',
84
+ name: urlPath,
85
+ qualifiedName: `${filePath}::route:${urlPath}`,
86
+ filePath,
87
+ startLine: line,
88
+ endLine: line,
89
+ startColumn: 0,
90
+ endColumn: match[0].length,
91
+ language: 'python',
92
+ updatedAt: now,
93
+ });
94
+ }
95
+ }
96
+ return nodes;
97
+ },
98
+ };
99
+ exports.flaskResolver = {
100
+ name: 'flask',
101
+ detect(context) {
102
+ const requirements = context.readFile('requirements.txt');
103
+ if (requirements && (requirements.includes('flask') || requirements.includes('Flask'))) {
104
+ return true;
105
+ }
106
+ const pyproject = context.readFile('pyproject.toml');
107
+ if (pyproject && pyproject.includes('flask')) {
108
+ return true;
109
+ }
110
+ // Check for Flask app pattern in common files
111
+ const appFiles = ['app.py', 'application.py', 'main.py', '__init__.py'];
112
+ for (const file of appFiles) {
113
+ const content = context.readFile(file);
114
+ if (content && content.includes('Flask(__name__)')) {
115
+ return true;
116
+ }
117
+ }
118
+ return false;
119
+ },
120
+ resolve(ref, context) {
121
+ // Pattern 1: Blueprint references
122
+ if (ref.referenceName.endsWith('_bp') || ref.referenceName.endsWith('_blueprint')) {
123
+ const result = resolveBlueprint(ref.referenceName, context);
124
+ if (result) {
125
+ return {
126
+ original: ref,
127
+ targetNodeId: result,
128
+ confidence: 0.8,
129
+ resolvedBy: 'framework',
130
+ };
131
+ }
132
+ }
133
+ return null;
134
+ },
135
+ extractNodes(filePath, content) {
136
+ const nodes = [];
137
+ const now = Date.now();
138
+ // Extract Flask route decorators
139
+ // @app.route('/path') or @blueprint.route('/path')
140
+ const routePattern = /@(\w+)\.route\s*\(\s*['"]([^'"]+)['"]/g;
141
+ let match;
142
+ while ((match = routePattern.exec(content)) !== null) {
143
+ const [, _appOrBp, routePath] = match;
144
+ const line = content.slice(0, match.index).split('\n').length;
145
+ nodes.push({
146
+ id: `route:${filePath}:${routePath}:${line}`,
147
+ kind: 'route',
148
+ name: `${routePath}`,
149
+ qualifiedName: `${filePath}::route:${routePath}`,
150
+ filePath,
151
+ startLine: line,
152
+ endLine: line,
153
+ startColumn: 0,
154
+ endColumn: match[0].length,
155
+ language: 'python',
156
+ updatedAt: now,
157
+ });
158
+ }
159
+ return nodes;
160
+ },
161
+ };
162
+ exports.fastapiResolver = {
163
+ name: 'fastapi',
164
+ detect(context) {
165
+ const requirements = context.readFile('requirements.txt');
166
+ if (requirements && requirements.includes('fastapi')) {
167
+ return true;
168
+ }
169
+ const pyproject = context.readFile('pyproject.toml');
170
+ if (pyproject && pyproject.includes('fastapi')) {
171
+ return true;
172
+ }
173
+ // Check for FastAPI app pattern
174
+ const appFiles = ['app.py', 'main.py', 'api.py'];
175
+ for (const file of appFiles) {
176
+ const content = context.readFile(file);
177
+ if (content && content.includes('FastAPI()')) {
178
+ return true;
179
+ }
180
+ }
181
+ return false;
182
+ },
183
+ resolve(ref, context) {
184
+ // Pattern 1: Router references
185
+ if (ref.referenceName.endsWith('_router') || ref.referenceName === 'router') {
186
+ const result = resolveRouter(ref.referenceName, context);
187
+ if (result) {
188
+ return {
189
+ original: ref,
190
+ targetNodeId: result,
191
+ confidence: 0.8,
192
+ resolvedBy: 'framework',
193
+ };
194
+ }
195
+ }
196
+ // Pattern 2: Dependency references
197
+ if (ref.referenceName.startsWith('get_') || ref.referenceName.startsWith('Depends')) {
198
+ const result = resolveDependency(ref.referenceName, context);
199
+ if (result) {
200
+ return {
201
+ original: ref,
202
+ targetNodeId: result,
203
+ confidence: 0.75,
204
+ resolvedBy: 'framework',
205
+ };
206
+ }
207
+ }
208
+ return null;
209
+ },
210
+ extractNodes(filePath, content) {
211
+ const nodes = [];
212
+ const now = Date.now();
213
+ // Extract FastAPI route decorators
214
+ // @app.get('/path') or @router.post('/path')
215
+ const routePattern = /@(\w+)\.(get|post|put|patch|delete|options|head)\s*\(\s*['"]([^'"]+)['"]/g;
216
+ let match;
217
+ while ((match = routePattern.exec(content)) !== null) {
218
+ const [, _appOrRouter, method, routePath] = match;
219
+ const line = content.slice(0, match.index).split('\n').length;
220
+ nodes.push({
221
+ id: `route:${filePath}:${method.toUpperCase()}:${routePath}:${line}`,
222
+ kind: 'route',
223
+ name: `${method.toUpperCase()} ${routePath}`,
224
+ qualifiedName: `${filePath}::${method.toUpperCase()}:${routePath}`,
225
+ filePath,
226
+ startLine: line,
227
+ endLine: line,
228
+ startColumn: 0,
229
+ endColumn: match[0].length,
230
+ language: 'python',
231
+ updatedAt: now,
232
+ });
233
+ }
234
+ return nodes;
235
+ },
236
+ };
237
+ // Helper functions
238
+ function resolveModel(name, context) {
239
+ const modelDirs = ['models', 'app/models', 'src/models'];
240
+ for (const dir of modelDirs) {
241
+ const allFiles = context.getAllFiles();
242
+ for (const file of allFiles) {
243
+ if (file.startsWith(dir) && file.endsWith('.py')) {
244
+ const nodes = context.getNodesInFile(file);
245
+ const modelNode = nodes.find((n) => n.kind === 'class' && n.name === name);
246
+ if (modelNode) {
247
+ return modelNode.id;
248
+ }
249
+ }
250
+ }
251
+ }
252
+ return null;
253
+ }
254
+ function resolveView(name, context) {
255
+ const viewDirs = ['views', 'app/views', 'src/views', 'api/views'];
256
+ for (const dir of viewDirs) {
257
+ const allFiles = context.getAllFiles();
258
+ for (const file of allFiles) {
259
+ if (file.startsWith(dir) && file.endsWith('.py')) {
260
+ const nodes = context.getNodesInFile(file);
261
+ const viewNode = nodes.find((n) => (n.kind === 'class' || n.kind === 'function') && n.name === name);
262
+ if (viewNode) {
263
+ return viewNode.id;
264
+ }
265
+ }
266
+ }
267
+ }
268
+ return null;
269
+ }
270
+ function resolveForm(name, context) {
271
+ const formDirs = ['forms', 'app/forms', 'src/forms'];
272
+ for (const dir of formDirs) {
273
+ const allFiles = context.getAllFiles();
274
+ for (const file of allFiles) {
275
+ if (file.startsWith(dir) && file.endsWith('.py')) {
276
+ const nodes = context.getNodesInFile(file);
277
+ const formNode = nodes.find((n) => n.kind === 'class' && n.name === name);
278
+ if (formNode) {
279
+ return formNode.id;
280
+ }
281
+ }
282
+ }
283
+ }
284
+ return null;
285
+ }
286
+ function resolveBlueprint(name, context) {
287
+ const allFiles = context.getAllFiles();
288
+ for (const file of allFiles) {
289
+ if (file.endsWith('.py')) {
290
+ const nodes = context.getNodesInFile(file);
291
+ const bpNode = nodes.find((n) => n.kind === 'variable' && n.name === name);
292
+ if (bpNode) {
293
+ return bpNode.id;
294
+ }
295
+ }
296
+ }
297
+ return null;
298
+ }
299
+ function resolveRouter(name, context) {
300
+ const routerDirs = ['routers', 'api', 'routes', 'endpoints'];
301
+ for (const dir of routerDirs) {
302
+ const allFiles = context.getAllFiles();
303
+ for (const file of allFiles) {
304
+ if ((file.startsWith(dir) || file.includes('/routers/')) && file.endsWith('.py')) {
305
+ const nodes = context.getNodesInFile(file);
306
+ const routerNode = nodes.find((n) => n.kind === 'variable' && n.name === name);
307
+ if (routerNode) {
308
+ return routerNode.id;
309
+ }
310
+ }
311
+ }
312
+ }
313
+ return null;
314
+ }
315
+ function resolveDependency(name, context) {
316
+ const depDirs = ['dependencies', 'deps', 'core'];
317
+ for (const dir of depDirs) {
318
+ const allFiles = context.getAllFiles();
319
+ for (const file of allFiles) {
320
+ if ((file.startsWith(dir) || file.includes('/dependencies/')) && file.endsWith('.py')) {
321
+ const nodes = context.getNodesInFile(file);
322
+ const depNode = nodes.find((n) => n.kind === 'function' && n.name === name);
323
+ if (depNode) {
324
+ return depNode.id;
325
+ }
326
+ }
327
+ }
328
+ }
329
+ return null;
330
+ }
331
+ //# sourceMappingURL=python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../../../src/resolution/frameworks/python.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * React Framework Resolver
3
+ *
4
+ * Handles React and Next.js patterns.
5
+ */
6
+ import { FrameworkResolver } from '../types';
7
+ export declare const reactResolver: FrameworkResolver;
8
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../src/resolution/frameworks/react.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,iBAAiB,EAAiD,MAAM,UAAU,CAAC;AAE5F,eAAO,MAAM,aAAa,EAAE,iBAmK3B,CAAC"}
@@ -0,0 +1,294 @@
1
+ "use strict";
2
+ /**
3
+ * React Framework Resolver
4
+ *
5
+ * Handles React and Next.js patterns.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.reactResolver = void 0;
9
+ exports.reactResolver = {
10
+ name: 'react',
11
+ detect(context) {
12
+ // Check for React in package.json
13
+ const packageJson = context.readFile('package.json');
14
+ if (packageJson) {
15
+ try {
16
+ const pkg = JSON.parse(packageJson);
17
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
18
+ if (deps.react || deps.next || deps['react-native']) {
19
+ return true;
20
+ }
21
+ }
22
+ catch {
23
+ // Invalid JSON
24
+ }
25
+ }
26
+ // Check for .jsx/.tsx files
27
+ const allFiles = context.getAllFiles();
28
+ return allFiles.some((f) => f.endsWith('.jsx') || f.endsWith('.tsx'));
29
+ },
30
+ resolve(ref, context) {
31
+ // Pattern 1: Component references (PascalCase)
32
+ if (isPascalCase(ref.referenceName) && !isBuiltInType(ref.referenceName)) {
33
+ const result = resolveComponent(ref.referenceName, ref.filePath, context);
34
+ if (result) {
35
+ return {
36
+ original: ref,
37
+ targetNodeId: result,
38
+ confidence: 0.8,
39
+ resolvedBy: 'framework',
40
+ };
41
+ }
42
+ }
43
+ // Pattern 2: Hook references (use*)
44
+ if (ref.referenceName.startsWith('use') && ref.referenceName.length > 3) {
45
+ const result = resolveHook(ref.referenceName, context);
46
+ if (result) {
47
+ return {
48
+ original: ref,
49
+ targetNodeId: result,
50
+ confidence: 0.85,
51
+ resolvedBy: 'framework',
52
+ };
53
+ }
54
+ }
55
+ // Pattern 3: Context references
56
+ if (ref.referenceName.endsWith('Context') || ref.referenceName.endsWith('Provider')) {
57
+ const result = resolveContext(ref.referenceName, context);
58
+ if (result) {
59
+ return {
60
+ original: ref,
61
+ targetNodeId: result,
62
+ confidence: 0.8,
63
+ resolvedBy: 'framework',
64
+ };
65
+ }
66
+ }
67
+ return null;
68
+ },
69
+ extractNodes(filePath, content) {
70
+ const nodes = [];
71
+ const now = Date.now();
72
+ // Extract component definitions
73
+ // function Component() or const Component = () =>
74
+ const componentPatterns = [
75
+ // Function components
76
+ /(?:export\s+)?function\s+([A-Z][a-zA-Z0-9]*)\s*\(/g,
77
+ // Arrow function components
78
+ /(?:export\s+)?(?:const|let)\s+([A-Z][a-zA-Z0-9]*)\s*=\s*(?:\([^)]*\)|[a-zA-Z_][a-zA-Z0-9_]*)\s*=>/g,
79
+ // forwardRef components
80
+ /(?:export\s+)?(?:const|let)\s+([A-Z][a-zA-Z0-9]*)\s*=\s*(?:React\.)?forwardRef/g,
81
+ // memo components
82
+ /(?:export\s+)?(?:const|let)\s+([A-Z][a-zA-Z0-9]*)\s*=\s*(?:React\.)?memo/g,
83
+ ];
84
+ for (const pattern of componentPatterns) {
85
+ let match;
86
+ while ((match = pattern.exec(content)) !== null) {
87
+ const [fullMatch, name] = match;
88
+ const line = content.slice(0, match.index).split('\n').length;
89
+ // Check if it returns JSX (rough heuristic)
90
+ const afterMatch = content.slice(match.index + fullMatch.length, match.index + fullMatch.length + 500);
91
+ const hasJSX = afterMatch.includes('<') && (afterMatch.includes('/>') || afterMatch.includes('</'));
92
+ if (hasJSX) {
93
+ nodes.push({
94
+ id: `component:${filePath}:${name}:${line}`,
95
+ kind: 'component',
96
+ name: name,
97
+ qualifiedName: `${filePath}::${name}`,
98
+ filePath,
99
+ startLine: line,
100
+ endLine: line,
101
+ startColumn: 0,
102
+ endColumn: fullMatch.length,
103
+ language: filePath.endsWith('.tsx') ? 'tsx' : 'jsx',
104
+ isExported: fullMatch.includes('export'),
105
+ updatedAt: now,
106
+ });
107
+ }
108
+ }
109
+ }
110
+ // Extract custom hooks
111
+ const hookPattern = /(?:export\s+)?(?:function|const|let)\s+(use[A-Z][a-zA-Z0-9]*)\s*[=(]/g;
112
+ let hookMatch;
113
+ while ((hookMatch = hookPattern.exec(content)) !== null) {
114
+ const [fullMatch, name] = hookMatch;
115
+ const line = content.slice(0, hookMatch.index).split('\n').length;
116
+ nodes.push({
117
+ id: `hook:${filePath}:${name}:${line}`,
118
+ kind: 'function',
119
+ name: name,
120
+ qualifiedName: `${filePath}::${name}`,
121
+ filePath,
122
+ startLine: line,
123
+ endLine: line,
124
+ startColumn: 0,
125
+ endColumn: fullMatch.length,
126
+ language: filePath.endsWith('.ts') || filePath.endsWith('.tsx') ? 'typescript' : 'javascript',
127
+ isExported: fullMatch.includes('export'),
128
+ updatedAt: now,
129
+ });
130
+ }
131
+ // Extract Next.js pages/routes (pages directory convention)
132
+ if (filePath.includes('pages/') || filePath.includes('app/')) {
133
+ // Default export in pages becomes a route
134
+ if (content.includes('export default')) {
135
+ const routePath = filePathToRoute(filePath);
136
+ if (routePath) {
137
+ const line = content.indexOf('export default');
138
+ const lineNum = content.slice(0, line).split('\n').length;
139
+ nodes.push({
140
+ id: `route:${filePath}:${routePath}:${lineNum}`,
141
+ kind: 'route',
142
+ name: routePath,
143
+ qualifiedName: `${filePath}::route:${routePath}`,
144
+ filePath,
145
+ startLine: lineNum,
146
+ endLine: lineNum,
147
+ startColumn: 0,
148
+ endColumn: 0,
149
+ language: filePath.endsWith('.tsx') ? 'tsx' : filePath.endsWith('.ts') ? 'typescript' : 'javascript',
150
+ updatedAt: now,
151
+ });
152
+ }
153
+ }
154
+ }
155
+ return nodes;
156
+ },
157
+ };
158
+ /**
159
+ * Check if string is PascalCase
160
+ */
161
+ function isPascalCase(str) {
162
+ return /^[A-Z][a-zA-Z0-9]*$/.test(str);
163
+ }
164
+ /**
165
+ * Check if name is a built-in type
166
+ */
167
+ function isBuiltInType(name) {
168
+ const builtIns = [
169
+ 'Array', 'Boolean', 'Date', 'Error', 'Function', 'JSON', 'Math', 'Number',
170
+ 'Object', 'Promise', 'RegExp', 'String', 'Symbol', 'Map', 'Set', 'WeakMap', 'WeakSet',
171
+ 'React', 'Component', 'Fragment', 'Suspense', 'StrictMode',
172
+ ];
173
+ return builtIns.includes(name);
174
+ }
175
+ /**
176
+ * Resolve a component reference
177
+ */
178
+ function resolveComponent(name, fromFile, context) {
179
+ // Look for component in common locations
180
+ const componentDirs = [
181
+ 'components',
182
+ 'src/components',
183
+ 'app/components',
184
+ 'pages',
185
+ 'src/pages',
186
+ 'views',
187
+ 'src/views',
188
+ ];
189
+ // First, check same directory
190
+ const fromDir = fromFile.substring(0, fromFile.lastIndexOf('/'));
191
+ const sameDir = context.getAllFiles().filter((f) => f.startsWith(fromDir));
192
+ for (const file of sameDir) {
193
+ if (file.toLowerCase().includes(name.toLowerCase())) {
194
+ const nodes = context.getNodesInFile(file);
195
+ const component = nodes.find((n) => (n.kind === 'component' || n.kind === 'function' || n.kind === 'class') && n.name === name);
196
+ if (component) {
197
+ return component.id;
198
+ }
199
+ }
200
+ }
201
+ // Then check component directories
202
+ for (const dir of componentDirs) {
203
+ const allFiles = context.getAllFiles();
204
+ for (const file of allFiles) {
205
+ if (file.startsWith(dir) && file.toLowerCase().includes(name.toLowerCase())) {
206
+ const nodes = context.getNodesInFile(file);
207
+ const component = nodes.find((n) => (n.kind === 'component' || n.kind === 'function' || n.kind === 'class') && n.name === name);
208
+ if (component) {
209
+ return component.id;
210
+ }
211
+ }
212
+ }
213
+ }
214
+ return null;
215
+ }
216
+ /**
217
+ * Resolve a custom hook reference
218
+ */
219
+ function resolveHook(name, context) {
220
+ const hookDirs = ['hooks', 'src/hooks', 'lib/hooks', 'utils/hooks'];
221
+ for (const dir of hookDirs) {
222
+ const allFiles = context.getAllFiles();
223
+ for (const file of allFiles) {
224
+ if (file.startsWith(dir) || file.includes('/hooks/')) {
225
+ const nodes = context.getNodesInFile(file);
226
+ const hook = nodes.find((n) => n.kind === 'function' && n.name === name);
227
+ if (hook) {
228
+ return hook.id;
229
+ }
230
+ }
231
+ }
232
+ }
233
+ // Also check all files for the hook
234
+ const allNodes = context.getNodesByName(name);
235
+ const hookNode = allNodes.find((n) => n.kind === 'function' && n.name.startsWith('use'));
236
+ if (hookNode) {
237
+ return hookNode.id;
238
+ }
239
+ return null;
240
+ }
241
+ /**
242
+ * Resolve a context reference
243
+ */
244
+ function resolveContext(name, context) {
245
+ const contextDirs = ['context', 'contexts', 'src/context', 'src/contexts', 'providers', 'src/providers'];
246
+ for (const dir of contextDirs) {
247
+ const allFiles = context.getAllFiles();
248
+ for (const file of allFiles) {
249
+ if (file.startsWith(dir) || file.includes('/context/') || file.includes('/contexts/')) {
250
+ const nodes = context.getNodesInFile(file);
251
+ const contextNode = nodes.find((n) => n.name === name || n.name === name.replace(/Context$|Provider$/, ''));
252
+ if (contextNode) {
253
+ return contextNode.id;
254
+ }
255
+ }
256
+ }
257
+ }
258
+ return null;
259
+ }
260
+ /**
261
+ * Convert file path to Next.js route
262
+ */
263
+ function filePathToRoute(filePath) {
264
+ // pages/index.tsx -> /
265
+ // pages/about.tsx -> /about
266
+ // pages/blog/[slug].tsx -> /blog/:slug
267
+ // app/page.tsx -> /
268
+ // app/about/page.tsx -> /about
269
+ if (filePath.includes('pages/')) {
270
+ let route = filePath
271
+ .replace(/^.*pages\//, '/')
272
+ .replace(/\/index\.(tsx?|jsx?)$/, '')
273
+ .replace(/\.(tsx?|jsx?)$/, '')
274
+ .replace(/\[([^\]]+)\]/g, ':$1');
275
+ if (route === '')
276
+ route = '/';
277
+ return route;
278
+ }
279
+ if (filePath.includes('app/')) {
280
+ // App router - only page.tsx files are routes
281
+ if (!filePath.includes('page.')) {
282
+ return null;
283
+ }
284
+ let route = filePath
285
+ .replace(/^.*app\//, '/')
286
+ .replace(/\/page\.(tsx?|jsx?)$/, '')
287
+ .replace(/\[([^\]]+)\]/g, ':$1');
288
+ if (route === '')
289
+ route = '/';
290
+ return route;
291
+ }
292
+ return null;
293
+ }
294
+ //# sourceMappingURL=react.js.map