@colbymchenry/codegraph-darwin-arm64 0.9.2 → 0.9.4

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 (115) hide show
  1. package/bin/codegraph +2 -1
  2. package/lib/dist/bin/codegraph.d.ts +4 -0
  3. package/lib/dist/bin/codegraph.d.ts.map +1 -1
  4. package/lib/dist/bin/codegraph.js +278 -0
  5. package/lib/dist/bin/codegraph.js.map +1 -1
  6. package/lib/dist/context/index.d.ts +13 -0
  7. package/lib/dist/context/index.d.ts.map +1 -1
  8. package/lib/dist/context/index.js +120 -1
  9. package/lib/dist/context/index.js.map +1 -1
  10. package/lib/dist/db/index.d.ts +18 -0
  11. package/lib/dist/db/index.d.ts.map +1 -1
  12. package/lib/dist/db/index.js +31 -0
  13. package/lib/dist/db/index.js.map +1 -1
  14. package/lib/dist/db/queries.d.ts +16 -0
  15. package/lib/dist/db/queries.d.ts.map +1 -1
  16. package/lib/dist/db/queries.js +80 -27
  17. package/lib/dist/db/queries.js.map +1 -1
  18. package/lib/dist/extraction/grammars.d.ts +6 -0
  19. package/lib/dist/extraction/grammars.d.ts.map +1 -1
  20. package/lib/dist/extraction/grammars.js +17 -0
  21. package/lib/dist/extraction/grammars.js.map +1 -1
  22. package/lib/dist/extraction/tree-sitter.d.ts.map +1 -1
  23. package/lib/dist/extraction/tree-sitter.js +73 -4
  24. package/lib/dist/extraction/tree-sitter.js.map +1 -1
  25. package/lib/dist/extraction/wasm-runtime-flags.d.ts +38 -0
  26. package/lib/dist/extraction/wasm-runtime-flags.d.ts.map +1 -0
  27. package/lib/dist/extraction/wasm-runtime-flags.js +105 -0
  28. package/lib/dist/extraction/wasm-runtime-flags.js.map +1 -0
  29. package/lib/dist/graph/traversal.d.ts.map +1 -1
  30. package/lib/dist/graph/traversal.js +71 -36
  31. package/lib/dist/graph/traversal.js.map +1 -1
  32. package/lib/dist/index.d.ts.map +1 -1
  33. package/lib/dist/index.js +9 -0
  34. package/lib/dist/index.js.map +1 -1
  35. package/lib/dist/installer/index.d.ts +52 -1
  36. package/lib/dist/installer/index.d.ts.map +1 -1
  37. package/lib/dist/installer/index.js +121 -0
  38. package/lib/dist/installer/index.js.map +1 -1
  39. package/lib/dist/installer/instructions-template.d.ts +2 -2
  40. package/lib/dist/installer/instructions-template.d.ts.map +1 -1
  41. package/lib/dist/installer/instructions-template.js +2 -1
  42. package/lib/dist/installer/instructions-template.js.map +1 -1
  43. package/lib/dist/installer/targets/cursor.d.ts.map +1 -1
  44. package/lib/dist/installer/targets/cursor.js +57 -3
  45. package/lib/dist/installer/targets/cursor.js.map +1 -1
  46. package/lib/dist/mcp/index.d.ts +4 -0
  47. package/lib/dist/mcp/index.d.ts.map +1 -1
  48. package/lib/dist/mcp/index.js +97 -0
  49. package/lib/dist/mcp/index.js.map +1 -1
  50. package/lib/dist/mcp/server-instructions.d.ts +1 -1
  51. package/lib/dist/mcp/server-instructions.d.ts.map +1 -1
  52. package/lib/dist/mcp/server-instructions.js +2 -0
  53. package/lib/dist/mcp/server-instructions.js.map +1 -1
  54. package/lib/dist/mcp/tools.d.ts +81 -2
  55. package/lib/dist/mcp/tools.d.ts.map +1 -1
  56. package/lib/dist/mcp/tools.js +664 -24
  57. package/lib/dist/mcp/tools.js.map +1 -1
  58. package/lib/dist/resolution/callback-synthesizer.d.ts +9 -0
  59. package/lib/dist/resolution/callback-synthesizer.d.ts.map +1 -0
  60. package/lib/dist/resolution/callback-synthesizer.js +576 -0
  61. package/lib/dist/resolution/callback-synthesizer.js.map +1 -0
  62. package/lib/dist/resolution/frameworks/csharp.d.ts.map +1 -1
  63. package/lib/dist/resolution/frameworks/csharp.js +36 -8
  64. package/lib/dist/resolution/frameworks/csharp.js.map +1 -1
  65. package/lib/dist/resolution/frameworks/drupal.d.ts.map +1 -1
  66. package/lib/dist/resolution/frameworks/drupal.js +44 -12
  67. package/lib/dist/resolution/frameworks/drupal.js.map +1 -1
  68. package/lib/dist/resolution/frameworks/express.d.ts.map +1 -1
  69. package/lib/dist/resolution/frameworks/express.js +102 -19
  70. package/lib/dist/resolution/frameworks/express.js.map +1 -1
  71. package/lib/dist/resolution/frameworks/go.d.ts.map +1 -1
  72. package/lib/dist/resolution/frameworks/go.js +6 -3
  73. package/lib/dist/resolution/frameworks/go.js.map +1 -1
  74. package/lib/dist/resolution/frameworks/index.d.ts +1 -0
  75. package/lib/dist/resolution/frameworks/index.d.ts.map +1 -1
  76. package/lib/dist/resolution/frameworks/index.js +5 -1
  77. package/lib/dist/resolution/frameworks/index.js.map +1 -1
  78. package/lib/dist/resolution/frameworks/java.d.ts.map +1 -1
  79. package/lib/dist/resolution/frameworks/java.js +70 -12
  80. package/lib/dist/resolution/frameworks/java.js.map +1 -1
  81. package/lib/dist/resolution/frameworks/laravel.d.ts.map +1 -1
  82. package/lib/dist/resolution/frameworks/laravel.js +17 -8
  83. package/lib/dist/resolution/frameworks/laravel.js.map +1 -1
  84. package/lib/dist/resolution/frameworks/play.d.ts +19 -0
  85. package/lib/dist/resolution/frameworks/play.d.ts.map +1 -0
  86. package/lib/dist/resolution/frameworks/play.js +111 -0
  87. package/lib/dist/resolution/frameworks/play.js.map +1 -0
  88. package/lib/dist/resolution/frameworks/python.d.ts.map +1 -1
  89. package/lib/dist/resolution/frameworks/python.js +134 -16
  90. package/lib/dist/resolution/frameworks/python.js.map +1 -1
  91. package/lib/dist/resolution/frameworks/react.d.ts.map +1 -1
  92. package/lib/dist/resolution/frameworks/react.js +96 -3
  93. package/lib/dist/resolution/frameworks/react.js.map +1 -1
  94. package/lib/dist/resolution/frameworks/ruby.d.ts.map +1 -1
  95. package/lib/dist/resolution/frameworks/ruby.js +106 -2
  96. package/lib/dist/resolution/frameworks/ruby.js.map +1 -1
  97. package/lib/dist/resolution/frameworks/rust.d.ts.map +1 -1
  98. package/lib/dist/resolution/frameworks/rust.js +102 -5
  99. package/lib/dist/resolution/frameworks/rust.js.map +1 -1
  100. package/lib/dist/resolution/frameworks/swift.d.ts.map +1 -1
  101. package/lib/dist/resolution/frameworks/swift.js +30 -6
  102. package/lib/dist/resolution/frameworks/swift.js.map +1 -1
  103. package/lib/dist/resolution/index.d.ts.map +1 -1
  104. package/lib/dist/resolution/index.js +61 -9
  105. package/lib/dist/resolution/index.js.map +1 -1
  106. package/lib/dist/resolution/lru-cache.d.ts +24 -0
  107. package/lib/dist/resolution/lru-cache.d.ts.map +1 -0
  108. package/lib/dist/resolution/lru-cache.js +62 -0
  109. package/lib/dist/resolution/lru-cache.js.map +1 -0
  110. package/lib/dist/resolution/types.d.ts +8 -0
  111. package/lib/dist/resolution/types.d.ts.map +1 -1
  112. package/lib/dist/utils.js +1 -1
  113. package/lib/node_modules/.package-lock.json +1 -1
  114. package/lib/package.json +1 -1
  115. package/package.json +1 -1
