@szabadkai/graphite 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/README.md +427 -0
- package/dist/cli/formatters.d.ts +3 -0
- package/dist/cli/formatters.js +61 -0
- package/dist/cli/formatters.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +186 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/call-resolver.d.ts +8 -0
- package/dist/indexer/call-resolver.js +161 -0
- package/dist/indexer/call-resolver.js.map +1 -0
- package/dist/indexer/extractors/calls.d.ts +17 -0
- package/dist/indexer/extractors/calls.js +206 -0
- package/dist/indexer/extractors/calls.js.map +1 -0
- package/dist/indexer/extractors/classes.d.ts +35 -0
- package/dist/indexer/extractors/classes.js +209 -0
- package/dist/indexer/extractors/classes.js.map +1 -0
- package/dist/indexer/extractors/exports.d.ts +12 -0
- package/dist/indexer/extractors/exports.js +267 -0
- package/dist/indexer/extractors/exports.js.map +1 -0
- package/dist/indexer/extractors/functions.d.ts +12 -0
- package/dist/indexer/extractors/functions.js +169 -0
- package/dist/indexer/extractors/functions.js.map +1 -0
- package/dist/indexer/extractors/imports.d.ts +12 -0
- package/dist/indexer/extractors/imports.js +195 -0
- package/dist/indexer/extractors/imports.js.map +1 -0
- package/dist/indexer/extractors/index.d.ts +7 -0
- package/dist/indexer/extractors/index.js +24 -0
- package/dist/indexer/extractors/index.js.map +1 -0
- package/dist/indexer/extractors/types.d.ts +12 -0
- package/dist/indexer/extractors/types.js +138 -0
- package/dist/indexer/extractors/types.js.map +1 -0
- package/dist/indexer/extractors/variables.d.ts +10 -0
- package/dist/indexer/extractors/variables.js +134 -0
- package/dist/indexer/extractors/variables.js.map +1 -0
- package/dist/indexer/file-discovery.d.ts +7 -0
- package/dist/indexer/file-discovery.js +92 -0
- package/dist/indexer/file-discovery.js.map +1 -0
- package/dist/indexer/file-indexer.d.ts +2 -0
- package/dist/indexer/file-indexer.js +267 -0
- package/dist/indexer/file-indexer.js.map +1 -0
- package/dist/indexer/graph-contract.d.ts +25 -0
- package/dist/indexer/graph-contract.js +7 -0
- package/dist/indexer/graph-contract.js.map +1 -0
- package/dist/indexer/hasher.d.ts +1 -0
- package/dist/indexer/hasher.js +11 -0
- package/dist/indexer/hasher.js.map +1 -0
- package/dist/indexer/import-resolver.d.ts +11 -0
- package/dist/indexer/import-resolver.js +131 -0
- package/dist/indexer/import-resolver.js.map +1 -0
- package/dist/indexer/index.d.ts +11 -0
- package/dist/indexer/index.js +28 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/inheritance-resolver.d.ts +7 -0
- package/dist/indexer/inheritance-resolver.js +119 -0
- package/dist/indexer/inheritance-resolver.js.map +1 -0
- package/dist/indexer/parser.d.ts +5 -0
- package/dist/indexer/parser.js +48 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/indexer/path-utils.d.ts +3 -0
- package/dist/indexer/path-utils.js +20 -0
- package/dist/indexer/path-utils.js.map +1 -0
- package/dist/indexer/project-indexer.d.ts +14 -0
- package/dist/indexer/project-indexer.js +167 -0
- package/dist/indexer/project-indexer.js.map +1 -0
- package/dist/indexer/property-parsers.d.ts +20 -0
- package/dist/indexer/property-parsers.js +81 -0
- package/dist/indexer/property-parsers.js.map +1 -0
- package/dist/mcp/index.d.ts +3 -0
- package/dist/mcp/index.js +20 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/response-formatter.d.ts +10 -0
- package/dist/mcp/response-formatter.js +47 -0
- package/dist/mcp/response-formatter.js.map +1 -0
- package/dist/mcp/server.d.ts +10 -0
- package/dist/mcp/server.js +118 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools-list.d.ts +9 -0
- package/dist/mcp/tools-list.js +12 -0
- package/dist/mcp/tools-list.js.map +1 -0
- package/dist/mcp/tools.d.ts +13 -0
- package/dist/mcp/tools.js +163 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/query/analyze-impact.d.ts +18 -0
- package/dist/query/analyze-impact.js +58 -0
- package/dist/query/analyze-impact.js.map +1 -0
- package/dist/query/find-callees.d.ts +12 -0
- package/dist/query/find-callees.js +46 -0
- package/dist/query/find-callees.js.map +1 -0
- package/dist/query/find-callers.d.ts +12 -0
- package/dist/query/find-callers.js +46 -0
- package/dist/query/find-callers.js.map +1 -0
- package/dist/query/find-definition.d.ts +3 -0
- package/dist/query/find-definition.js +41 -0
- package/dist/query/find-definition.js.map +1 -0
- package/dist/query/find-dependency-path.d.ts +2 -0
- package/dist/query/find-dependency-path.js +39 -0
- package/dist/query/find-dependency-path.js.map +1 -0
- package/dist/query/find-implementations.d.ts +10 -0
- package/dist/query/find-implementations.js +34 -0
- package/dist/query/find-implementations.js.map +1 -0
- package/dist/query/get-exports.d.ts +3 -0
- package/dist/query/get-exports.js +82 -0
- package/dist/query/get-exports.js.map +1 -0
- package/dist/query/get-file-structure.d.ts +3 -0
- package/dist/query/get-file-structure.js +58 -0
- package/dist/query/get-file-structure.js.map +1 -0
- package/dist/query/get-graph-stats.d.ts +21 -0
- package/dist/query/get-graph-stats.js +42 -0
- package/dist/query/get-graph-stats.js.map +1 -0
- package/dist/query/index.d.ts +11 -0
- package/dist/query/index.js +28 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/search-symbols.d.ts +6 -0
- package/dist/query/search-symbols.js +75 -0
- package/dist/query/search-symbols.js.map +1 -0
- package/dist/query/types.d.ts +41 -0
- package/dist/query/types.js +36 -0
- package/dist/query/types.js.map +1 -0
- package/dist/storage/database.d.ts +13 -0
- package/dist/storage/database.js +49 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/index.d.ts +7 -0
- package/dist/storage/index.js +24 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/migrations/001_initial.sql +59 -0
- package/dist/storage/migrations/002_add_name_index.sql +9 -0
- package/dist/storage/migrator.d.ts +9 -0
- package/dist/storage/migrator.js +86 -0
- package/dist/storage/migrator.js.map +1 -0
- package/dist/storage/paths.d.ts +5 -0
- package/dist/storage/paths.js +25 -0
- package/dist/storage/paths.js.map +1 -0
- package/dist/storage/reader.d.ts +10 -0
- package/dist/storage/reader.js +103 -0
- package/dist/storage/reader.js.map +1 -0
- package/dist/storage/schema.d.ts +14 -0
- package/dist/storage/schema.js +18 -0
- package/dist/storage/schema.js.map +1 -0
- package/dist/storage/types.d.ts +42 -0
- package/dist/storage/types.js +3 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/storage/writer.d.ts +13 -0
- package/dist/storage/writer.js +160 -0
- package/dist/storage/writer.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findCallees = findCallees;
|
|
4
|
+
function findCallees(db, symbolName, options) {
|
|
5
|
+
const depth = Math.max(1, options?.depth ?? 1);
|
|
6
|
+
const maxResults = Math.max(1, Math.min(options?.maxResults ?? 50, 500));
|
|
7
|
+
const rows = db
|
|
8
|
+
.prepare(`
|
|
9
|
+
WITH RECURSIVE starts(id) AS (
|
|
10
|
+
SELECT id FROM nodes WHERE name = ?
|
|
11
|
+
),
|
|
12
|
+
callee_chain(callee_id, depth, path) AS (
|
|
13
|
+
SELECT edges.target_id, 1, ',' || edges.source_id || ',' || edges.target_id || ','
|
|
14
|
+
FROM edges
|
|
15
|
+
JOIN starts ON starts.id = edges.source_id
|
|
16
|
+
WHERE edges.type = 'CALLS'
|
|
17
|
+
UNION
|
|
18
|
+
SELECT edges.target_id, callee_chain.depth + 1, callee_chain.path || edges.target_id || ','
|
|
19
|
+
FROM edges
|
|
20
|
+
JOIN callee_chain ON callee_chain.callee_id = edges.source_id
|
|
21
|
+
WHERE
|
|
22
|
+
edges.type = 'CALLS'
|
|
23
|
+
AND callee_chain.depth < ?
|
|
24
|
+
AND instr(callee_chain.path, ',' || edges.target_id || ',') = 0
|
|
25
|
+
)
|
|
26
|
+
SELECT DISTINCT
|
|
27
|
+
nodes.id as callee_id,
|
|
28
|
+
nodes.name as callee_name,
|
|
29
|
+
nodes.file_path as file_path,
|
|
30
|
+
nodes.start_line as line,
|
|
31
|
+
callee_chain.depth as depth
|
|
32
|
+
FROM callee_chain
|
|
33
|
+
JOIN nodes ON nodes.id = callee_chain.callee_id
|
|
34
|
+
ORDER BY depth ASC, file_path ASC, line ASC
|
|
35
|
+
LIMIT ?
|
|
36
|
+
`)
|
|
37
|
+
.all(symbolName, depth, maxResults);
|
|
38
|
+
return rows.map((row) => ({
|
|
39
|
+
calleeId: row.callee_id,
|
|
40
|
+
calleeName: row.callee_name,
|
|
41
|
+
filePath: row.file_path,
|
|
42
|
+
line: row.line,
|
|
43
|
+
depth: row.depth
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=find-callees.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-callees.js","sourceRoot":"","sources":["../../src/query/find-callees.ts"],"names":[],"mappings":";;AAUA,kCAuDC;AAvDD,SAAgB,WAAW,CACzB,EAAqB,EACrB,UAAkB,EAClB,OAAiD;IAEjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAEzE,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4BD,CACA;SACA,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,CAMlC,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
export interface CallerResult {
|
|
3
|
+
callerId: string;
|
|
4
|
+
callerName: string;
|
|
5
|
+
filePath: string;
|
|
6
|
+
line: number;
|
|
7
|
+
depth: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function findCallers(db: Database.Database, symbolName: string, options?: {
|
|
10
|
+
depth?: number;
|
|
11
|
+
maxResults?: number;
|
|
12
|
+
}): CallerResult[];
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findCallers = findCallers;
|
|
4
|
+
function findCallers(db, symbolName, options) {
|
|
5
|
+
const depth = Math.max(1, options?.depth ?? 1);
|
|
6
|
+
const maxResults = Math.max(1, Math.min(options?.maxResults ?? 50, 500));
|
|
7
|
+
const rows = db
|
|
8
|
+
.prepare(`
|
|
9
|
+
WITH RECURSIVE targets(id) AS (
|
|
10
|
+
SELECT id FROM nodes WHERE name = ?
|
|
11
|
+
),
|
|
12
|
+
caller_chain(caller_id, depth, path) AS (
|
|
13
|
+
SELECT edges.source_id, 1, ',' || edges.source_id || ',' || edges.target_id || ','
|
|
14
|
+
FROM edges
|
|
15
|
+
JOIN targets ON targets.id = edges.target_id
|
|
16
|
+
WHERE edges.type = 'CALLS'
|
|
17
|
+
UNION
|
|
18
|
+
SELECT edges.source_id, caller_chain.depth + 1, caller_chain.path || edges.source_id || ','
|
|
19
|
+
FROM edges
|
|
20
|
+
JOIN caller_chain ON caller_chain.caller_id = edges.target_id
|
|
21
|
+
WHERE
|
|
22
|
+
edges.type = 'CALLS'
|
|
23
|
+
AND caller_chain.depth < ?
|
|
24
|
+
AND instr(caller_chain.path, ',' || edges.source_id || ',') = 0
|
|
25
|
+
)
|
|
26
|
+
SELECT DISTINCT
|
|
27
|
+
nodes.id as caller_id,
|
|
28
|
+
nodes.name as caller_name,
|
|
29
|
+
nodes.file_path as file_path,
|
|
30
|
+
nodes.start_line as line,
|
|
31
|
+
caller_chain.depth as depth
|
|
32
|
+
FROM caller_chain
|
|
33
|
+
JOIN nodes ON nodes.id = caller_chain.caller_id
|
|
34
|
+
ORDER BY depth ASC, file_path ASC, line ASC
|
|
35
|
+
LIMIT ?
|
|
36
|
+
`)
|
|
37
|
+
.all(symbolName, depth, maxResults);
|
|
38
|
+
return rows.map((row) => ({
|
|
39
|
+
callerId: row.caller_id,
|
|
40
|
+
callerName: row.caller_name,
|
|
41
|
+
filePath: row.file_path,
|
|
42
|
+
line: row.line,
|
|
43
|
+
depth: row.depth
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=find-callers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-callers.js","sourceRoot":"","sources":["../../src/query/find-callers.ts"],"names":[],"mappings":";;AAUA,kCAuDC;AAvDD,SAAgB,WAAW,CACzB,EAAqB,EACrB,UAAkB,EAClB,OAAiD;IAEjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAEzE,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4BD,CACA;SACA,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,CAMlC,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxB,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,UAAU,EAAE,GAAG,CAAC,WAAW;QAC3B,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,KAAK,EAAE,GAAG,CAAC,KAAK;KACjB,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findDefinition = findDefinition;
|
|
4
|
+
const types_1 = require("./types");
|
|
5
|
+
function findDefinition(db, symbol, type) {
|
|
6
|
+
const normalizedType = (0, types_1.normalizeNodeTypeFilter)(type);
|
|
7
|
+
// L5: Add LIMIT to prevent unbounded results for common names
|
|
8
|
+
const statement = normalizedType
|
|
9
|
+
? db.prepare("SELECT id, name, type, file_path, start_line, end_line, start_col, end_col, properties FROM nodes WHERE name = ? AND type = ? ORDER BY file_path ASC, start_line ASC LIMIT 100")
|
|
10
|
+
: db.prepare("SELECT id, name, type, file_path, start_line, end_line, start_col, end_col, properties FROM nodes WHERE name = ? ORDER BY file_path ASC, start_line ASC LIMIT 100");
|
|
11
|
+
const rows = (normalizedType
|
|
12
|
+
? statement.all(symbol, normalizedType)
|
|
13
|
+
: statement.all(symbol));
|
|
14
|
+
const mapped = rows.map((row) => {
|
|
15
|
+
const properties = (0, types_1.safeParseProperties)(row.properties);
|
|
16
|
+
return {
|
|
17
|
+
id: row.id,
|
|
18
|
+
name: row.name,
|
|
19
|
+
type: row.type,
|
|
20
|
+
filePath: row.file_path,
|
|
21
|
+
startLine: row.start_line,
|
|
22
|
+
endLine: row.end_line,
|
|
23
|
+
startCol: row.start_col,
|
|
24
|
+
endCol: row.end_col,
|
|
25
|
+
exported: Boolean(properties.isExported),
|
|
26
|
+
signature: typeof properties.signature === "string"
|
|
27
|
+
? properties.signature
|
|
28
|
+
: null
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
return mapped.sort((a, b) => {
|
|
32
|
+
if (a.exported !== b.exported) {
|
|
33
|
+
return a.exported ? -1 : 1;
|
|
34
|
+
}
|
|
35
|
+
if (a.filePath !== b.filePath) {
|
|
36
|
+
return a.filePath.localeCompare(b.filePath);
|
|
37
|
+
}
|
|
38
|
+
return a.startLine - b.startLine;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=find-definition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-definition.js","sourceRoot":"","sources":["../../src/query/find-definition.ts"],"names":[],"mappings":";;AAmBA,wCAmDC;AArED,mCAIiB;AAcjB,SAAgB,cAAc,CAC5B,EAAqB,EACrB,MAAc,EACd,IAAa;IAEb,MAAM,cAAc,GAAG,IAAA,+BAAuB,EAAC,IAAI,CAAC,CAAC;IAErD,8DAA8D;IAC9D,MAAM,SAAS,GAAG,cAAc;QAC9B,CAAC,CAAC,EAAE,CAAC,OAAO,CACR,gLAAgL,CACjL;QACH,CAAC,CAAC,EAAE,CAAC,OAAO,CACR,mKAAmK,CACpK,CAAC;IAEN,MAAM,IAAI,GAAG,CAAC,cAAc;QAC1B,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC;QACvC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAc,CAAC;IAExC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,IAAA,2BAAmB,EAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEvD,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;YACrB,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,MAAM,EAAE,GAAG,CAAC,OAAO;YACnB,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;YACxC,SAAS,EACP,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ;gBACtC,CAAC,CAAC,UAAU,CAAC,SAAS;gBACtB,CAAC,CAAC,IAAI;SACgB,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC1B,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findDependencyPath = findDependencyPath;
|
|
4
|
+
function toFileNodeId(filePath) {
|
|
5
|
+
return `${filePath}::File::${filePath}::1`;
|
|
6
|
+
}
|
|
7
|
+
function findDependencyPath(db, sourceFilePath, targetFilePath) {
|
|
8
|
+
if (sourceFilePath === targetFilePath) {
|
|
9
|
+
return [sourceFilePath];
|
|
10
|
+
}
|
|
11
|
+
const rows = db
|
|
12
|
+
.prepare(`
|
|
13
|
+
WITH RECURSIVE queue(node_id, path, depth) AS (
|
|
14
|
+
SELECT ?, ',' || ? || ',' as path, 0
|
|
15
|
+
UNION
|
|
16
|
+
SELECT edges.target_id, queue.path || edges.target_id || ',', queue.depth + 1
|
|
17
|
+
FROM edges
|
|
18
|
+
JOIN queue ON queue.node_id = edges.source_id
|
|
19
|
+
WHERE
|
|
20
|
+
edges.type = 'IMPORTS'
|
|
21
|
+
AND queue.depth < 50
|
|
22
|
+
AND instr(queue.path, ',' || edges.target_id || ',') = 0
|
|
23
|
+
)
|
|
24
|
+
SELECT path
|
|
25
|
+
FROM queue
|
|
26
|
+
WHERE node_id = ?
|
|
27
|
+
ORDER BY depth ASC
|
|
28
|
+
LIMIT 1
|
|
29
|
+
`)
|
|
30
|
+
.get(toFileNodeId(sourceFilePath), toFileNodeId(sourceFilePath), toFileNodeId(targetFilePath));
|
|
31
|
+
if (!rows?.path) {
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
return rows.path
|
|
35
|
+
.split(",")
|
|
36
|
+
.filter((segment) => segment.length > 0)
|
|
37
|
+
.map((nodeId) => nodeId.split("::")[0]);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=find-dependency-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-dependency-path.js","sourceRoot":"","sources":["../../src/query/find-dependency-path.ts"],"names":[],"mappings":";;AAMA,gDA4CC;AAhDD,SAAS,YAAY,CAAC,QAAgB;IACpC,OAAO,GAAG,QAAQ,WAAW,QAAQ,KAAK,CAAC;AAC7C,CAAC;AAED,SAAgB,kBAAkB,CAChC,EAAqB,EACrB,cAAsB,EACtB,cAAsB;IAEtB,IAAI,cAAc,KAAK,cAAc,EAAE,CAAC;QACtC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;;;;;;;;;;;;;;KAiBD,CACA;SACA,GAAG,CACF,YAAY,CAAC,cAAc,CAAC,EAC5B,YAAY,CAAC,cAAc,CAAC,EAC5B,YAAY,CAAC,cAAc,CAAC,CACG,CAAC;IAEpC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,IAAI,CAAC,IAAI;SACb,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;SACvC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
export interface ImplementationResult {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
type: string;
|
|
6
|
+
filePath: string;
|
|
7
|
+
line: number;
|
|
8
|
+
edgeType: "IMPLEMENTS" | "EXTENDS";
|
|
9
|
+
}
|
|
10
|
+
export declare function findImplementations(db: Database.Database, symbolName: string): ImplementationResult[];
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findImplementations = findImplementations;
|
|
4
|
+
function findImplementations(db, symbolName) {
|
|
5
|
+
const rows = db
|
|
6
|
+
.prepare(`
|
|
7
|
+
WITH targets AS (
|
|
8
|
+
SELECT id FROM nodes WHERE name = ?
|
|
9
|
+
)
|
|
10
|
+
SELECT
|
|
11
|
+
source.id as id,
|
|
12
|
+
source.name as name,
|
|
13
|
+
source.type as type,
|
|
14
|
+
source.file_path as file_path,
|
|
15
|
+
source.start_line as line,
|
|
16
|
+
edges.type as edge_type
|
|
17
|
+
FROM edges
|
|
18
|
+
JOIN targets ON targets.id = edges.target_id
|
|
19
|
+
JOIN nodes AS source ON source.id = edges.source_id
|
|
20
|
+
WHERE edges.type IN ('IMPLEMENTS', 'EXTENDS')
|
|
21
|
+
ORDER BY source.file_path ASC, source.start_line ASC
|
|
22
|
+
LIMIT 100
|
|
23
|
+
`)
|
|
24
|
+
.all(symbolName);
|
|
25
|
+
return rows.map((row) => ({
|
|
26
|
+
id: row.id,
|
|
27
|
+
name: row.name,
|
|
28
|
+
type: row.type,
|
|
29
|
+
filePath: row.file_path,
|
|
30
|
+
line: row.line,
|
|
31
|
+
edgeType: row.edge_type
|
|
32
|
+
}));
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=find-implementations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-implementations.js","sourceRoot":"","sources":["../../src/query/find-implementations.ts"],"names":[],"mappings":";;AAWA,kDA0CC;AA1CD,SAAgB,mBAAmB,CACjC,EAAqB,EACrB,UAAkB;IAElB,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;;;;;;;;;;;;;;;;KAiBD,CACA;SACA,GAAG,CAAC,UAAU,CAOf,CAAC;IAEH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACxB,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,QAAQ,EAAE,GAAG,CAAC,SAAS;KACxB,CAAC,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getExports = getExports;
|
|
4
|
+
const types_1 = require("./types");
|
|
5
|
+
// M13: Match multiple extensions, not just .ts
|
|
6
|
+
const SUPPORTED_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mts", ".mjs", ".cts", ".cjs"];
|
|
7
|
+
function resolveFilePath(db, fileOrModule) {
|
|
8
|
+
const exact = db
|
|
9
|
+
.prepare("SELECT path FROM files WHERE path = ? LIMIT 1")
|
|
10
|
+
.get(fileOrModule);
|
|
11
|
+
if (exact) {
|
|
12
|
+
return exact.path;
|
|
13
|
+
}
|
|
14
|
+
// Try each supported extension
|
|
15
|
+
for (const ext of SUPPORTED_EXTENSIONS) {
|
|
16
|
+
const candidates = db
|
|
17
|
+
.prepare("SELECT path FROM files WHERE path LIKE ? ORDER BY path ASC")
|
|
18
|
+
.all(`%/${fileOrModule}${ext}`);
|
|
19
|
+
if (candidates.length === 1) {
|
|
20
|
+
return candidates[0].path;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
function getExports(db, fileOrModule) {
|
|
26
|
+
const resolvedFilePath = resolveFilePath(db, fileOrModule);
|
|
27
|
+
if (!resolvedFilePath) {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
const fileNodeId = `${resolvedFilePath}::File::${resolvedFilePath}::1`;
|
|
31
|
+
// M5: Single JOIN query instead of N+1 per-export SELECT
|
|
32
|
+
const rows = db
|
|
33
|
+
.prepare(`
|
|
34
|
+
SELECT
|
|
35
|
+
edges.target_id,
|
|
36
|
+
edges.properties AS edge_properties,
|
|
37
|
+
nodes.type AS node_type,
|
|
38
|
+
nodes.name AS node_name,
|
|
39
|
+
nodes.file_path AS node_file_path,
|
|
40
|
+
nodes.start_line AS node_start_line,
|
|
41
|
+
nodes.end_line AS node_end_line,
|
|
42
|
+
nodes.start_col AS node_start_col,
|
|
43
|
+
nodes.end_col AS node_end_col,
|
|
44
|
+
nodes.properties AS node_properties
|
|
45
|
+
FROM edges
|
|
46
|
+
JOIN nodes ON nodes.id = edges.target_id
|
|
47
|
+
WHERE edges.type = 'EXPORTS' AND edges.source_id = ?
|
|
48
|
+
`)
|
|
49
|
+
.all(fileNodeId);
|
|
50
|
+
const results = [];
|
|
51
|
+
for (const row of rows) {
|
|
52
|
+
const edgeProperties = (0, types_1.safeParseProperties)(row.edge_properties);
|
|
53
|
+
const exportedName = typeof edgeProperties.exportedName === "string" ? edgeProperties.exportedName : "";
|
|
54
|
+
const localName = typeof edgeProperties.localName === "string" ? edgeProperties.localName : null;
|
|
55
|
+
const sourcePath = typeof edgeProperties.sourcePath === "string" ? edgeProperties.sourcePath : null;
|
|
56
|
+
const reExport = Boolean(edgeProperties.reExport);
|
|
57
|
+
const targetProperties = (0, types_1.safeParseProperties)(row.node_properties);
|
|
58
|
+
results.push({
|
|
59
|
+
exportedName,
|
|
60
|
+
localName,
|
|
61
|
+
type: row.node_type,
|
|
62
|
+
filePath: row.node_file_path,
|
|
63
|
+
startLine: row.node_start_line,
|
|
64
|
+
endLine: row.node_end_line,
|
|
65
|
+
startCol: row.node_start_col,
|
|
66
|
+
endCol: row.node_end_col,
|
|
67
|
+
signature: typeof targetProperties.signature === "string" ? targetProperties.signature : null,
|
|
68
|
+
reExport,
|
|
69
|
+
sourcePath
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return results.sort((a, b) => {
|
|
73
|
+
if (a.exportedName !== b.exportedName) {
|
|
74
|
+
return a.exportedName.localeCompare(b.exportedName);
|
|
75
|
+
}
|
|
76
|
+
if ((a.filePath ?? "") !== (b.filePath ?? "")) {
|
|
77
|
+
return (a.filePath ?? "").localeCompare(b.filePath ?? "");
|
|
78
|
+
}
|
|
79
|
+
return (a.startLine ?? 0) - (b.startLine ?? 0);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=get-exports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-exports.js","sourceRoot":"","sources":["../../src/query/get-exports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getFileStructure = getFileStructure;
|
|
4
|
+
const types_1 = require("./types");
|
|
5
|
+
function mapDefinition(row) {
|
|
6
|
+
const properties = (0, types_1.safeParseProperties)(row.properties);
|
|
7
|
+
return {
|
|
8
|
+
id: row.id,
|
|
9
|
+
name: row.name,
|
|
10
|
+
type: row.type,
|
|
11
|
+
filePath: row.file_path,
|
|
12
|
+
startLine: row.start_line,
|
|
13
|
+
endLine: row.end_line,
|
|
14
|
+
startCol: row.start_col,
|
|
15
|
+
endCol: row.end_col,
|
|
16
|
+
exported: Boolean(properties.isExported),
|
|
17
|
+
signature: typeof properties.signature === "string" ? properties.signature : null
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function getFileStructure(db, filePath) {
|
|
21
|
+
const nodeRows = db
|
|
22
|
+
.prepare("SELECT id, name, type, file_path, start_line, end_line, start_col, end_col, properties FROM nodes WHERE file_path = ? ORDER BY start_line ASC, name ASC")
|
|
23
|
+
.all(filePath);
|
|
24
|
+
const containsRows = db
|
|
25
|
+
.prepare("SELECT source_id, target_id FROM edges WHERE type = 'CONTAINS' AND source_id IN (SELECT id FROM nodes WHERE file_path = ?)")
|
|
26
|
+
.all(filePath);
|
|
27
|
+
const byId = new Map(nodeRows.map((row) => [row.id, mapDefinition(row)]));
|
|
28
|
+
const classes = nodeRows
|
|
29
|
+
.filter((row) => row.type === "Class")
|
|
30
|
+
.map((row) => {
|
|
31
|
+
const cls = byId.get(row.id);
|
|
32
|
+
const memberIds = containsRows
|
|
33
|
+
.filter((edge) => edge.source_id === row.id)
|
|
34
|
+
.map((edge) => edge.target_id);
|
|
35
|
+
const members = memberIds
|
|
36
|
+
.map((id) => byId.get(id))
|
|
37
|
+
.filter((item) => Boolean(item))
|
|
38
|
+
.sort((a, b) => a.startLine - b.startLine);
|
|
39
|
+
return {
|
|
40
|
+
...cls,
|
|
41
|
+
members
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
const pick = (type) => nodeRows
|
|
45
|
+
.filter((row) => row.type === type)
|
|
46
|
+
.map((row) => byId.get(row.id))
|
|
47
|
+
.sort((a, b) => a.startLine - b.startLine);
|
|
48
|
+
return {
|
|
49
|
+
filePath,
|
|
50
|
+
functions: pick("Function"),
|
|
51
|
+
classes,
|
|
52
|
+
interfaces: pick("Interface"),
|
|
53
|
+
types: pick("TypeAlias"),
|
|
54
|
+
enums: pick("Enum"),
|
|
55
|
+
variables: pick("Variable")
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=get-file-structure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-file-structure.js","sourceRoot":"","sources":["../../src/query/get-file-structure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
export interface GraphStats {
|
|
3
|
+
totalFiles: number;
|
|
4
|
+
nodeCountByType: Array<{
|
|
5
|
+
type: string;
|
|
6
|
+
count: number;
|
|
7
|
+
}>;
|
|
8
|
+
edgeCountByType: Array<{
|
|
9
|
+
type: string;
|
|
10
|
+
count: number;
|
|
11
|
+
}>;
|
|
12
|
+
oldestIndexedAt: number | null;
|
|
13
|
+
newestIndexedAt: number | null;
|
|
14
|
+
topConnectedNodes: Array<{
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
type: string;
|
|
18
|
+
degree: number;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export declare function getGraphStats(db: Database.Database): GraphStats;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getGraphStats = getGraphStats;
|
|
4
|
+
function getGraphStats(db) {
|
|
5
|
+
const totalFiles = db.prepare("SELECT COUNT(*) as count FROM files").get()
|
|
6
|
+
.count;
|
|
7
|
+
const nodeCountByType = db
|
|
8
|
+
.prepare("SELECT type, COUNT(*) as count FROM nodes GROUP BY type ORDER BY count DESC, type ASC")
|
|
9
|
+
.all();
|
|
10
|
+
const edgeCountByType = db
|
|
11
|
+
.prepare("SELECT type, COUNT(*) as count FROM edges GROUP BY type ORDER BY count DESC, type ASC")
|
|
12
|
+
.all();
|
|
13
|
+
const freshness = db
|
|
14
|
+
.prepare("SELECT MIN(indexed_at) as oldest, MAX(indexed_at) as newest FROM files")
|
|
15
|
+
.get();
|
|
16
|
+
const topConnectedNodes = db
|
|
17
|
+
.prepare(`
|
|
18
|
+
WITH degrees AS (
|
|
19
|
+
SELECT source_id as node_id, COUNT(*) as degree FROM edges GROUP BY source_id
|
|
20
|
+
UNION ALL
|
|
21
|
+
SELECT target_id as node_id, COUNT(*) as degree FROM edges GROUP BY target_id
|
|
22
|
+
),
|
|
23
|
+
summed AS (
|
|
24
|
+
SELECT node_id, SUM(degree) as degree FROM degrees GROUP BY node_id
|
|
25
|
+
)
|
|
26
|
+
SELECT nodes.id, nodes.name, nodes.type, summed.degree
|
|
27
|
+
FROM summed
|
|
28
|
+
JOIN nodes ON nodes.id = summed.node_id
|
|
29
|
+
ORDER BY summed.degree DESC, nodes.name ASC
|
|
30
|
+
LIMIT 10
|
|
31
|
+
`)
|
|
32
|
+
.all();
|
|
33
|
+
return {
|
|
34
|
+
totalFiles,
|
|
35
|
+
nodeCountByType,
|
|
36
|
+
edgeCountByType,
|
|
37
|
+
oldestIndexedAt: freshness.oldest,
|
|
38
|
+
newestIndexedAt: freshness.newest,
|
|
39
|
+
topConnectedNodes
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=get-graph-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-graph-stats.js","sourceRoot":"","sources":["../../src/query/get-graph-stats.ts"],"names":[],"mappings":";;AAWA,sCA4CC;AA5CD,SAAgB,aAAa,CAAC,EAAqB;IACjD,MAAM,UAAU,GAAI,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,EAAwB;SAC9F,KAAK,CAAC;IAET,MAAM,eAAe,GAAG,EAAE;SACvB,OAAO,CAAC,uFAAuF,CAAC;SAChG,GAAG,EAA4C,CAAC;IAEnD,MAAM,eAAe,GAAG,EAAE;SACvB,OAAO,CAAC,uFAAuF,CAAC;SAChG,GAAG,EAA4C,CAAC;IAEnD,MAAM,SAAS,GAAG,EAAE;SACjB,OAAO,CAAC,wEAAwE,CAAC;SACjF,GAAG,EAAsD,CAAC;IAE7D,MAAM,iBAAiB,GAAG,EAAE;SACzB,OAAO,CACN;;;;;;;;;;;;;;KAcD,CACA;SACA,GAAG,EAAuE,CAAC;IAE9E,OAAO;QACL,UAAU;QACV,eAAe;QACf,eAAe;QACf,eAAe,EAAE,SAAS,CAAC,MAAM;QACjC,eAAe,EAAE,SAAS,CAAC,MAAM;QACjC,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "./types";
|
|
2
|
+
export * from "./find-definition";
|
|
3
|
+
export * from "./search-symbols";
|
|
4
|
+
export * from "./get-file-structure";
|
|
5
|
+
export * from "./get-exports";
|
|
6
|
+
export * from "./find-callers";
|
|
7
|
+
export * from "./find-callees";
|
|
8
|
+
export * from "./get-graph-stats";
|
|
9
|
+
export * from "./find-implementations";
|
|
10
|
+
export * from "./analyze-impact";
|
|
11
|
+
export * from "./find-dependency-path";
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./types"), exports);
|
|
18
|
+
__exportStar(require("./find-definition"), exports);
|
|
19
|
+
__exportStar(require("./search-symbols"), exports);
|
|
20
|
+
__exportStar(require("./get-file-structure"), exports);
|
|
21
|
+
__exportStar(require("./get-exports"), exports);
|
|
22
|
+
__exportStar(require("./find-callers"), exports);
|
|
23
|
+
__exportStar(require("./find-callees"), exports);
|
|
24
|
+
__exportStar(require("./get-graph-stats"), exports);
|
|
25
|
+
__exportStar(require("./find-implementations"), exports);
|
|
26
|
+
__exportStar(require("./analyze-impact"), exports);
|
|
27
|
+
__exportStar(require("./find-dependency-path"), exports);
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/query/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,oDAAkC;AAClC,mDAAiC;AACjC,uDAAqC;AACrC,gDAA8B;AAC9B,iDAA+B;AAC/B,iDAA+B;AAC/B,oDAAkC;AAClC,yDAAuC;AACvC,mDAAiC;AACjC,yDAAuC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.searchSymbols = searchSymbols;
|
|
4
|
+
const types_1 = require("./types");
|
|
5
|
+
function searchSymbols(db, query, options) {
|
|
6
|
+
const normalizedType = (0, types_1.normalizeNodeTypeFilter)(options?.type);
|
|
7
|
+
const maxResults = Math.max(1, Math.min(options?.maxResults ?? 20, 100));
|
|
8
|
+
// Sanitize FTS5 special characters and restrict search to the name column.
|
|
9
|
+
// FTS5 syntax chars (AND, OR, NOT, ", (, ), ^, *) in user input would cause
|
|
10
|
+
// incorrect results or SQLite errors if left unescaped.
|
|
11
|
+
const sanitized = query.replace(/["""()^]/g, "").trim();
|
|
12
|
+
if (!sanitized) {
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
const ftsQuery = sanitized.includes("*")
|
|
16
|
+
? `name:${sanitized}`
|
|
17
|
+
: `name:${sanitized}*`;
|
|
18
|
+
const statement = normalizedType
|
|
19
|
+
? db.prepare(`
|
|
20
|
+
SELECT
|
|
21
|
+
nodes.id,
|
|
22
|
+
nodes.name,
|
|
23
|
+
nodes.type,
|
|
24
|
+
nodes.file_path,
|
|
25
|
+
nodes.start_line,
|
|
26
|
+
nodes.end_line,
|
|
27
|
+
nodes.start_col,
|
|
28
|
+
nodes.end_col,
|
|
29
|
+
nodes.properties,
|
|
30
|
+
bm25(nodes_fts) AS rank
|
|
31
|
+
FROM nodes_fts
|
|
32
|
+
JOIN nodes ON nodes.id = nodes_fts.node_id
|
|
33
|
+
WHERE nodes_fts MATCH ? AND nodes.type = ?
|
|
34
|
+
ORDER BY rank ASC, nodes.file_path ASC, nodes.start_line ASC
|
|
35
|
+
LIMIT ?
|
|
36
|
+
`)
|
|
37
|
+
: db.prepare(`
|
|
38
|
+
SELECT
|
|
39
|
+
nodes.id,
|
|
40
|
+
nodes.name,
|
|
41
|
+
nodes.type,
|
|
42
|
+
nodes.file_path,
|
|
43
|
+
nodes.start_line,
|
|
44
|
+
nodes.end_line,
|
|
45
|
+
nodes.start_col,
|
|
46
|
+
nodes.end_col,
|
|
47
|
+
nodes.properties,
|
|
48
|
+
bm25(nodes_fts) AS rank
|
|
49
|
+
FROM nodes_fts
|
|
50
|
+
JOIN nodes ON nodes.id = nodes_fts.node_id
|
|
51
|
+
WHERE nodes_fts MATCH ?
|
|
52
|
+
ORDER BY rank ASC, nodes.file_path ASC, nodes.start_line ASC
|
|
53
|
+
LIMIT ?
|
|
54
|
+
`);
|
|
55
|
+
const rows = (normalizedType
|
|
56
|
+
? statement.all(ftsQuery, normalizedType, maxResults)
|
|
57
|
+
: statement.all(ftsQuery, maxResults));
|
|
58
|
+
return rows.map((row) => {
|
|
59
|
+
const properties = (0, types_1.safeParseProperties)(row.properties);
|
|
60
|
+
return {
|
|
61
|
+
id: row.id,
|
|
62
|
+
name: row.name,
|
|
63
|
+
type: row.type,
|
|
64
|
+
filePath: row.file_path,
|
|
65
|
+
startLine: row.start_line,
|
|
66
|
+
endLine: row.end_line,
|
|
67
|
+
startCol: row.start_col,
|
|
68
|
+
endCol: row.end_col,
|
|
69
|
+
exported: Boolean(properties.isExported),
|
|
70
|
+
signature: typeof properties.signature === "string" ? properties.signature : null,
|
|
71
|
+
rank: row.rank
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=search-symbols.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-symbols.js","sourceRoot":"","sources":["../../src/query/search-symbols.ts"],"names":[],"mappings":";;AAoBA,sCA6EC;AAhGD,mCAIiB;AAejB,SAAgB,aAAa,CAC3B,EAAqB,EACrB,KAAa,EACb,OAAgD;IAEhD,MAAM,cAAc,GAAG,IAAA,+BAAuB,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IACzE,2EAA2E;IAC3E,4EAA4E;IAC5E,wDAAwD;IACxD,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;QACtC,CAAC,CAAC,QAAQ,SAAS,EAAE;QACrB,CAAC,CAAC,QAAQ,SAAS,GAAG,CAAC;IAEzB,MAAM,SAAS,GAAG,cAAc;QAC9B,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;KAiBZ,CAAC;QACF,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;KAiBZ,CAAC,CAAC;IAEL,MAAM,IAAI,GAAG,CAAC,cAAc;QAC1B,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC;QACrD,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAU,CAAC;IAElD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,MAAM,UAAU,GAAG,IAAA,2BAAmB,EAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEvD,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;YACrB,QAAQ,EAAE,GAAG,CAAC,SAAS;YACvB,MAAM,EAAE,GAAG,CAAC,OAAO;YACnB,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;YACxC,SAAS,EAAE,OAAO,UAAU,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YACjF,IAAI,EAAE,GAAG,CAAC,IAAI;SACc,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC"}
|