@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.
- package/bin/codegraph +2 -1
- package/lib/dist/bin/codegraph.d.ts +4 -0
- package/lib/dist/bin/codegraph.d.ts.map +1 -1
- package/lib/dist/bin/codegraph.js +278 -0
- package/lib/dist/bin/codegraph.js.map +1 -1
- package/lib/dist/context/index.d.ts +13 -0
- package/lib/dist/context/index.d.ts.map +1 -1
- package/lib/dist/context/index.js +120 -1
- package/lib/dist/context/index.js.map +1 -1
- package/lib/dist/db/index.d.ts +18 -0
- package/lib/dist/db/index.d.ts.map +1 -1
- package/lib/dist/db/index.js +31 -0
- package/lib/dist/db/index.js.map +1 -1
- package/lib/dist/db/queries.d.ts +16 -0
- package/lib/dist/db/queries.d.ts.map +1 -1
- package/lib/dist/db/queries.js +80 -27
- package/lib/dist/db/queries.js.map +1 -1
- package/lib/dist/extraction/grammars.d.ts +6 -0
- package/lib/dist/extraction/grammars.d.ts.map +1 -1
- package/lib/dist/extraction/grammars.js +17 -0
- package/lib/dist/extraction/grammars.js.map +1 -1
- package/lib/dist/extraction/tree-sitter.d.ts.map +1 -1
- package/lib/dist/extraction/tree-sitter.js +73 -4
- package/lib/dist/extraction/tree-sitter.js.map +1 -1
- package/lib/dist/extraction/wasm-runtime-flags.d.ts +38 -0
- package/lib/dist/extraction/wasm-runtime-flags.d.ts.map +1 -0
- package/lib/dist/extraction/wasm-runtime-flags.js +105 -0
- package/lib/dist/extraction/wasm-runtime-flags.js.map +1 -0
- package/lib/dist/graph/traversal.d.ts.map +1 -1
- package/lib/dist/graph/traversal.js +71 -36
- package/lib/dist/graph/traversal.js.map +1 -1
- package/lib/dist/index.d.ts.map +1 -1
- package/lib/dist/index.js +9 -0
- package/lib/dist/index.js.map +1 -1
- package/lib/dist/installer/index.d.ts +52 -1
- package/lib/dist/installer/index.d.ts.map +1 -1
- package/lib/dist/installer/index.js +121 -0
- package/lib/dist/installer/index.js.map +1 -1
- package/lib/dist/installer/instructions-template.d.ts +2 -2
- package/lib/dist/installer/instructions-template.d.ts.map +1 -1
- package/lib/dist/installer/instructions-template.js +2 -1
- package/lib/dist/installer/instructions-template.js.map +1 -1
- package/lib/dist/installer/targets/cursor.d.ts.map +1 -1
- package/lib/dist/installer/targets/cursor.js +57 -3
- package/lib/dist/installer/targets/cursor.js.map +1 -1
- package/lib/dist/mcp/index.d.ts +4 -0
- package/lib/dist/mcp/index.d.ts.map +1 -1
- package/lib/dist/mcp/index.js +97 -0
- package/lib/dist/mcp/index.js.map +1 -1
- package/lib/dist/mcp/server-instructions.d.ts +1 -1
- package/lib/dist/mcp/server-instructions.d.ts.map +1 -1
- package/lib/dist/mcp/server-instructions.js +2 -0
- package/lib/dist/mcp/server-instructions.js.map +1 -1
- package/lib/dist/mcp/tools.d.ts +81 -2
- package/lib/dist/mcp/tools.d.ts.map +1 -1
- package/lib/dist/mcp/tools.js +664 -24
- package/lib/dist/mcp/tools.js.map +1 -1
- package/lib/dist/resolution/callback-synthesizer.d.ts +9 -0
- package/lib/dist/resolution/callback-synthesizer.d.ts.map +1 -0
- package/lib/dist/resolution/callback-synthesizer.js +576 -0
- package/lib/dist/resolution/callback-synthesizer.js.map +1 -0
- package/lib/dist/resolution/frameworks/csharp.d.ts.map +1 -1
- package/lib/dist/resolution/frameworks/csharp.js +36 -8
- package/lib/dist/resolution/frameworks/csharp.js.map +1 -1
- package/lib/dist/resolution/frameworks/drupal.d.ts.map +1 -1
- package/lib/dist/resolution/frameworks/drupal.js +44 -12
- package/lib/dist/resolution/frameworks/drupal.js.map +1 -1
- package/lib/dist/resolution/frameworks/express.d.ts.map +1 -1
- package/lib/dist/resolution/frameworks/express.js +102 -19
- package/lib/dist/resolution/frameworks/express.js.map +1 -1
- package/lib/dist/resolution/frameworks/go.d.ts.map +1 -1
- package/lib/dist/resolution/frameworks/go.js +6 -3
- package/lib/dist/resolution/frameworks/go.js.map +1 -1
- package/lib/dist/resolution/frameworks/index.d.ts +1 -0
- package/lib/dist/resolution/frameworks/index.d.ts.map +1 -1
- package/lib/dist/resolution/frameworks/index.js +5 -1
- package/lib/dist/resolution/frameworks/index.js.map +1 -1
- package/lib/dist/resolution/frameworks/java.d.ts.map +1 -1
- package/lib/dist/resolution/frameworks/java.js +70 -12
- package/lib/dist/resolution/frameworks/java.js.map +1 -1
- package/lib/dist/resolution/frameworks/laravel.d.ts.map +1 -1
- package/lib/dist/resolution/frameworks/laravel.js +17 -8
- package/lib/dist/resolution/frameworks/laravel.js.map +1 -1
- package/lib/dist/resolution/frameworks/play.d.ts +19 -0
- package/lib/dist/resolution/frameworks/play.d.ts.map +1 -0
- package/lib/dist/resolution/frameworks/play.js +111 -0
- package/lib/dist/resolution/frameworks/play.js.map +1 -0
- package/lib/dist/resolution/frameworks/python.d.ts.map +1 -1
- package/lib/dist/resolution/frameworks/python.js +134 -16
- package/lib/dist/resolution/frameworks/python.js.map +1 -1
- package/lib/dist/resolution/frameworks/react.d.ts.map +1 -1
- package/lib/dist/resolution/frameworks/react.js +96 -3
- package/lib/dist/resolution/frameworks/react.js.map +1 -1
- package/lib/dist/resolution/frameworks/ruby.d.ts.map +1 -1
- package/lib/dist/resolution/frameworks/ruby.js +106 -2
- package/lib/dist/resolution/frameworks/ruby.js.map +1 -1
- package/lib/dist/resolution/frameworks/rust.d.ts.map +1 -1
- package/lib/dist/resolution/frameworks/rust.js +102 -5
- package/lib/dist/resolution/frameworks/rust.js.map +1 -1
- package/lib/dist/resolution/frameworks/swift.d.ts.map +1 -1
- package/lib/dist/resolution/frameworks/swift.js +30 -6
- package/lib/dist/resolution/frameworks/swift.js.map +1 -1
- package/lib/dist/resolution/index.d.ts.map +1 -1
- package/lib/dist/resolution/index.js +61 -9
- package/lib/dist/resolution/index.js.map +1 -1
- package/lib/dist/resolution/lru-cache.d.ts +24 -0
- package/lib/dist/resolution/lru-cache.d.ts.map +1 -0
- package/lib/dist/resolution/lru-cache.js +62 -0
- package/lib/dist/resolution/lru-cache.js.map +1 -0
- package/lib/dist/resolution/types.d.ts +8 -0
- package/lib/dist/resolution/types.d.ts.map +1 -1
- package/lib/dist/utils.js +1 -1
- package/lib/node_modules/.package-lock.json +1 -1
- package/lib/package.json +1 -1
- 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
|
-
|
|
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
|
-
// @
|
|
114
|
-
|
|
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
|
|
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:
|
|
146
|
+
language: lang,
|
|
131
147
|
updatedAt: now,
|
|
132
148
|
};
|
|
133
149
|
nodes.push(routeNode);
|
|
134
|
-
//
|
|
135
|
-
|
|
136
|
-
const
|
|
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:
|
|
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":";AAAA;;;;GAIG;;;AAIH,sDAA0D;AAE7C,QAAA,cAAc,GAAsB;IAC/C,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE,CAAC,MAAM,CAAC;
|
|
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,
|
|
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
|
-
|
|
175
|
-
|
|
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
|
-
//
|
|
183
|
-
const classMatch = trimmed.match(/^([A-Za-z_][
|
|
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,
|
|
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
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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'];
|