@@ -9,7 +9,7 @@ exports.springResolver = void 0;
9
9
  const strip_comments_1 = require("../strip-comments");
10
10
  exports.springResolver = {
11
11
  name: 'spring',
12
- languages: ['java'],
12
+ languages: ['java', 'kotlin'],
13
13
  detect(context) {
14
14
  // Check for pom.xml with Spring
15
15
  const pomXml = context.readFile('pom.xml');
@@ -104,19 +104,35 @@ exports.springResolver = {
104
104
  return null;
105
105
  },
106
106
  extract(filePath, content) {
107
- if (!filePath.endsWith('.java'))
107
+ // Spring Boot is used from both Java and Kotlin (identical @GetMapping etc.
108
+ // annotations); the difference is method syntax — Kotlin `fun name(...)` vs
109
+ // Java `public X name(...)` — handled in the method regex below.
110
+ if (!filePath.endsWith('.java') && !filePath.endsWith('.kt'))
108
111
  return { nodes: [], references: [] };
109
112
  const nodes = [];
110
113
  const references = [];
111
114
  const now = Date.now();
115
+ const lang = filePath.endsWith('.kt') ? 'kotlin' : 'java';
112
116
  const safe = (0, strip_comments_1.stripCommentsForRegex)(content, 'java');
113
- // @GetMapping("/path"), @PostMapping(value = "/path"), @RequestMapping("/path")
114
- const mappingRegex = /@(GetMapping|PostMapping|PutMapping|PatchMapping|DeleteMapping|RequestMapping)\s*\(\s*(?:value\s*=\s*|path\s*=\s*)?["']([^"']+)["'][^)]*\)/g;
117
+ // Class-level @RequestMapping prefix (an @RequestMapping whose tail leads to a
118
+ // `class`). Joined onto each method's path — and, crucially, NOT treated as a
119
+ // route itself (the old regex did, creating one bogus class route and missing
120
+ // every BARE method mapping like `@PostMapping` with the path on the class).
121
+ let classPrefix = '';
122
+ const cls = /@RequestMapping\s*\(([^)]*)\)\s*(?:@[\w.]+(?:\([^)]*\))?\s*)*(?:public\s+|final\s+|abstract\s+|open\s+|data\s+|sealed\s+)*class\b/.exec(safe);
123
+ if (cls)
124
+ classPrefix = parseMappingPath(cls[1]);
125
+ const VERB = {
126
+ GetMapping: 'GET', PostMapping: 'POST', PutMapping: 'PUT', PatchMapping: 'PATCH', DeleteMapping: 'DELETE',
127
+ };
128
+ // Verb-specific method mappings — always method-level, BARE or with a path.
129
+ const mappingRegex = /@(GetMapping|PostMapping|PutMapping|PatchMapping|DeleteMapping)\b\s*(\([^)]*\))?/g;
115
130
  let match;
