@saluzi/codegraph 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/codegraph.d.ts +25 -0
- package/dist/bin/node-version-check.d.ts +37 -0
- package/dist/bin/uninstall.d.ts +14 -0
- package/dist/context/formatter.d.ts +33 -0
- package/dist/context/formatter.js +244 -0
- package/dist/context/index.d.ts +117 -0
- package/dist/context/index.js +1050 -0
- package/dist/db/index.d.ts +101 -0
- package/dist/db/index.js +250 -0
- package/dist/db/migrations.d.ts +47 -0
- package/dist/db/migrations.js +131 -0
- package/dist/db/queries.d.ts +291 -0
- package/dist/db/queries.js +1349 -0
- package/dist/db/schema.sql +151 -0
- package/dist/db/sqlite-adapter.d.ts +49 -0
- package/dist/db/sqlite-adapter.js +141 -0
- package/dist/directory.d.ts +62 -0
- package/dist/directory.js +264 -0
- package/dist/errors.d.ts +149 -0
- package/dist/errors.js +219 -0
- package/dist/extraction/dfm-extractor.d.ts +31 -0
- package/dist/extraction/dfm-extractor.js +151 -0
- package/dist/extraction/grammars.d.ts +94 -0
- package/dist/extraction/grammars.js +357 -0
- package/dist/extraction/index.d.ts +148 -0
- package/dist/extraction/index.js +1286 -0
- package/dist/extraction/languages/c-cpp.d.ts +4 -0
- package/dist/extraction/languages/c-cpp.js +126 -0
- package/dist/extraction/languages/csharp.d.ts +3 -0
- package/dist/extraction/languages/csharp.js +72 -0
- package/dist/extraction/languages/dart.d.ts +3 -0
- package/dist/extraction/languages/dart.js +192 -0
- package/dist/extraction/languages/go.d.ts +3 -0
- package/dist/extraction/languages/go.js +58 -0
- package/dist/extraction/languages/index.d.ts +10 -0
- package/dist/extraction/languages/index.js +49 -0
- package/dist/extraction/languages/java.d.ts +3 -0
- package/dist/extraction/languages/java.js +64 -0
- package/dist/extraction/languages/javascript.d.ts +3 -0
- package/dist/extraction/languages/javascript.js +90 -0
- package/dist/extraction/languages/kotlin.d.ts +3 -0
- package/dist/extraction/languages/kotlin.js +253 -0
- package/dist/extraction/languages/lua.d.ts +3 -0
- package/dist/extraction/languages/lua.js +150 -0
- package/dist/extraction/languages/luau.d.ts +3 -0
- package/dist/extraction/languages/luau.js +37 -0
- package/dist/extraction/languages/pascal.d.ts +3 -0
- package/dist/extraction/languages/pascal.js +66 -0
- package/dist/extraction/languages/php.d.ts +3 -0
- package/dist/extraction/languages/php.js +107 -0
- package/dist/extraction/languages/python.d.ts +3 -0
- package/dist/extraction/languages/python.js +56 -0
- package/dist/extraction/languages/ruby.d.ts +3 -0
- package/dist/extraction/languages/ruby.js +114 -0
- package/dist/extraction/languages/rust.d.ts +3 -0
- package/dist/extraction/languages/rust.js +109 -0
- package/dist/extraction/languages/scala.d.ts +3 -0
- package/dist/extraction/languages/scala.js +139 -0
- package/dist/extraction/languages/swift.d.ts +3 -0
- package/dist/extraction/languages/swift.js +91 -0
- package/dist/extraction/languages/typescript.d.ts +3 -0
- package/dist/extraction/languages/typescript.js +129 -0
- package/dist/extraction/liquid-extractor.d.ts +52 -0
- package/dist/extraction/liquid-extractor.js +313 -0
- package/dist/extraction/parse-worker.d.ts +8 -0
- package/dist/extraction/parse-worker.js +94 -0
- package/dist/extraction/svelte-extractor.d.ts +56 -0
- package/dist/extraction/svelte-extractor.js +272 -0
- package/dist/extraction/tree-sitter-helpers.d.ts +39 -0
- package/dist/extraction/tree-sitter-helpers.js +103 -0
- package/dist/extraction/tree-sitter-types.d.ts +191 -0
- package/dist/extraction/tree-sitter-types.js +10 -0
- package/dist/extraction/tree-sitter.d.ts +238 -0
- package/dist/extraction/tree-sitter.js +2430 -0
- package/dist/extraction/vue-extractor.d.ts +36 -0
- package/dist/extraction/vue-extractor.js +163 -0
- package/dist/extraction/wasm/tree-sitter-c.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-c_sharp.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cpp.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-dart.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-go.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-java.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-javascript.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-kotlin.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-lua.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-luau.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-php.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-python.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-ruby.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-rust.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-scala.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-swift.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-tsx.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-typescript.wasm +0 -0
- package/dist/extraction/wasm-runtime-flags.d.ts +46 -0
- package/dist/extraction/wasm-runtime-flags.js +105 -0
- package/dist/graph/index.d.ts +8 -0
- package/dist/graph/index.js +13 -0
- package/dist/graph/queries.d.ts +109 -0
- package/dist/graph/queries.js +366 -0
- package/dist/graph/traversal.d.ts +137 -0
- package/dist/graph/traversal.js +528 -0
- package/dist/index.d.ts +509 -0
- package/dist/index.js +800 -0
- package/dist/installer/claude-md-template.d.ts +19 -0
- package/dist/installer/config-writer.d.ts +29 -0
- package/dist/installer/index.d.ts +140 -0
- package/dist/installer/instructions-template.d.ts +30 -0
- package/dist/installer/targets/claude.d.ts +55 -0
- package/dist/installer/targets/codex.d.ts +18 -0
- package/dist/installer/targets/cursor.d.ts +35 -0
- package/dist/installer/targets/hermes.d.ts +18 -0
- package/dist/installer/targets/opencode.d.ts +30 -0
- package/dist/installer/targets/registry.d.ts +38 -0
- package/dist/installer/targets/shared.d.ts +92 -0
- package/dist/installer/targets/toml.d.ts +64 -0
- package/dist/installer/targets/types.d.ts +122 -0
- package/dist/mcp/index.d.ts +98 -0
- package/dist/mcp/server-instructions.d.ts +20 -0
- package/dist/mcp/tools.d.ts +269 -0
- package/dist/mcp/transport.d.ts +117 -0
- package/dist/resolution/frameworks/cargo-workspace.d.ts +20 -0
- package/dist/resolution/frameworks/cargo-workspace.js +225 -0
- package/dist/resolution/frameworks/csharp.d.ts +8 -0
- package/dist/resolution/frameworks/csharp.js +213 -0
- package/dist/resolution/frameworks/drupal.d.ts +51 -0
- package/dist/resolution/frameworks/drupal.js +335 -0
- package/dist/resolution/frameworks/express.d.ts +8 -0
- package/dist/resolution/frameworks/express.js +225 -0
- package/dist/resolution/frameworks/go.d.ts +8 -0
- package/dist/resolution/frameworks/go.js +158 -0
- package/dist/resolution/frameworks/index.d.ts +52 -0
- package/dist/resolution/frameworks/index.js +137 -0
- package/dist/resolution/frameworks/java.d.ts +8 -0
- package/dist/resolution/frameworks/java.js +177 -0
- package/dist/resolution/frameworks/laravel.d.ts +13 -0
- package/dist/resolution/frameworks/laravel.js +248 -0
- package/dist/resolution/frameworks/nestjs.d.ts +26 -0
- package/dist/resolution/frameworks/nestjs.js +374 -0
- package/dist/resolution/frameworks/python.d.ts +10 -0
- package/dist/resolution/frameworks/python.js +278 -0
- package/dist/resolution/frameworks/react.d.ts +8 -0
- package/dist/resolution/frameworks/react.js +272 -0
- package/dist/resolution/frameworks/ruby.d.ts +8 -0
- package/dist/resolution/frameworks/ruby.js +198 -0
- package/dist/resolution/frameworks/rust.d.ts +8 -0
- package/dist/resolution/frameworks/rust.js +207 -0
- package/dist/resolution/frameworks/svelte.d.ts +9 -0
- package/dist/resolution/frameworks/svelte.js +249 -0
- package/dist/resolution/frameworks/swift.d.ts +10 -0
- package/dist/resolution/frameworks/swift.js +376 -0
- package/dist/resolution/frameworks/vue.d.ts +9 -0
- package/dist/resolution/frameworks/vue.js +306 -0
- package/dist/resolution/import-resolver.d.ts +61 -0
- package/dist/resolution/import-resolver.js +663 -0
- package/dist/resolution/index.d.ts +118 -0
- package/dist/resolution/index.js +744 -0
- package/dist/resolution/lru-cache.d.ts +24 -0
- package/dist/resolution/lru-cache.js +62 -0
- package/dist/resolution/name-matcher.d.ts +50 -0
- package/dist/resolution/name-matcher.js +384 -0
- package/dist/resolution/path-aliases.d.ts +72 -0
- package/dist/resolution/path-aliases.js +238 -0
- package/dist/resolution/strip-comments.d.ts +40 -0
- package/dist/resolution/strip-comments.js +441 -0
- package/dist/resolution/types.d.ts +181 -0
- package/dist/resolution/types.js +8 -0
- package/dist/search/query-parser.d.ts +61 -0
- package/dist/search/query-parser.js +177 -0
- package/dist/search/query-utils.d.ts +59 -0
- package/dist/search/query-utils.js +383 -0
- package/dist/sync/git-hooks.d.ts +54 -0
- package/dist/sync/git-hooks.js +223 -0
- package/dist/sync/index.d.ts +25 -0
- package/dist/sync/index.js +28 -0
- package/dist/sync/watch-policy.d.ts +51 -0
- package/dist/sync/watch-policy.js +124 -0
- package/dist/sync/watcher.d.ts +83 -0
- package/dist/sync/watcher.js +192 -0
- package/dist/types.d.ts +433 -0
- package/dist/types.js +75 -0
- package/dist/ui/glyphs.d.ts +42 -0
- package/dist/ui/shimmer-progress.d.ts +11 -0
- package/dist/ui/shimmer-worker.d.ts +2 -0
- package/dist/ui/types.d.ts +20 -0
- package/dist/utils.d.ts +231 -0
- package/dist/utils.js +549 -0
- package/package.json +24 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Go Framework Resolver
|
|
4
|
+
*
|
|
5
|
+
* Handles Gin, Echo, Fiber, Chi, and standard library patterns.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.goResolver = void 0;
|
|
9
|
+
const strip_comments_1 = require("../strip-comments");
|
|
10
|
+
exports.goResolver = {
|
|
11
|
+
name: 'go',
|
|
12
|
+
languages: ['go'],
|
|
13
|
+
detect(context) {
|
|
14
|
+
// Check for go.mod file (Go modules)
|
|
15
|
+
const goMod = context.readFile('go.mod');
|
|
16
|
+
if (goMod) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
// Check for .go files
|
|
20
|
+
const allFiles = context.getAllFiles();
|
|
21
|
+
return allFiles.some((f) => f.endsWith('.go'));
|
|
22
|
+
},
|
|
23
|
+
resolve(ref, context) {
|
|
24
|
+
// Pattern 1: Handler references
|
|
25
|
+
if (ref.referenceName.endsWith('Handler') || ref.referenceName.startsWith('Handle')) {
|
|
26
|
+
const result = resolveByNameAndKind(ref.referenceName, 'function', HANDLER_DIRS, context);
|
|
27
|
+
if (result) {
|
|
28
|
+
return {
|
|
29
|
+
original: ref,
|
|
30
|
+
targetNodeId: result,
|
|
31
|
+
confidence: 0.8,
|
|
32
|
+
resolvedBy: 'framework',
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Pattern 2: Service/Repository references
|
|
37
|
+
if (ref.referenceName.endsWith('Service') || ref.referenceName.endsWith('Repository') || ref.referenceName.endsWith('Store')) {
|
|
38
|
+
const result = resolveByNameAndKind(ref.referenceName, null, SERVICE_DIRS, context, SERVICE_KINDS);
|
|
39
|
+
if (result) {
|
|
40
|
+
return {
|
|
41
|
+
original: ref,
|
|
42
|
+
targetNodeId: result,
|
|
43
|
+
confidence: 0.8,
|
|
44
|
+
resolvedBy: 'framework',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Pattern 3: Middleware references
|
|
49
|
+
if (ref.referenceName.endsWith('Middleware') || ref.referenceName.startsWith('Auth') || ref.referenceName.startsWith('Log')) {
|
|
50
|
+
const result = resolveByNameAndKind(ref.referenceName, 'function', MIDDLEWARE_DIRS, context);
|
|
51
|
+
if (result) {
|
|
52
|
+
return {
|
|
53
|
+
original: ref,
|
|
54
|
+
targetNodeId: result,
|
|
55
|
+
confidence: 0.75,
|
|
56
|
+
resolvedBy: 'framework',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Pattern 4: Model/Entity references (typically PascalCase structs)
|
|
61
|
+
if (/^[A-Z][a-zA-Z]+$/.test(ref.referenceName)) {
|
|
62
|
+
const result = resolveByNameAndKind(ref.referenceName, 'struct', MODEL_DIRS, context);
|
|
63
|
+
if (result) {
|
|
64
|
+
return {
|
|
65
|
+
original: ref,
|
|
66
|
+
targetNodeId: result,
|
|
67
|
+
confidence: 0.7,
|
|
68
|
+
resolvedBy: 'framework',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
},
|
|
74
|
+
extract(filePath, content) {
|
|
75
|
+
if (!filePath.endsWith('.go'))
|
|
76
|
+
return { nodes: [], references: [] };
|
|
77
|
+
const nodes = [];
|
|
78
|
+
const references = [];
|
|
79
|
+
const now = Date.now();
|
|
80
|
+
const safe = (0, strip_comments_1.stripCommentsForRegex)(content, 'go');
|
|
81
|
+
// (router|r|mux|app).METHOD("/path", handler)
|
|
82
|
+
// Handles Gin (GET/POST/...), Chi (Get/Post/...), net/http (HandleFunc/Handle).
|
|
83
|
+
const routeRegex = /\b(?:router|r|mux|app|e)\.(GET|POST|PUT|PATCH|DELETE|OPTIONS|HEAD|Get|Post|Put|Patch|Delete|Handle|HandleFunc)\s*\(\s*"([^"]+)"\s*,\s*([^)]+)\)/g;
|
|
84
|
+
let match;
|
|
85
|
+
while ((match = routeRegex.exec(safe)) !== null) {
|
|
86
|
+
const [, rawMethod, routePath, handlerExpr] = match;
|
|
87
|
+
const line = safe.slice(0, match.index).split('\n').length;
|
|
88
|
+
const method = rawMethod === 'Handle' || rawMethod === 'HandleFunc'
|
|
89
|
+
? 'ANY'
|
|
90
|
+
: rawMethod.toUpperCase();
|
|
91
|
+
const routeNode = {
|
|
92
|
+
id: `route:${filePath}:${line}:${method}:${routePath}`,
|
|
93
|
+
kind: 'route',
|
|
94
|
+
name: `${method} ${routePath}`,
|
|
95
|
+
qualifiedName: `${filePath}::route:${routePath}`,
|
|
96
|
+
filePath,
|
|
97
|
+
startLine: line,
|
|
98
|
+
endLine: line,
|
|
99
|
+
startColumn: 0,
|
|
100
|
+
endColumn: match[0].length,
|
|
101
|
+
language: 'go',
|
|
102
|
+
updatedAt: now,
|
|
103
|
+
};
|
|
104
|
+
nodes.push(routeNode);
|
|
105
|
+
const handlerName = extractGoTailIdent(handlerExpr);
|
|
106
|
+
if (handlerName) {
|
|
107
|
+
references.push({
|
|
108
|
+
fromNodeId: routeNode.id,
|
|
109
|
+
referenceName: handlerName,
|
|
110
|
+
referenceKind: 'references',
|
|
111
|
+
line,
|
|
112
|
+
column: 0,
|
|
113
|
+
filePath,
|
|
114
|
+
language: 'go',
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { nodes, references };
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
/** Extract the last identifier from an expression like `pkg.Sub.handler` or `handler`. */
|
|
122
|
+
function extractGoTailIdent(expr) {
|
|
123
|
+
const cleaned = expr.trim().replace(/\s+/g, '').replace(/\(\)$/, '');
|
|
124
|
+
const m = cleaned.match(/(?:\.|^)([A-Za-z_][A-Za-z0-9_]*)$/);
|
|
125
|
+
return m ? m[1] : null;
|
|
126
|
+
}
|
|
127
|
+
// Directory patterns for framework resolution
|
|
128
|
+
const HANDLER_DIRS = ['handler', 'handlers', 'api', 'routes', 'controller', 'controllers'];
|
|
129
|
+
const SERVICE_DIRS = ['service', 'services', 'repository', 'store', 'pkg'];
|
|
130
|
+
const MIDDLEWARE_DIRS = ['middleware', 'middlewares'];
|
|
131
|
+
const MODEL_DIRS = ['model', 'models', 'entity', 'entities', 'domain', 'pkg'];
|
|
132
|
+
const SERVICE_KINDS = new Set(['struct', 'interface']);
|
|
133
|
+
/**
|
|
134
|
+
* Resolve a symbol by name using indexed queries instead of scanning all files.
|
|
135
|
+
* Uses getNodesByName (O(log n) indexed lookup) instead of iterating every file.
|
|
136
|
+
*/
|
|
137
|
+
function resolveByNameAndKind(name, kind, preferredDirs, context, kinds) {
|
|
138
|
+
const candidates = context.getNodesByName(name);
|
|
139
|
+
if (candidates.length === 0)
|
|
140
|
+
return null;
|
|
141
|
+
// Filter by kind
|
|
142
|
+
const kindFiltered = candidates.filter((n) => {
|
|
143
|
+
if (kinds)
|
|
144
|
+
return kinds.has(n.kind);
|
|
145
|
+
if (kind)
|
|
146
|
+
return n.kind === kind;
|
|
147
|
+
return true;
|
|
148
|
+
});
|
|
149
|
+
if (kindFiltered.length === 0)
|
|
150
|
+
return null;
|
|
151
|
+
// Prefer candidates in framework-conventional directories
|
|
152
|
+
const preferred = kindFiltered.filter((n) => preferredDirs.some((d) => n.filePath.includes(`/${d}/`)));
|
|
153
|
+
if (preferred.length > 0)
|
|
154
|
+
return preferred[0].id;
|
|
155
|
+
// Fall back to any match
|
|
156
|
+
return kindFiltered[0].id;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=go.js.map
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework Resolver Registry
|
|
3
|
+
*
|
|
4
|
+
* Manages framework-specific resolvers.
|
|
5
|
+
*/
|
|
6
|
+
import { FrameworkResolver, ResolutionContext } from '../types'
|
|
7
|
+
import type { Language } from '../../types'
|
|
8
|
+
/**
|
|
9
|
+
* Get all framework resolvers
|
|
10
|
+
*/
|
|
11
|
+
export declare function getAllFrameworkResolvers(): FrameworkResolver[]
|
|
12
|
+
/**
|
|
13
|
+
* Get a resolver by name
|
|
14
|
+
*/
|
|
15
|
+
export declare function getFrameworkResolver(
|
|
16
|
+
name: string,
|
|
17
|
+
): FrameworkResolver | undefined
|
|
18
|
+
/**
|
|
19
|
+
* Detect which frameworks are used in a project
|
|
20
|
+
*/
|
|
21
|
+
export declare function detectFrameworks(
|
|
22
|
+
context: ResolutionContext,
|
|
23
|
+
): FrameworkResolver[]
|
|
24
|
+
/**
|
|
25
|
+
* Filter a list of detected frameworks down to ones that apply to a given language.
|
|
26
|
+
* Frameworks without an explicit `languages` list are treated as universal.
|
|
27
|
+
*/
|
|
28
|
+
export declare function getApplicableFrameworks(
|
|
29
|
+
detected: FrameworkResolver[],
|
|
30
|
+
language: Language,
|
|
31
|
+
): FrameworkResolver[]
|
|
32
|
+
/**
|
|
33
|
+
* Register a custom framework resolver
|
|
34
|
+
*/
|
|
35
|
+
export declare function registerFrameworkResolver(
|
|
36
|
+
resolver: FrameworkResolver,
|
|
37
|
+
): void
|
|
38
|
+
export { drupalResolver } from './drupal'
|
|
39
|
+
export { laravelResolver, FACADE_MAPPINGS } from './laravel'
|
|
40
|
+
export { expressResolver } from './express'
|
|
41
|
+
export { nestjsResolver } from './nestjs'
|
|
42
|
+
export { reactResolver } from './react'
|
|
43
|
+
export { svelteResolver } from './svelte'
|
|
44
|
+
export { vueResolver } from './vue'
|
|
45
|
+
export { djangoResolver, flaskResolver, fastapiResolver } from './python'
|
|
46
|
+
export { railsResolver } from './ruby'
|
|
47
|
+
export { springResolver } from './java'
|
|
48
|
+
export { goResolver } from './go'
|
|
49
|
+
export { rustResolver } from './rust'
|
|
50
|
+
export { aspnetResolver } from './csharp'
|
|
51
|
+
export { swiftUIResolver, uikitResolver, vaporResolver } from './swift'
|
|
52
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Framework Resolver Registry
|
|
4
|
+
*
|
|
5
|
+
* Manages framework-specific resolvers.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.vaporResolver = exports.uikitResolver = exports.swiftUIResolver = exports.aspnetResolver = exports.rustResolver = exports.goResolver = exports.springResolver = exports.railsResolver = exports.fastapiResolver = exports.flaskResolver = exports.djangoResolver = exports.vueResolver = exports.svelteResolver = exports.reactResolver = exports.nestjsResolver = exports.expressResolver = exports.FACADE_MAPPINGS = exports.laravelResolver = exports.drupalResolver = void 0;
|
|
9
|
+
exports.getAllFrameworkResolvers = getAllFrameworkResolvers;
|
|
10
|
+
exports.getFrameworkResolver = getFrameworkResolver;
|
|
11
|
+
exports.detectFrameworks = detectFrameworks;
|
|
12
|
+
exports.getApplicableFrameworks = getApplicableFrameworks;
|
|
13
|
+
exports.registerFrameworkResolver = registerFrameworkResolver;
|
|
14
|
+
const drupal_1 = require("./drupal");
|
|
15
|
+
const laravel_1 = require("./laravel");
|
|
16
|
+
const express_1 = require("./express");
|
|
17
|
+
const nestjs_1 = require("./nestjs");
|
|
18
|
+
const react_1 = require("./react");
|
|
19
|
+
const svelte_1 = require("./svelte");
|
|
20
|
+
const vue_1 = require("./vue");
|
|
21
|
+
const python_1 = require("./python");
|
|
22
|
+
const ruby_1 = require("./ruby");
|
|
23
|
+
const java_1 = require("./java");
|
|
24
|
+
const go_1 = require("./go");
|
|
25
|
+
const rust_1 = require("./rust");
|
|
26
|
+
const csharp_1 = require("./csharp");
|
|
27
|
+
const swift_1 = require("./swift");
|
|
28
|
+
/**
|
|
29
|
+
* All registered framework resolvers
|
|
30
|
+
*/
|
|
31
|
+
const FRAMEWORK_RESOLVERS = [
|
|
32
|
+
// PHP
|
|
33
|
+
laravel_1.laravelResolver,
|
|
34
|
+
drupal_1.drupalResolver,
|
|
35
|
+
// JavaScript/TypeScript
|
|
36
|
+
express_1.expressResolver,
|
|
37
|
+
nestjs_1.nestjsResolver,
|
|
38
|
+
react_1.reactResolver,
|
|
39
|
+
svelte_1.svelteResolver,
|
|
40
|
+
vue_1.vueResolver,
|
|
41
|
+
// Python
|
|
42
|
+
python_1.djangoResolver,
|
|
43
|
+
python_1.flaskResolver,
|
|
44
|
+
python_1.fastapiResolver,
|
|
45
|
+
// Ruby
|
|
46
|
+
ruby_1.railsResolver,
|
|
47
|
+
// Java
|
|
48
|
+
java_1.springResolver,
|
|
49
|
+
// Go
|
|
50
|
+
go_1.goResolver,
|
|
51
|
+
// Rust
|
|
52
|
+
rust_1.rustResolver,
|
|
53
|
+
// C#
|
|
54
|
+
csharp_1.aspnetResolver,
|
|
55
|
+
// Swift
|
|
56
|
+
swift_1.swiftUIResolver,
|
|
57
|
+
swift_1.uikitResolver,
|
|
58
|
+
swift_1.vaporResolver,
|
|
59
|
+
];
|
|
60
|
+
/**
|
|
61
|
+
* Get all framework resolvers
|
|
62
|
+
*/
|
|
63
|
+
function getAllFrameworkResolvers() {
|
|
64
|
+
return FRAMEWORK_RESOLVERS;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get a resolver by name
|
|
68
|
+
*/
|
|
69
|
+
function getFrameworkResolver(name) {
|
|
70
|
+
return FRAMEWORK_RESOLVERS.find((r) => r.name === name);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Detect which frameworks are used in a project
|
|
74
|
+
*/
|
|
75
|
+
function detectFrameworks(context) {
|
|
76
|
+
return FRAMEWORK_RESOLVERS.filter((resolver) => {
|
|
77
|
+
try {
|
|
78
|
+
return resolver.detect(context);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Filter a list of detected frameworks down to ones that apply to a given language.
|
|
87
|
+
* Frameworks without an explicit `languages` list are treated as universal.
|
|
88
|
+
*/
|
|
89
|
+
function getApplicableFrameworks(detected, language) {
|
|
90
|
+
return detected.filter((fw) => !fw.languages || fw.languages.includes(language));
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Register a custom framework resolver
|
|
94
|
+
*/
|
|
95
|
+
function registerFrameworkResolver(resolver) {
|
|
96
|
+
// Remove existing resolver with same name
|
|
97
|
+
const index = FRAMEWORK_RESOLVERS.findIndex((r) => r.name === resolver.name);
|
|
98
|
+
if (index !== -1) {
|
|
99
|
+
FRAMEWORK_RESOLVERS.splice(index, 1);
|
|
100
|
+
}
|
|
101
|
+
FRAMEWORK_RESOLVERS.push(resolver);
|
|
102
|
+
}
|
|
103
|
+
// Re-export framework resolvers
|
|
104
|
+
var drupal_2 = require("./drupal");
|
|
105
|
+
Object.defineProperty(exports, "drupalResolver", { enumerable: true, get: function () { return drupal_2.drupalResolver; } });
|
|
106
|
+
var laravel_2 = require("./laravel");
|
|
107
|
+
Object.defineProperty(exports, "laravelResolver", { enumerable: true, get: function () { return laravel_2.laravelResolver; } });
|
|
108
|
+
Object.defineProperty(exports, "FACADE_MAPPINGS", { enumerable: true, get: function () { return laravel_2.FACADE_MAPPINGS; } });
|
|
109
|
+
var express_2 = require("./express");
|
|
110
|
+
Object.defineProperty(exports, "expressResolver", { enumerable: true, get: function () { return express_2.expressResolver; } });
|
|
111
|
+
var nestjs_2 = require("./nestjs");
|
|
112
|
+
Object.defineProperty(exports, "nestjsResolver", { enumerable: true, get: function () { return nestjs_2.nestjsResolver; } });
|
|
113
|
+
var react_2 = require("./react");
|
|
114
|
+
Object.defineProperty(exports, "reactResolver", { enumerable: true, get: function () { return react_2.reactResolver; } });
|
|
115
|
+
var svelte_2 = require("./svelte");
|
|
116
|
+
Object.defineProperty(exports, "svelteResolver", { enumerable: true, get: function () { return svelte_2.svelteResolver; } });
|
|
117
|
+
var vue_2 = require("./vue");
|
|
118
|
+
Object.defineProperty(exports, "vueResolver", { enumerable: true, get: function () { return vue_2.vueResolver; } });
|
|
119
|
+
var python_2 = require("./python");
|
|
120
|
+
Object.defineProperty(exports, "djangoResolver", { enumerable: true, get: function () { return python_2.djangoResolver; } });
|
|
121
|
+
Object.defineProperty(exports, "flaskResolver", { enumerable: true, get: function () { return python_2.flaskResolver; } });
|
|
122
|
+
Object.defineProperty(exports, "fastapiResolver", { enumerable: true, get: function () { return python_2.fastapiResolver; } });
|
|
123
|
+
var ruby_2 = require("./ruby");
|
|
124
|
+
Object.defineProperty(exports, "railsResolver", { enumerable: true, get: function () { return ruby_2.railsResolver; } });
|
|
125
|
+
var java_2 = require("./java");
|
|
126
|
+
Object.defineProperty(exports, "springResolver", { enumerable: true, get: function () { return java_2.springResolver; } });
|
|
127
|
+
var go_2 = require("./go");
|
|
128
|
+
Object.defineProperty(exports, "goResolver", { enumerable: true, get: function () { return go_2.goResolver; } });
|
|
129
|
+
var rust_2 = require("./rust");
|
|
130
|
+
Object.defineProperty(exports, "rustResolver", { enumerable: true, get: function () { return rust_2.rustResolver; } });
|
|
131
|
+
var csharp_2 = require("./csharp");
|
|
132
|
+
Object.defineProperty(exports, "aspnetResolver", { enumerable: true, get: function () { return csharp_2.aspnetResolver; } });
|
|
133
|
+
var swift_2 = require("./swift");
|
|
134
|
+
Object.defineProperty(exports, "swiftUIResolver", { enumerable: true, get: function () { return swift_2.swiftUIResolver; } });
|
|
135
|
+
Object.defineProperty(exports, "uikitResolver", { enumerable: true, get: function () { return swift_2.uikitResolver; } });
|
|
136
|
+
Object.defineProperty(exports, "vaporResolver", { enumerable: true, get: function () { return swift_2.vaporResolver; } });
|
|
137
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Java Framework Resolver
|
|
4
|
+
*
|
|
5
|
+
* Handles Spring Boot and general Java patterns.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.springResolver = void 0;
|
|
9
|
+
const strip_comments_1 = require("../strip-comments");
|
|
10
|
+
exports.springResolver = {
|
|
11
|
+
name: 'spring',
|
|
12
|
+
languages: ['java'],
|
|
13
|
+
detect(context) {
|
|
14
|
+
// Check for pom.xml with Spring
|
|
15
|
+
const pomXml = context.readFile('pom.xml');
|
|
16
|
+
if (pomXml && (pomXml.includes('spring-boot') || pomXml.includes('springframework'))) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
// Check for build.gradle with Spring
|
|
20
|
+
const buildGradle = context.readFile('build.gradle');
|
|
21
|
+
if (buildGradle && (buildGradle.includes('spring-boot') || buildGradle.includes('springframework'))) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
const buildGradleKts = context.readFile('build.gradle.kts');
|
|
25
|
+
if (buildGradleKts && (buildGradleKts.includes('spring-boot') || buildGradleKts.includes('springframework'))) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
// Check for Spring annotations in Java files
|
|
29
|
+
const allFiles = context.getAllFiles();
|
|
30
|
+
for (const file of allFiles) {
|
|
31
|
+
if (file.endsWith('.java')) {
|
|
32
|
+
const content = context.readFile(file);
|
|
33
|
+
if (content && (content.includes('@SpringBootApplication') ||
|
|
34
|
+
content.includes('@RestController') ||
|
|
35
|
+
content.includes('@Service') ||
|
|
36
|
+
content.includes('@Repository'))) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
},
|
|
43
|
+
resolve(ref, context) {
|
|
44
|
+
// Pattern 1: Service references (dependency injection)
|
|
45
|
+
if (ref.referenceName.endsWith('Service')) {
|
|
46
|
+
const result = resolveByNameAndKind(ref.referenceName, SERVICE_KINDS, SERVICE_DIRS, context);
|
|
47
|
+
if (result) {
|
|
48
|
+
return {
|
|
49
|
+
original: ref,
|
|
50
|
+
targetNodeId: result,
|
|
51
|
+
confidence: 0.85,
|
|
52
|
+
resolvedBy: 'framework',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Pattern 2: Repository references
|
|
57
|
+
if (ref.referenceName.endsWith('Repository')) {
|
|
58
|
+
const result = resolveByNameAndKind(ref.referenceName, SERVICE_KINDS, REPO_DIRS, context);
|
|
59
|
+
if (result) {
|
|
60
|
+
return {
|
|
61
|
+
original: ref,
|
|
62
|
+
targetNodeId: result,
|
|
63
|
+
confidence: 0.85,
|
|
64
|
+
resolvedBy: 'framework',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Pattern 3: Controller references
|
|
69
|
+
if (ref.referenceName.endsWith('Controller')) {
|
|
70
|
+
const result = resolveByNameAndKind(ref.referenceName, CLASS_KINDS, CONTROLLER_DIRS, context);
|
|
71
|
+
if (result) {
|
|
72
|
+
return {
|
|
73
|
+
original: ref,
|
|
74
|
+
targetNodeId: result,
|
|
75
|
+
confidence: 0.85,
|
|
76
|
+
resolvedBy: 'framework',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Pattern 4: Entity/Model references
|
|
81
|
+
if (/^[A-Z][a-zA-Z]+$/.test(ref.referenceName)) {
|
|
82
|
+
const result = resolveByNameAndKind(ref.referenceName, CLASS_KINDS, ENTITY_DIRS, context);
|
|
83
|
+
if (result) {
|
|
84
|
+
return {
|
|
85
|
+
original: ref,
|
|
86
|
+
targetNodeId: result,
|
|
87
|
+
confidence: 0.7,
|
|
88
|
+
resolvedBy: 'framework',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Pattern 5: Component references
|
|
93
|
+
if (ref.referenceName.endsWith('Component') || ref.referenceName.endsWith('Config')) {
|
|
94
|
+
const result = resolveByNameAndKind(ref.referenceName, CLASS_KINDS, COMPONENT_DIRS, context);
|
|
95
|
+
if (result) {
|
|
96
|
+
return {
|
|
97
|
+
original: ref,
|
|
98
|
+
targetNodeId: result,
|
|
99
|
+
confidence: 0.8,
|
|
100
|
+
resolvedBy: 'framework',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
},
|
|
106
|
+
extract(filePath, content) {
|
|
107
|
+
if (!filePath.endsWith('.java'))
|
|
108
|
+
return { nodes: [], references: [] };
|
|
109
|
+
const nodes = [];
|
|
110
|
+
const references = [];
|
|
111
|
+
const now = Date.now();
|
|
112
|
+
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;
|
|
115
|
+
let match;
|
|
116
|
+
while ((match = mappingRegex.exec(safe)) !== null) {
|
|
117
|
+
const [, mappingName, routePath] = match;
|
|
118
|
+
const line = safe.slice(0, match.index).split('\n').length;
|
|
119
|
+
const method = mappingName === 'RequestMapping' ? 'ANY' : mappingName.replace(/Mapping$/, '').toUpperCase();
|
|
120
|
+
const routeNode = {
|
|
121
|
+
id: `route:${filePath}:${line}:${method}:${routePath}`,
|
|
122
|
+
kind: 'route',
|
|
123
|
+
name: `${method} ${routePath}`,
|
|
124
|
+
qualifiedName: `${filePath}::route:${routePath}`,
|
|
125
|
+
filePath,
|
|
126
|
+
startLine: line,
|
|
127
|
+
endLine: line,
|
|
128
|
+
startColumn: 0,
|
|
129
|
+
endColumn: match[0].length,
|
|
130
|
+
language: 'java',
|
|
131
|
+
updatedAt: now,
|
|
132
|
+
};
|
|
133
|
+
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*\(/);
|
|
137
|
+
if (methodMatch) {
|
|
138
|
+
references.push({
|
|
139
|
+
fromNodeId: routeNode.id,
|
|
140
|
+
referenceName: methodMatch[1],
|
|
141
|
+
referenceKind: 'references',
|
|
142
|
+
line,
|
|
143
|
+
column: 0,
|
|
144
|
+
filePath,
|
|
145
|
+
language: 'java',
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return { nodes, references };
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
// Directory patterns
|
|
153
|
+
const SERVICE_DIRS = ['/service/', '/services/'];
|
|
154
|
+
const REPO_DIRS = ['/repository/', '/repositories/'];
|
|
155
|
+
const CONTROLLER_DIRS = ['/controller/', '/controllers/'];
|
|
156
|
+
const ENTITY_DIRS = ['/entity/', '/entities/', '/model/', '/models/', '/domain/'];
|
|
157
|
+
const COMPONENT_DIRS = ['/component/', '/components/', '/config/'];
|
|
158
|
+
const CLASS_KINDS = new Set(['class']);
|
|
159
|
+
const SERVICE_KINDS = new Set(['class', 'interface']);
|
|
160
|
+
/**
|
|
161
|
+
* Resolve a symbol by name using indexed queries instead of scanning all files.
|
|
162
|
+
*/
|
|
163
|
+
function resolveByNameAndKind(name, kinds, preferredDirPatterns, context) {
|
|
164
|
+
const candidates = context.getNodesByName(name);
|
|
165
|
+
if (candidates.length === 0)
|
|
166
|
+
return null;
|
|
167
|
+
const kindFiltered = candidates.filter((n) => kinds.has(n.kind));
|
|
168
|
+
if (kindFiltered.length === 0)
|
|
169
|
+
return null;
|
|
170
|
+
// Prefer candidates in framework-conventional directories
|
|
171
|
+
const preferred = kindFiltered.filter((n) => preferredDirPatterns.some((d) => n.filePath.includes(d)));
|
|
172
|
+
if (preferred.length > 0)
|
|
173
|
+
return preferred[0].id;
|
|
174
|
+
// Fall back to any match
|
|
175
|
+
return kindFiltered[0].id;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=java.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Laravel Framework Resolver
|
|
3
|
+
*
|
|
4
|
+
* Handles Laravel-specific patterns for reference resolution.
|
|
5
|
+
*/
|
|
6
|
+
import { FrameworkResolver } from '../types'
|
|
7
|
+
/**
|
|
8
|
+
* Laravel facade mappings to underlying classes
|
|
9
|
+
* Exported for potential use in facade resolution
|
|
10
|
+
*/
|
|
11
|
+
export declare const FACADE_MAPPINGS: Record<string, string>
|
|
12
|
+
export declare const laravelResolver: FrameworkResolver
|
|
13
|
+
//# sourceMappingURL=laravel.d.ts.map
|