116
131
  while ((match = mappingRegex.exec(safe)) !== null) {
117
- const [, mappingName, routePath] = match;
132
+ const method = VERB[match[1]];
133
+ const sub = parseMappingPath((match[2] || '').replace(/^\(|\)$/g, ''));
134
+ const routePath = joinPath(classPrefix, sub);
118
135
  const line = safe.slice(0, match.index).split('\n').length;
119
- const method = mappingName === 'RequestMapping' ? 'ANY' : mappingName.replace(/Mapping$/, '').toUpperCase();
120
136
  const routeNode = {
121
137
  id: `route:${filePath}:${line}:${method}:${routePath}`,
122
138
  kind: 'route',
@@ -127,25 +143,57 @@ exports.springResolver = {
127
143
  endLine: line,
128
144
  startColumn: 0,
129
145
  endColumn: match[0].length,
130
- language: 'java',
146
+ language: lang,
131
147
  updatedAt: now,
132
148
  };
133
149
  nodes.push(routeNode);
134
- // Look for the next public/private/protected method after the annotation
135
- const tail = safe.slice(match.index + match[0].length);
136
- const methodMatch = tail.match(/\b(?:public|private|protected)\s+[^;{]*?\s+(\w+)\s*\(/);
150
+ // Method it decorates: first declared method after (skip stacked annotations;
151
+ // Java puts the return type before the name). Bounded so we don't grab a far one.
152
+ const tail = safe.slice(match.index + match[0].length, match.index + match[0].length + 600);
153
+ const methodMatch = tail.match(/\bfun\s+(\w+)\s*\(|\b(?:public|private|protected)\s+[^;{=]*?\s+(\w+)\s*\(/);
137
154
  if (methodMatch) {
138
155
  references.push({
139
156
  fromNodeId: routeNode.id,
140
- referenceName: methodMatch[1],
157
+ referenceName: (methodMatch[1] ?? methodMatch[2]),
141
158
  referenceKind: 'references',
142
159
  line,
143
160
  column: 0,
144
161
  filePath,
145
- language: 'java',
162
+ language: lang,
146
163
  });
147
164
  }
148
165
  }
166
+ // Method-level @RequestMapping (older style: `@RequestMapping(value="/x",
167
+ // method=RequestMethod.GET)` on a method). The class-level @RequestMapping is
168
+ // the prefix (handled above) — skip it here so it isn't double-counted.
169
+ const reqRe = /@RequestMapping\b\s*(\([^)]*\))?/g;
170
+ while ((match = reqRe.exec(safe)) !== null) {
171
+ const args = (match[1] || '').replace(/^\(|\)$/g, '');
172
+ const after = safe.slice(match.index + match[0].length, match.index + match[0].length + 600);
173
+ if (/^\s*(?:@[\w.]+(?:\([^)]*\))?\s*)*(?:public\s+|final\s+|abstract\s+|open\s+|data\s+|sealed\s+)*class\b/.test(after))
174
+ continue; // class-level prefix
175
+ const methodMatch = after.match(/\bfun\s+(\w+)\s*\(|\b(?:public|private|protected)\s+[^;{=]*?\s+(\w+)\s*\(/);
176
+ if (!methodMatch)
177
+ continue;
178
+ const verbM = args.match(/method\s*=\s*(?:RequestMethod\.)?(\w+)/);
179
+ const method = verbM ? verbM[1].toUpperCase() : 'ANY';
180
+ const routePath = joinPath(classPrefix, parseMappingPath(args));
181
+ const line = safe.slice(0, match.index).split('\n').length;
182
+ const routeNode = {
183
+ id: `route:${filePath}:${line}:${method}:${routePath}`,
184
+ kind: 'route',
185
+ name: `${method} ${routePath}`,
186
+ qualifiedName: `${filePath}::route:${routePath}`,
187
+ filePath, startLine: line, endLine: line, startColumn: 0, endColumn: match[0].length, language: lang, updatedAt: now,
188
+ };
189
+ nodes.push(routeNode);
190
+ references.push({
191
+ fromNodeId: routeNode.id,
192
+ referenceName: (methodMatch[1] ?? methodMatch[2]),
193
+ referenceKind: 'references',
194
+ line, column: 0, filePath, language: lang,
195
+ });
196
+ }
149
197
  return { nodes, references };
150
198
  },
151
199
  };
@@ -157,6 +205,16 @@ const ENTITY_DIRS = ['/entity/', '/entities/', '/model/', '/models/', '/domain/'
157
205
  const COMPONENT_DIRS = ['/component/', '/components/', '/config/'];
158
206
  const CLASS_KINDS = new Set(['class']);
159
207
  const SERVICE_KINDS = new Set(['class', 'interface']);
208
+ /** Path string from a mapping's args (`"/x"`, `value = "/x"`, `path = "/x"`); '' if bare. */
209
+ function parseMappingPath(args) {
210
+ const m = args.match(/["']([^"']*)["']/);
211
+ return m ? m[1] : '';
212
+ }
213
+ /** Join a class-level prefix and a method sub-path into one normalized `/path`. */
214
+ function joinPath(prefix, sub) {
215
+ const parts = [prefix, sub].map((p) => p.replace(/^\/+|\/+$/g, '')).filter(Boolean);
216
+ return '/' + parts.join('/');
217
+ }
160
218
  /**
161
219
  * Resolve a symbol by name using indexed queries instead of scanning all files.
162
220
  */
@@ -1 +1 @@
1
- {"version":3,"file":"java.js","sourceRoot":"","sources":["../../../src/resolution/frameworks/java.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"java.js","sourceRoot":"","sources":["../../../src/resolution/frameworks/java.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"laravel.d.ts","sourceRoot":"","sources":["../../../src/resolution/frameworks/laravel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,iBAAiB,EAAiD,MAAM,UAAU,CAAC;AAG5F;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAqBlD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,iBA2I7B,CAAC"}
1
+ {"version":3,"file":"laravel.d.ts","sourceRoot":"","sources":["../../../src/resolution/frameworks/laravel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,iBAAiB,EAAiD,MAAM,UAAU,CAAC;AAG5F;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAqBlD,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,iBAkJ7B,CAAC"}
@@ -40,6 +40,12 @@ exports.laravelResolver = {
40
40
  // Check for artisan file (Laravel signature)
41
41
  return context.fileExists('artisan') || context.fileExists('app/Http/Kernel.php');
42
42
  },
43
+ // `Controller@method` route refs name no declared symbol, so resolveOne's
44
+ // pre-filter would drop them before resolve() runs (Pattern 4). Claim them —
45
+ // same hook the django ORM / Rails routing work needed.
46
+ claimsReference(name) {
47
+ return /^[A-Za-z_][A-Za-z0-9_]*Controller@\w+$/.test(name);
48
+ },
43
49
  resolve(ref, context) {
44
50
  // Pattern 1: Model::method() - Eloquent static calls
45
51
  const modelMatch = ref.referenceName.match(/^([A-Z][a-zA-Z]+)::(\w+)$/);
@@ -171,18 +177,21 @@ exports.laravelResolver = {
171
177
  */
172
178
  function extractLaravelHandler(expr) {
173
179
  const trimmed = expr.trim();
174
- // [Class::class, 'method'] grab the string literal
175
- const tupleMatch = trimmed.match(/^\[\s*[^,]+,\s*['"]([^'"]+)['"]\s*\]/);
180
+ const short = (s) => s.split('\\').pop(); // strip namespace
181
+ // [Class::class, 'method'] → `Class@method` (PRECISE — keep the controller, so
182
+ // common action names like `index`/`show` resolve to the RIGHT controller, not
183
+ // whichever one name-matching happens to pick first).
184
+ const tupleMatch = trimmed.match(/^\[\s*([A-Za-z_\\][\w\\]*)::class\s*,\s*['"]([^'"]+)['"]\s*\]/);
176
185
  if (tupleMatch)
177
- return tupleMatch[1];
178
- // 'Controller@method'
186
+ return `${short(tupleMatch[1])}@${tupleMatch[2]}`;
187
+ // 'Controller@method' (possibly namespaced) → `Controller@method`
179
188
  const atMatch = trimmed.match(/^['"]([^'"@]+)@([^'"]+)['"]$/);
180
189
  if (atMatch)
181
- return atMatch[2];
182
- // Controller::class
183
- const classMatch = trimmed.match(/^([A-Za-z_][A-Za-z0-9_]*)::class/);
190
+ return `${short(atMatch[1])}@${atMatch[2]}`;
191
+ // Class::class (Route::resource controller) → `Class`
192
+ const classMatch = trimmed.match(/^([A-Za-z_\\][\w\\]*)::class/);
184
193
  if (classMatch)
185
- return classMatch[1];
194
+ return short(classMatch[1]);
186
195
  return null;
187
196
  }
188
197
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"laravel.js","sourceRoot":"","sources":["../../../src/resolution/frameworks/laravel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"laravel.js","sourceRoot":"","sources":["../../../src/resolution/frameworks/laravel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Play Framework (Scala/Java) resolver.
3
+ *
4
+ * Play declares HTTP routes in a dedicated `conf/routes` file (and included
5
+ * `conf/*.routes`), Rails-style:
6
+ *
7
+ * GET /computers controllers.Application.list(p: Int ?= 0)
8
+ * POST /computers controllers.Application.save
9
+ * GET /assets/*file controllers.Assets.versioned(path = "/public", file: Asset)
10
+ *
11
+ * The file is extensionless, so the file walk only indexes it because
12
+ * `isPlayRoutesFile` (grammars.ts) opts it in; it's processed through the
13
+ * no-grammar path and this resolver extracts the routes. Each route references
14
+ * its handler as `Controller.method` (the package prefix is dropped), resolved
15
+ * to the action method in the controller class.
16
+ */
17
+ import { FrameworkResolver } from '../types';
18
+ export declare const playResolver: FrameworkResolver;
19
+ //# sourceMappingURL=play.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"play.d.ts","sourceRoot":"","sources":["../../../src/resolution/frameworks/play.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,iBAAiB,EAAiD,MAAM,UAAU,CAAC;AAO5F,eAAO,MAAM,YAAY,EAAE,iBAsF1B,CAAC"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ /**
3
+ * Play Framework (Scala/Java) resolver.
4
+ *
5
+ * Play declares HTTP routes in a dedicated `conf/routes` file (and included
6
+ * `conf/*.routes`), Rails-style:
7
+ *
8
+ * GET /computers controllers.Application.list(p: Int ?= 0)
9
+ * POST /computers controllers.Application.save
10
+ * GET /assets/*file controllers.Assets.versioned(path = "/public", file: Asset)
11
+ *
12
+ * The file is extensionless, so the file walk only indexes it because
13
+ * `isPlayRoutesFile` (grammars.ts) opts it in; it's processed through the
14
+ * no-grammar path and this resolver extracts the routes. Each route references
15
+ * its handler as `Controller.method` (the package prefix is dropped), resolved
16
+ * to the action method in the controller class.
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.playResolver = void 0;
20
+ const grammars_1 = require("../../extraction/grammars");
21
+ const ROUTE_LINE = /^(GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS)\s+(\S+)\s+(.+)$/;
22
+ const METHOD_KINDS = new Set(['method', 'function']);
23
+ const CLASS_KINDS = new Set(['class']);
24
+ exports.playResolver = {
25
+ name: 'play',
26
+ // `yaml` so this resolver runs on conf/routes (detectLanguage maps it to yaml);
27
+ // `scala`/`java` so it's active in Play projects of either language.
28
+ languages: ['scala', 'java', 'yaml'],
29
+ detect(context) {
30
+ const buildSbt = context.readFile('build.sbt');
31
+ if (buildSbt && /playframework|"play"|sbt-plugin|PlayScala|PlayJava/i.test(buildSbt))
32
+ return true;
33
+ if (context.fileExists('conf/routes'))
34
+ return true;
35
+ if (context.fileExists('conf/application.conf'))
36
+ return true;
37
+ return false;
38
+ },
39
+ // The handler is `Controller.method` (a class-qualified action), which names no
40
+ // bare declared symbol, so resolveOne's pre-filter could drop it — claim it.
41
+ claimsReference(name) {
42
+ return /^[A-Za-z_]\w*\.[A-Za-z_]\w*$/.test(name);
43
+ },
44
+ resolve(ref, context) {
45
+ const m = ref.referenceName.match(/^([A-Za-z_]\w*)\.([A-Za-z_]\w*)$/);
46
+ if (!m)
47
+ return null;
48
+ const [, className, methodName] = m;
49
+ const classNodes = context.getNodesByName(className).filter((n) => CLASS_KINDS.has(n.kind));
50
+ for (const cls of classNodes) {
51
+ const method = context
52
+ .getNodesInFile(cls.filePath)
53
+ .find((n) => METHOD_KINDS.has(n.kind) && n.name === methodName);
54
+ if (method) {
55
+ return { original: ref, targetNodeId: method.id, confidence: 0.9, resolvedBy: 'framework' };
56
+ }
57
+ }
58
+ return null;
59
+ },
60
+ extract(filePath, content) {
61
+ if (!(0, grammars_1.isPlayRoutesFile)(filePath))
62
+ return { nodes: [], references: [] };
63
+ const nodes = [];
64
+ const references = [];
65
+ const now = Date.now();
66
+ const lines = content.split('\n');
67
+ for (let i = 0; i < lines.length; i++) {
68
+ const line = lines[i].trim();
69
+ // Skip comments and `->` route includes (a sub-router mount, not an action).
70
+ if (!line || line.startsWith('#') || line.startsWith('->'))
71
+ continue;
72
+ const m = line.match(ROUTE_LINE);
73
+ if (!m)
74
+ continue;
75
+ const [, method, routePath, action] = m;
76
+ // action: `controllers.Application.list(p: Int ?= 0)` → drop args, keep the
77
+ // last `Controller.method` segment (package prefix is irrelevant for lookup).
78
+ const fqn = action.split('(')[0].trim();
79
+ const parts = fqn.split('.').filter(Boolean);
80
+ if (parts.length < 2)
81
+ continue;
82
+ const handlerRef = parts.slice(-2).join('.'); // Application.list
83
+ const lineNum = i + 1;
84
+ const routeNode = {
85
+ id: `route:${filePath}:${lineNum}:${method}:${routePath}`,
86
+ kind: 'route',
87
+ name: `${method} ${routePath}`,
88
+ qualifiedName: `${filePath}::${method}:${routePath}`,
89
+ filePath,
90
+ startLine: lineNum,
91
+ endLine: lineNum,
92
+ startColumn: 0,
93
+ endColumn: 0,
94
+ language: 'scala',
95
+ updatedAt: now,
96
+ };
97
+ nodes.push(routeNode);
98
+ references.push({
99
+ fromNodeId: routeNode.id,
100
+ referenceName: handlerRef,
101
+ referenceKind: 'references',
102
+ line: lineNum,
103
+ column: 0,
104
+ filePath,
105
+ language: 'scala',
106
+ });
107
+ }
108
+ return { nodes, references };
109
+ },
110
+ };
111
+ //# sourceMappingURL=play.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"play.js","sourceRoot":"","sources":["../../../src/resolution/frameworks/play.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../src/resolution/frameworks/python.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,iBAAiB,EAA+D,MAAM,UAAU,CAAC;AAG1G,eAAO,MAAM,cAAc,EAAE,iBAgF5B,CAAC;AAwBF,eAAO,MAAM,aAAa,EAAE,iBAoC3B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,iBAwC7B,CAAC"}
1
+ {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../../src/resolution/frameworks/python.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,iBAAiB,EAA+D,MAAM,UAAU,CAAC;AAG1G,eAAO,MAAM,cAAc,EAAE,iBA4H5B,CAAC;AAwCF,eAAO,MAAM,aAAa,EAAE,iBAmD3B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,iBAyC7B,CAAC"}
@@ -38,8 +38,24 @@ exports.djangoResolver = {
38
38
  if (result)
39
39
  return { original: ref, targetNodeId: result, confidence: 0.8, resolvedBy: 'framework' };
40
40
  }
41
+ // ORM dynamic dispatch: QuerySet._fetch_all (and siblings) call
42
+ // `self._iterable_class(self)` — a runtime dispatch to the iterable class
43
+ // (default ModelIterable) whose __iter__ runs the SQL compiler. Static
44
+ // parsing can't resolve an attribute-as-callable, so it leaves an unresolved
45
+ // `_iterable_class` ref and a hole in the QuerySet→compiler chain. Bridge it
46
+ // to ModelIterable.__iter__ so the flow actually exists in the graph.
47
+ if (ref.referenceName === '_iterable_class') {
48
+ const target = resolveModelIterableIter(context);
49
+ if (target)
50
+ return { original: ref, targetNodeId: target, confidence: 0.7, resolvedBy: 'framework' };
51
+ }
41
52
  return null;
42
53
  },
54
+ // Let the ORM dynamic-dispatch ref reach resolve() despite no symbol being
55
+ // named `_iterable_class` (it's a QuerySet attribute, not a declared method).
56
+ claimsReference(name) {
57
+ return name === '_iterable_class';
58
+ },
43
59
  extract(filePath, content) {
44
60
  if (!filePath.endsWith('.py'))
45
61
  return { nodes: [], references: [] };
@@ -83,9 +99,51 @@ exports.djangoResolver = {
83
99
  });
84
100
  }
85
101
  }
102
+ // DRF router registration: `router.register(r'articles', ArticleViewSet)` →
103
+ // route → the ViewSet class (the core CRUD endpoints, which path()/url() miss).
104
+ // The STRING first arg separates this from `admin.site.register(Model, Admin)`
105
+ // (whose first arg is a model class, not a string); the View/ViewSet suffix on
106
+ // the 2nd arg keeps it to DRF viewsets.
107
+ const routerRegex = /\.register\s*\(\s*r?['"]([^'"]+)['"]\s*,\s*([\w.]+)/g;
108
+ while ((match = routerRegex.exec(safe)) !== null) {
109
+ const prefix = match[1].replace(/^\^|\/?\$$/g, '');
110
+ const viewset = match[2].split('.').pop();
111
+ if (!/View(Set)?$/.test(viewset))
112
+ continue;
113
+ const line = safe.slice(0, match.index).split('\n').length;
114
+ const routeNode = {
115
+ id: `route:${filePath}:${line}:VIEWSET:${prefix}`,
116
+ kind: 'route',
117
+ name: `VIEWSET /${prefix}`,
118
+ qualifiedName: `${filePath}::route:${prefix}`,
119
+ filePath, startLine: line, endLine: line, startColumn: 0, endColumn: match[0].length,
120
+ language: 'python', updatedAt: now,
121
+ };
122
+ nodes.push(routeNode);
123
+ references.push({
124
+ fromNodeId: routeNode.id,
125
+ referenceName: viewset,
126
+ referenceKind: 'references',
127
+ line, column: 0, filePath, language: 'python',
128
+ });
129
+ }
86
130
  return { nodes, references };
87
131
  },
88
132
  };
133
+ /**
134
+ * Find ModelIterable.__iter__ — the default iterable QuerySet invokes via
135
+ * `self._iterable_class(self)`. Its __iter__ statically calls the SQL compiler,
136
+ * so linking the dynamic dispatch here closes the QuerySet→SQL call chain.
137
+ * (Over-approximates to the default iterable; .values()/.values_list() swap in
138
+ * other BaseIterable subclasses, but ModelIterable is the canonical path.)
139
+ */
140
+ function resolveModelIterableIter(context) {
141
+ const cls = context.getNodesByName('ModelIterable').find((n) => n.kind === 'class');
142
+ if (!cls)
143
+ return null;
144
+ const iter = context.getNodesByName('__iter__').find((n) => n.filePath === cls.filePath && n.startLine >= cls.startLine && n.startLine <= cls.endLine);
145
+ return iter ? iter.id : null;
146
+ }
89
147
  /**
90
148
  * Parse a Django URL handler expression and return the symbol/module to link.
91
149
  * Returns null for shapes we can't confidently link (e.g. lambdas).
@@ -111,15 +169,21 @@ exports.flaskResolver = {
111
169
  name: 'flask',
112
170
  languages: ['python'],
113
171
  detect(context) {
114
- const requirements = context.readFile('requirements.txt');
115
- if (requirements && /\bflask\b/i.test(requirements))
116
- return true;
117
- const pyproject = context.readFile('pyproject.toml');
118
- if (pyproject && /\bflask\b/i.test(pyproject))
119
- return true;
120
- for (const file of ['app.py', 'application.py', 'main.py', '__init__.py']) {
121
- const content = context.readFile(file);
122
- if (content && content.includes('Flask(__name__)'))
172
+ for (const f of ['requirements.txt', 'pyproject.toml', 'Pipfile', 'setup.py']) {
173
+ const c = context.readFile(f);
174
+ if (c && /\bflask\b/i.test(c))
175
+ return true;
176
+ }
177
+ // Any app entrypoint (root OR subdir, e.g. conduit/app.py) that imports flask
178
+ // and instantiates Flask(...) covers Flask(__name__), Flask(__name__.split…),
179
+ // and the app-factory pattern. Bounded to entrypoint-named files.
180
+ const entrypoints = context
181
+ .getAllFiles()
182
+ .filter((f) => /(?:^|\/)(app|application|main|wsgi|__init__)\.py$/.test(f))
183
+ .slice(0, 50);
184
+ for (const f of entrypoints) {
185
+ const c = context.readFile(f);
186
+ if (c && /\bFlask\s*\(/.test(c) && /\bimport\s+flask\b|\bfrom\s+flask\b/.test(c))
123
187
  return true;
124
188
  }
125
189
  return false;
@@ -135,15 +199,23 @@ exports.flaskResolver = {
135
199
  extract(filePath, content) {
136
200
  if (!filePath.endsWith('.py'))
137
201
  return { nodes: [], references: [] };
138
- return extractDecoratorRoutes(filePath, (0, strip_comments_1.stripCommentsForRegex)(content, 'python'), {
139
- // Flask: @x.route('/path', methods=[...])
140
- decoratorRegex: /@(\w+)\.route\s*\(\s*['"]([^'"]+)['"](?:\s*,\s*methods\s*=\s*\[([^\]]+)\])?\s*\)\s*\n\s*(?:async\s+)?def\s+(\w+)/g,
202
+ const safe = (0, strip_comments_1.stripCommentsForRegex)(content, 'python');
203
+ const decorator = extractDecoratorRoutes(filePath, safe, {
204
+ // Flask: @x.route('/path', methods=[...] | (...)) — the handler is the next
205
+ // `def`, allowing intervening decorators (@login_required) and stacked
206
+ // @x.route() lines. methods may be a list OR a tuple (methods=('GET',)).
207
+ decoratorRegex: /@(\w+)\.route\s*\(\s*['"]([^'"]*)['"](?:\s*,\s*methods\s*=\s*[[(]([^\])]+)[\])])?\s*\)/g,
141
208
  defaultMethod: 'GET',
142
209
  methodFromGroup: 3,
143
210
  pathGroup: 2,
144
- handlerGroup: 4,
211
+ findHandler: true,
145
212
  language: 'python',
146
213
  });
214
+ const restful = extractFlaskRestful(filePath, safe);
215
+ return {
216
+ nodes: [...decorator.nodes, ...restful.nodes],
217
+ references: [...decorator.references, ...restful.references],
218
+ };
147
219
  },
148
220
  };
149
221
  exports.fastapiResolver = {
@@ -180,8 +252,9 @@ exports.fastapiResolver = {
180
252
  if (!filePath.endsWith('.py'))
181
253
  return { nodes: [], references: [] };
182
254
  return extractDecoratorRoutes(filePath, (0, strip_comments_1.stripCommentsForRegex)(content, 'python'), {
183
- // FastAPI: @x.METHOD('/path') -> handler on the next def line
184
- decoratorRegex: /@(\w+)\.(get|post|put|patch|delete|options|head)\s*\(\s*['"]([^'"]+)['"]/g,
255
+ // FastAPI: @x.METHOD('/path') -> handler on the next def line. Path may be
256
+ // empty ("") for routes mounted at the router/prefix root.
257
+ decoratorRegex: /@(\w+)\.(get|post|put|patch|delete|options|head)\s*\(\s*['"]([^'"]*)['"]/g,
185
258
  defaultMethod: '',
186
259
  methodGroup: 2,
187
260
  pathGroup: 3,
@@ -207,7 +280,7 @@ function extractDecoratorRoutes(filePath, content, opts) {
207
280
  method = m[1].toUpperCase();
208
281
  }
209
282
  const line = content.slice(0, match.index).split('\n').length;
210
- const name = method ? `${method} ${routePath}` : routePath;
283
+ const name = method ? `${method} ${routePath || '/'}` : (routePath || '/');
211
284
  const routeNode = {
212
285
  id: `route:${filePath}:${line}:${method}:${routePath}`,
213
286
  kind: 'route',
@@ -246,6 +319,51 @@ function extractDecoratorRoutes(filePath, content, opts) {
246
319
  }
247
320
  return { nodes, references };
248
321
  }
322
+ /**
323
+ * Flask-RESTful: `api.add_resource(ResourceClass, '/path'[, '/path2'])`
324
+ * (and variants like redash's `add_org_resource`). The ResourceClass holds the
325
+ * HTTP-verb methods (get/post/…), so the route references the class — its verb
326
+ * methods resolve as the handlers via the class. Method is ANY (the class
327
+ * decides which verbs it serves).
328
+ */
329
+ function extractFlaskRestful(filePath, safe) {
330
+ const nodes = [];
331
+ const references = [];
332
+ const now = Date.now();
333
+ const re = /\.add\w*[Rr]esource\s*\(\s*(\w+)\s*,\s*((?:['"][^'"]+['"]\s*,?\s*)+)/g;
334
+ let m;
335
+ while ((m = re.exec(safe)) !== null) {
336
+ const className = m[1];
337
+ const paths = (m[2].match(/['"]([^'"]+)['"]/g) || []).map((s) => s.slice(1, -1));
338
+ const line = safe.slice(0, m.index).split('\n').length;
339
+ for (const routePath of paths) {
340
+ const routeNode = {
341
+ id: `route:${filePath}:${line}:ANY:${routePath}`,
342
+ kind: 'route',
343
+ name: `ANY ${routePath}`,
344
+ qualifiedName: `${filePath}::ANY:${routePath}`,
345
+ filePath,
346
+ startLine: line,
347
+ endLine: line,
348
+ startColumn: 0,
349
+ endColumn: 0,
350
+ language: 'python',
351
+ updatedAt: now,
352
+ };
353
+ nodes.push(routeNode);
354
+ references.push({
355
+ fromNodeId: routeNode.id,
356
+ referenceName: className,
357
+ referenceKind: 'references',
358
+ line,
359
+ column: 0,
360
+ filePath,
361
+ language: 'python',
362
+ });
363
+ }
364
+ }
365
+ return { nodes, references };
366
+ }
249
367
  // Directory patterns
250
368
  const MODEL_DIRS = ['models', 'app/models', 'src/models'];
251
369
  const VIEW_DIRS = ['views', 'app/views', 'src/views', 'api/views'];