ts-knowledge-graph 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/.env-sample +34 -0
  2. package/LICENSE +21 -0
  3. package/README.md +153 -0
  4. package/dist/agent/agent-tools.d.ts +13 -0
  5. package/dist/agent/agent-tools.d.ts.map +1 -0
  6. package/dist/agent/agent-tools.js +153 -0
  7. package/dist/agent/agent-tools.js.map +1 -0
  8. package/dist/agent/code-editor.d.ts +18 -0
  9. package/dist/agent/code-editor.d.ts.map +1 -0
  10. package/dist/agent/code-editor.js +43 -0
  11. package/dist/agent/code-editor.js.map +1 -0
  12. package/dist/agent/optimizer-agent.d.ts +30 -0
  13. package/dist/agent/optimizer-agent.d.ts.map +1 -0
  14. package/dist/agent/optimizer-agent.js +97 -0
  15. package/dist/agent/optimizer-agent.js.map +1 -0
  16. package/dist/agent/verifier.d.ts +9 -0
  17. package/dist/agent/verifier.d.ts.map +1 -0
  18. package/dist/agent/verifier.js +19 -0
  19. package/dist/agent/verifier.js.map +1 -0
  20. package/dist/cli.d.ts +14 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +221 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/extract/graph-builder.d.ts +16 -0
  25. package/dist/extract/graph-builder.d.ts.map +1 -0
  26. package/dist/extract/graph-builder.js +39 -0
  27. package/dist/extract/graph-builder.js.map +1 -0
  28. package/dist/extract/node-id.d.ts +8 -0
  29. package/dist/extract/node-id.d.ts.map +1 -0
  30. package/dist/extract/node-id.js +22 -0
  31. package/dist/extract/node-id.js.map +1 -0
  32. package/dist/extract/project-loader.d.ts +5 -0
  33. package/dist/extract/project-loader.d.ts.map +1 -0
  34. package/dist/extract/project-loader.js +19 -0
  35. package/dist/extract/project-loader.js.map +1 -0
  36. package/dist/extract/semantic-extractor.d.ts +22 -0
  37. package/dist/extract/semantic-extractor.d.ts.map +1 -0
  38. package/dist/extract/semantic-extractor.js +254 -0
  39. package/dist/extract/semantic-extractor.js.map +1 -0
  40. package/dist/extract/structural-extractor.d.ts +18 -0
  41. package/dist/extract/structural-extractor.d.ts.map +1 -0
  42. package/dist/extract/structural-extractor.js +97 -0
  43. package/dist/extract/structural-extractor.js.map +1 -0
  44. package/dist/query/graph-query.d.ts +28 -0
  45. package/dist/query/graph-query.d.ts.map +1 -0
  46. package/dist/query/graph-query.js +93 -0
  47. package/dist/query/graph-query.js.map +1 -0
  48. package/dist/schema/edge.d.ts +25 -0
  49. package/dist/schema/edge.d.ts.map +1 -0
  50. package/dist/schema/edge.js +25 -0
  51. package/dist/schema/edge.js.map +1 -0
  52. package/dist/schema/node.d.ts +73 -0
  53. package/dist/schema/node.d.ts.map +1 -0
  54. package/dist/schema/node.js +31 -0
  55. package/dist/schema/node.js.map +1 -0
  56. package/dist/store/jsonl-reader.d.ts +11 -0
  57. package/dist/store/jsonl-reader.d.ts.map +1 -0
  58. package/dist/store/jsonl-reader.js +19 -0
  59. package/dist/store/jsonl-reader.js.map +1 -0
  60. package/dist/store/jsonl-store.d.ts +7 -0
  61. package/dist/store/jsonl-store.d.ts.map +1 -0
  62. package/dist/store/jsonl-store.js +13 -0
  63. package/dist/store/jsonl-store.js.map +1 -0
  64. package/dist/store/kuzu-store.d.ts +14 -0
  65. package/dist/store/kuzu-store.d.ts.map +1 -0
  66. package/dist/store/kuzu-store.js +52 -0
  67. package/dist/store/kuzu-store.js.map +1 -0
  68. package/package.json +41 -0
@@ -0,0 +1,254 @@
1
+ import { Node, SyntaxKind, } from 'ts-morph';
2
+ import { NodeId } from './node-id.js';
3
+ const CALLABLE_TARGET_KINDS = new Set([
4
+ SyntaxKind.FunctionDeclaration,
5
+ SyntaxKind.MethodDeclaration,
6
+ SyntaxKind.MethodSignature,
7
+ SyntaxKind.VariableDeclaration,
8
+ ]);
9
+ const TYPE_DECL_KINDS = new Set([
10
+ SyntaxKind.ClassDeclaration,
11
+ SyntaxKind.InterfaceDeclaration,
12
+ SyntaxKind.TypeAliasDeclaration,
13
+ SyntaxKind.EnumDeclaration,
14
+ ]);
15
+ const VALUE_DECL_KINDS = new Set([
16
+ SyntaxKind.VariableDeclaration,
17
+ SyntaxKind.FunctionDeclaration,
18
+ SyntaxKind.ClassDeclaration,
19
+ SyntaxKind.EnumDeclaration,
20
+ ]);
21
+ const SCOPE_KINDS = new Set([
22
+ SyntaxKind.FunctionDeclaration,
23
+ SyntaxKind.MethodDeclaration,
24
+ SyntaxKind.PropertyDeclaration,
25
+ SyntaxKind.PropertySignature,
26
+ SyntaxKind.VariableDeclaration,
27
+ SyntaxKind.TypeAliasDeclaration,
28
+ SyntaxKind.EnumDeclaration,
29
+ SyntaxKind.ClassDeclaration,
30
+ SyntaxKind.InterfaceDeclaration,
31
+ ]);
32
+ export class SemanticExtractor {
33
+ static extract(sourceFile, rootPath) {
34
+ const edges = [];
35
+ for (const cls of sourceFile.getClasses()) {
36
+ SemanticExtractor.extractClass(cls, rootPath, edges);
37
+ }
38
+ for (const iface of sourceFile.getInterfaces()) {
39
+ SemanticExtractor.extractInterface(iface, rootPath, edges);
40
+ }
41
+ for (const fn of sourceFile.getFunctions()) {
42
+ SemanticExtractor.extractSignature(fn, rootPath, edges);
43
+ }
44
+ for (const variable of sourceFile.getVariableDeclarations()) {
45
+ SemanticExtractor.addTypeEdges(NodeId.forDeclaration(variable, rootPath), variable.getTypeNode(), 'USES_TYPE', rootPath, edges);
46
+ }
47
+ for (const alias of sourceFile.getTypeAliases()) {
48
+ SemanticExtractor.addTypeEdges(NodeId.forDeclaration(alias, rootPath), alias.getTypeNode(), 'USES_TYPE', rootPath, edges);
49
+ }
50
+ SemanticExtractor.extractCalls(sourceFile, rootPath, edges);
51
+ SemanticExtractor.extractInstantiations(sourceFile, rootPath, edges);
52
+ SemanticExtractor.extractReads(sourceFile, rootPath, edges);
53
+ return { nodes: [], edges };
54
+ }
55
+ static extractClass(cls, rootPath, edges) {
56
+ const classId = NodeId.forDeclaration(cls, rootPath);
57
+ const base = cls.getBaseClass();
58
+ if (base !== undefined && SemanticExtractor.inProject(base) === true) {
59
+ edges.push(SemanticExtractor.edge('EXTENDS', classId, NodeId.forDeclaration(base, rootPath)));
60
+ }
61
+ for (const impl of cls.getImplements()) {
62
+ const decl = SemanticExtractor.resolve(impl.getExpression());
63
+ if (decl !== undefined && SemanticExtractor.inProject(decl) === true) {
64
+ edges.push(SemanticExtractor.edge('IMPLEMENTS', classId, NodeId.forDeclaration(decl, rootPath)));
65
+ }
66
+ }
67
+ for (const method of cls.getMethods()) {
68
+ SemanticExtractor.extractSignature(method, rootPath, edges);
69
+ }
70
+ for (const property of cls.getProperties()) {
71
+ SemanticExtractor.addTypeEdges(NodeId.forDeclaration(property, rootPath), property.getTypeNode(), 'USES_TYPE', rootPath, edges);
72
+ }
73
+ }
74
+ static extractInterface(iface, rootPath, edges) {
75
+ const ifaceId = NodeId.forDeclaration(iface, rootPath);
76
+ for (const base of iface.getBaseDeclarations()) {
77
+ if (SemanticExtractor.inProject(base) === true) {
78
+ edges.push(SemanticExtractor.edge('EXTENDS', ifaceId, NodeId.forDeclaration(base, rootPath)));
79
+ }
80
+ }
81
+ for (const method of iface.getMethods()) {
82
+ SemanticExtractor.extractSignature(method, rootPath, edges);
83
+ }
84
+ for (const property of iface.getProperties()) {
85
+ SemanticExtractor.addTypeEdges(NodeId.forDeclaration(property, rootPath), property.getTypeNode(), 'USES_TYPE', rootPath, edges);
86
+ }
87
+ }
88
+ static extractSignature(node, rootPath, edges) {
89
+ const id = NodeId.forDeclaration(node, rootPath);
90
+ SemanticExtractor.addTypeEdges(id, node.getReturnTypeNode(), 'RETURNS', rootPath, edges);
91
+ for (const parameter of node.getParameters()) {
92
+ SemanticExtractor.addTypeEdges(id, parameter.getTypeNode(), 'PARAM_TYPE', rootPath, edges);
93
+ }
94
+ }
95
+ static addTypeEdges(fromId, typeNode, kind, rootPath, edges) {
96
+ if (typeNode === undefined) {
97
+ return;
98
+ }
99
+ for (const decl of SemanticExtractor.referencedTypes(typeNode)) {
100
+ if (SemanticExtractor.inProject(decl) === false || TYPE_DECL_KINDS.has(decl.getKind()) === false) {
101
+ continue;
102
+ }
103
+ edges.push(SemanticExtractor.edge(kind, fromId, NodeId.forDeclaration(decl, rootPath)));
104
+ }
105
+ }
106
+ static referencedTypes(typeNode) {
107
+ const references = typeNode.getDescendantsOfKind(SyntaxKind.TypeReference);
108
+ const self = typeNode.asKind(SyntaxKind.TypeReference);
109
+ if (self !== undefined) {
110
+ references.unshift(self);
111
+ }
112
+ const declarations = [];
113
+ for (const reference of references) {
114
+ const symbol = reference.getTypeName().getSymbol();
115
+ const resolved = symbol?.getAliasedSymbol() ?? symbol;
116
+ const declaration = resolved?.getDeclarations()[0];
117
+ if (declaration !== undefined) {
118
+ declarations.push(declaration);
119
+ }
120
+ }
121
+ return declarations;
122
+ }
123
+ static extractCalls(sourceFile, rootPath, edges) {
124
+ for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {
125
+ const caller = SemanticExtractor.enclosingDeclaration(call);
126
+ if (caller === undefined) {
127
+ continue;
128
+ }
129
+ const callee = SemanticExtractor.resolve(call.getExpression());
130
+ if (callee === undefined || SemanticExtractor.inProject(callee) === false) {
131
+ continue;
132
+ }
133
+ if (CALLABLE_TARGET_KINDS.has(callee.getKind()) === false) {
134
+ continue;
135
+ }
136
+ edges.push(SemanticExtractor.edge('CALLS', NodeId.forDeclaration(caller, rootPath), NodeId.forDeclaration(callee, rootPath)));
137
+ }
138
+ }
139
+ static extractInstantiations(sourceFile, rootPath, edges) {
140
+ for (const expression of sourceFile.getDescendantsOfKind(SyntaxKind.NewExpression)) {
141
+ const caller = SemanticExtractor.enclosingDeclaration(expression);
142
+ if (caller === undefined) {
143
+ continue;
144
+ }
145
+ const target = SemanticExtractor.resolve(expression.getExpression());
146
+ if (target === undefined || SemanticExtractor.inProject(target) === false) {
147
+ continue;
148
+ }
149
+ if (target.getKind() !== SyntaxKind.ClassDeclaration) {
150
+ continue;
151
+ }
152
+ edges.push(SemanticExtractor.edge('INSTANTIATES', NodeId.forDeclaration(caller, rootPath), NodeId.forDeclaration(target, rootPath)));
153
+ }
154
+ }
155
+ static extractReads(sourceFile, rootPath, edges) {
156
+ for (const identifier of sourceFile.getDescendantsOfKind(SyntaxKind.Identifier)) {
157
+ if (SemanticExtractor.isValueRead(identifier) === false) {
158
+ continue;
159
+ }
160
+ const target = SemanticExtractor.resolve(identifier);
161
+ if (target === undefined || SemanticExtractor.inProject(target) === false) {
162
+ continue;
163
+ }
164
+ if (VALUE_DECL_KINDS.has(target.getKind()) === false || SemanticExtractor.isEmittedTarget(target) === false) {
165
+ continue;
166
+ }
167
+ if (SemanticExtractor.isDeclarationName(identifier, target) === true) {
168
+ continue;
169
+ }
170
+ const scope = SemanticExtractor.readerScope(identifier);
171
+ if (scope === undefined) {
172
+ continue;
173
+ }
174
+ const fromId = NodeId.forDeclaration(scope, rootPath);
175
+ const toId = NodeId.forDeclaration(target, rootPath);
176
+ if (fromId !== toId) {
177
+ edges.push(SemanticExtractor.edge('READS', fromId, toId));
178
+ }
179
+ }
180
+ }
181
+ static isValueRead(identifier) {
182
+ if (identifier.getFirstAncestorByKind(SyntaxKind.ImportDeclaration) !== undefined) {
183
+ return false;
184
+ }
185
+ if (identifier.getFirstAncestorByKind(SyntaxKind.HeritageClause) !== undefined) {
186
+ return false;
187
+ }
188
+ const parent = identifier.getParent();
189
+ if (parent === undefined) {
190
+ return false;
191
+ }
192
+ if (Node.isPropertyAccessExpression(parent)) {
193
+ return parent.getNameNode() !== identifier;
194
+ }
195
+ if (Node.isQualifiedName(parent)) {
196
+ return parent.getRight() !== identifier;
197
+ }
198
+ if (Node.isCallExpression(parent) || Node.isNewExpression(parent)) {
199
+ return parent.getExpression() !== identifier;
200
+ }
201
+ if (Node.isPropertyAssignment(parent)) {
202
+ return parent.getNameNode() !== identifier;
203
+ }
204
+ if (Node.isTypeReference(parent) || Node.isPropertySignature(parent) || Node.isPropertyDeclaration(parent) || Node.isBindingElement(parent)) {
205
+ return false;
206
+ }
207
+ return true;
208
+ }
209
+ static isDeclarationName(identifier, declaration) {
210
+ const named = declaration;
211
+ return typeof named.getNameNode === 'function' && named.getNameNode() === identifier;
212
+ }
213
+ static isEmittedTarget(declaration) {
214
+ if (Node.isVariableDeclaration(declaration)) {
215
+ const statement = declaration.getVariableStatement();
216
+ return statement !== undefined && statement.getParent()?.getKind() === SyntaxKind.SourceFile;
217
+ }
218
+ return declaration.getParent()?.getKind() === SyntaxKind.SourceFile;
219
+ }
220
+ static readerScope(node) {
221
+ const executable = node.getFirstAncestor((ancestor) => {
222
+ const kind = ancestor.getKind();
223
+ return kind === SyntaxKind.FunctionDeclaration || kind === SyntaxKind.MethodDeclaration;
224
+ });
225
+ if (executable !== undefined) {
226
+ return executable;
227
+ }
228
+ return node.getFirstAncestor((ancestor) => SCOPE_KINDS.has(ancestor.getKind()));
229
+ }
230
+ static enclosingDeclaration(node) {
231
+ return node.getFirstAncestor((ancestor) => {
232
+ const kind = ancestor.getKind();
233
+ return kind === SyntaxKind.FunctionDeclaration || kind === SyntaxKind.MethodDeclaration;
234
+ });
235
+ }
236
+ static resolve(node) {
237
+ const symbol = node.getSymbol();
238
+ if (symbol === undefined) {
239
+ return undefined;
240
+ }
241
+ const resolved = symbol.getAliasedSymbol() ?? symbol;
242
+ const declarations = resolved.getDeclarations();
243
+ return declarations.length === 0 ? undefined : declarations[0];
244
+ }
245
+ static inProject(node) {
246
+ const sourceFile = node.getSourceFile();
247
+ return sourceFile.getFilePath().includes('/node_modules/') === false
248
+ && sourceFile.isDeclarationFile() === false;
249
+ }
250
+ static edge(kind, from, to) {
251
+ return { id: `${kind}:${from}->${to}`, kind, from, to };
252
+ }
253
+ }
254
+ //# sourceMappingURL=semantic-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-extractor.js","sourceRoot":"","sources":["../../src/extract/semantic-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { SourceFile } from 'ts-morph';
2
+ import { GraphEdge } from '../schema/edge.js';
3
+ import { GraphNode } from '../schema/node.js';
4
+ export type Extraction = {
5
+ nodes: GraphNode[];
6
+ edges: GraphEdge[];
7
+ };
8
+ export declare class StructuralExtractor {
9
+ static extract(sourceFile: SourceFile, rootPath: string): Extraction;
10
+ private static extractImports;
11
+ private static extractClass;
12
+ private static extractInterface;
13
+ private static push;
14
+ private static isInternal;
15
+ private static isExported;
16
+ private static edge;
17
+ }
18
+ //# sourceMappingURL=structural-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural-extractor.d.ts","sourceRoot":"","sources":["../../src/extract/structural-extractor.ts"],"names":[],"mappings":"AACA,OAAO,EAIN,UAAU,EACV,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAY,MAAM,mBAAmB,CAAC;AAGxD,MAAM,MAAM,UAAU,GAAG;IACxB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;CACnB,CAAC;AAEF,qBAAa,mBAAmB;IAC/B,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU;IAgCpE,OAAO,CAAC,MAAM,CAAC,cAAc;IAqB7B,OAAO,CAAC,MAAM,CAAC,YAAY;IAgB3B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAgB/B,OAAO,CAAC,MAAM,CAAC,IAAI;IA0BnB,OAAO,CAAC,MAAM,CAAC,UAAU;IAKzB,OAAO,CAAC,MAAM,CAAC,UAAU;IAKzB,OAAO,CAAC,MAAM,CAAC,IAAI;CAYnB"}
@@ -0,0 +1,97 @@
1
+ import { relative } from 'node:path';
2
+ import { NodeId } from './node-id.js';
3
+ export class StructuralExtractor {
4
+ static extract(sourceFile, rootPath) {
5
+ const nodes = [];
6
+ const edges = [];
7
+ const filePath = relative(rootPath, sourceFile.getFilePath());
8
+ const moduleId = NodeId.forModule(sourceFile.getFilePath(), rootPath);
9
+ nodes.push({ id: moduleId, kind: 'Module', name: filePath, filePath });
10
+ StructuralExtractor.extractImports(sourceFile, moduleId, rootPath, nodes, edges);
11
+ for (const cls of sourceFile.getClasses()) {
12
+ StructuralExtractor.extractClass(cls, moduleId, rootPath, nodes, edges);
13
+ }
14
+ for (const iface of sourceFile.getInterfaces()) {
15
+ StructuralExtractor.extractInterface(iface, moduleId, rootPath, nodes, edges);
16
+ }
17
+ for (const alias of sourceFile.getTypeAliases()) {
18
+ StructuralExtractor.push(alias, 'TypeAlias', moduleId, rootPath, nodes, edges);
19
+ }
20
+ for (const en of sourceFile.getEnums()) {
21
+ StructuralExtractor.push(en, 'Enum', moduleId, rootPath, nodes, edges);
22
+ }
23
+ for (const fn of sourceFile.getFunctions()) {
24
+ StructuralExtractor.push(fn, 'Function', moduleId, rootPath, nodes, edges);
25
+ }
26
+ for (const variable of sourceFile.getVariableDeclarations()) {
27
+ StructuralExtractor.push(variable, 'Variable', moduleId, rootPath, nodes, edges);
28
+ }
29
+ return { nodes, edges };
30
+ }
31
+ static extractImports(sourceFile, moduleId, rootPath, nodes, edges) {
32
+ for (const decl of sourceFile.getImportDeclarations()) {
33
+ const specifier = decl.getModuleSpecifierValue();
34
+ const target = decl.getModuleSpecifierSourceFile();
35
+ if (target !== undefined && StructuralExtractor.isInternal(target) === true) {
36
+ const targetId = NodeId.forModule(target.getFilePath(), rootPath);
37
+ edges.push(StructuralExtractor.edge('IMPORTS', moduleId, targetId, { specifier }));
38
+ continue;
39
+ }
40
+ const externalId = NodeId.forExternalModule(specifier);
41
+ nodes.push({ id: externalId, kind: 'ExternalModule', name: specifier, filePath: specifier });
42
+ edges.push(StructuralExtractor.edge('IMPORTS', moduleId, externalId, { specifier }));
43
+ }
44
+ }
45
+ static extractClass(cls, moduleId, rootPath, nodes, edges) {
46
+ const classId = StructuralExtractor.push(cls, 'Class', moduleId, rootPath, nodes, edges);
47
+ for (const method of cls.getMethods()) {
48
+ StructuralExtractor.push(method, 'Method', classId, rootPath, nodes, edges);
49
+ }
50
+ for (const property of cls.getProperties()) {
51
+ StructuralExtractor.push(property, 'Property', classId, rootPath, nodes, edges);
52
+ }
53
+ }
54
+ static extractInterface(iface, moduleId, rootPath, nodes, edges) {
55
+ const ifaceId = StructuralExtractor.push(iface, 'Interface', moduleId, rootPath, nodes, edges);
56
+ for (const method of iface.getMethods()) {
57
+ StructuralExtractor.push(method, 'Method', ifaceId, rootPath, nodes, edges);
58
+ }
59
+ for (const property of iface.getProperties()) {
60
+ StructuralExtractor.push(property, 'Property', ifaceId, rootPath, nodes, edges);
61
+ }
62
+ }
63
+ static push(node, kind, parentId, rootPath, nodes, edges) {
64
+ const id = NodeId.forDeclaration(node, rootPath);
65
+ nodes.push({
66
+ id,
67
+ kind,
68
+ name: NodeId.nameOf(node),
69
+ filePath: relative(rootPath, node.getSourceFile().getFilePath()),
70
+ range: {
71
+ startLine: node.getStartLineNumber(),
72
+ startColumn: 0,
73
+ endLine: node.getEndLineNumber(),
74
+ endColumn: 0,
75
+ },
76
+ exported: StructuralExtractor.isExported(node),
77
+ });
78
+ edges.push(StructuralExtractor.edge('CONTAINS', parentId, id));
79
+ return id;
80
+ }
81
+ static isInternal(sourceFile) {
82
+ return sourceFile.getFilePath().includes('/node_modules/') === false
83
+ && sourceFile.isDeclarationFile() === false;
84
+ }
85
+ static isExported(node) {
86
+ const probe = node;
87
+ return typeof probe.isExported === 'function' ? probe.isExported() : false;
88
+ }
89
+ static edge(kind, from, to, metadata) {
90
+ const edge = { id: `${kind}:${from}->${to}`, kind, from, to };
91
+ if (metadata !== undefined) {
92
+ edge.metadata = metadata;
93
+ }
94
+ return edge;
95
+ }
96
+ }
97
+ //# sourceMappingURL=structural-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural-extractor.js","sourceRoot":"","sources":["../../src/extract/structural-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { KuzuStore } from '../store/kuzu-store.js';
2
+ export type SymbolRef = {
3
+ id: string;
4
+ kind: string;
5
+ name: string;
6
+ filePath: string;
7
+ startLine: number;
8
+ };
9
+ export type NeighborRef = SymbolRef & {
10
+ edgeKind: string;
11
+ direction: 'in' | 'out';
12
+ };
13
+ export declare class GraphQuery {
14
+ private readonly store;
15
+ constructor(store: KuzuStore);
16
+ whoCalls(id: string): Promise<SymbolRef[]>;
17
+ calls(id: string): Promise<SymbolRef[]>;
18
+ blastRadius(id: string, depth: number): Promise<SymbolRef[]>;
19
+ deadExports(): Promise<SymbolRef[]>;
20
+ references(id: string): Promise<NeighborRef[]>;
21
+ neighborhood(id: string): Promise<NeighborRef[]>;
22
+ find(pattern: string): Promise<SymbolRef[]>;
23
+ private static toRefs;
24
+ private static toRef;
25
+ private static toNeighbor;
26
+ private static clampDepth;
27
+ }
28
+ //# sourceMappingURL=graph-query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-query.d.ts","sourceRoot":"","sources":["../../src/query/graph-query.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,MAAM,SAAS,GAAG;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC;CACxB,CAAC;AAOF,qBAAa,UAAU;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;gBAEtB,KAAK,EAAE,SAAS;IAItB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAW1C,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAWvC,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAW5D,WAAW,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAiBnC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAW9C,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAiBhD,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAYjD,OAAO,CAAC,MAAM,CAAC,MAAM;IAIrB,OAAO,CAAC,MAAM,CAAC,KAAK;IAUpB,OAAO,CAAC,MAAM,CAAC,UAAU;IAIzB,OAAO,CAAC,MAAM,CAAC,UAAU;CAUzB"}
@@ -0,0 +1,93 @@
1
+ const REFERENCE_EDGE_KINDS = "['CALLS', 'IMPLEMENTS', 'EXTENDS', 'USES_TYPE', 'RETURNS', 'PARAM_TYPE', 'INSTANTIATES', 'READS']";
2
+ const RETURN_REF = (variable) => `${variable}.id AS id, ${variable}.kind AS kind, ${variable}.name AS name, ${variable}.filePath AS filePath, ${variable}.startLine AS startLine`;
3
+ export class GraphQuery {
4
+ constructor(store) {
5
+ this.store = store;
6
+ }
7
+ async whoCalls(id) {
8
+ const rows = await this.store.run(`MATCH (caller:GraphNode)-[e:Edge]->(callee:GraphNode {id: $id})
9
+ WHERE e.kind = 'CALLS'
10
+ RETURN ${RETURN_REF('caller')}
11
+ ORDER BY filePath, startLine`, { id });
12
+ return GraphQuery.toRefs(rows);
13
+ }
14
+ async calls(id) {
15
+ const rows = await this.store.run(`MATCH (caller:GraphNode {id: $id})-[e:Edge]->(callee:GraphNode)
16
+ WHERE e.kind = 'CALLS'
17
+ RETURN ${RETURN_REF('callee')}
18
+ ORDER BY filePath, startLine`, { id });
19
+ return GraphQuery.toRefs(rows);
20
+ }
21
+ async blastRadius(id, depth) {
22
+ const bound = GraphQuery.clampDepth(depth);
23
+ const rows = await this.store.run(`MATCH (target:GraphNode {id: $id})<-[e:Edge*1..${bound} (r, n | WHERE r.kind = 'CALLS')]-(impacted:GraphNode)
24
+ RETURN DISTINCT ${RETURN_REF('impacted')}
25
+ ORDER BY filePath, startLine`, { id });
26
+ return GraphQuery.toRefs(rows);
27
+ }
28
+ async deadExports() {
29
+ const rows = await this.store.run(`MATCH (n:GraphNode)
30
+ WHERE n.exported = true
31
+ OPTIONAL MATCH (n)<-[selfRef:Edge]-(:GraphNode)
32
+ WHERE selfRef.kind IN ${REFERENCE_EDGE_KINDS}
33
+ WITH n, count(selfRef) AS selfRefs
34
+ OPTIONAL MATCH (n)-[c:Edge]->(member:GraphNode)<-[memberRef:Edge]-(:GraphNode)
35
+ WHERE c.kind = 'CONTAINS' AND memberRef.kind IN ${REFERENCE_EDGE_KINDS}
36
+ WITH n, selfRefs, count(memberRef) AS memberRefs
37
+ WHERE selfRefs = 0 AND memberRefs = 0
38
+ RETURN ${RETURN_REF('n')}
39
+ ORDER BY filePath, startLine`);
40
+ return GraphQuery.toRefs(rows);
41
+ }
42
+ async references(id) {
43
+ const rows = await this.store.run(`MATCH (n:GraphNode {id: $id})<-[e:Edge]-(other:GraphNode)
44
+ WHERE e.kind IN ${REFERENCE_EDGE_KINDS}
45
+ RETURN ${RETURN_REF('other')}, e.kind AS edgeKind
46
+ ORDER BY edgeKind, filePath, startLine`, { id });
47
+ return rows.map((row) => GraphQuery.toNeighbor(row, 'in'));
48
+ }
49
+ async neighborhood(id) {
50
+ const outgoing = await this.store.run(`MATCH (center:GraphNode {id: $id})-[e:Edge]->(other:GraphNode)
51
+ RETURN ${RETURN_REF('other')}, e.kind AS edgeKind`, { id });
52
+ const incoming = await this.store.run(`MATCH (center:GraphNode {id: $id})<-[e:Edge]-(other:GraphNode)
53
+ RETURN ${RETURN_REF('other')}, e.kind AS edgeKind`, { id });
54
+ return [
55
+ ...outgoing.map((row) => GraphQuery.toNeighbor(row, 'out')),
56
+ ...incoming.map((row) => GraphQuery.toNeighbor(row, 'in')),
57
+ ];
58
+ }
59
+ async find(pattern) {
60
+ const rows = await this.store.run(`MATCH (n:GraphNode)
61
+ WHERE n.kind <> 'Module' AND lower(n.name) CONTAINS lower($pattern)
62
+ RETURN ${RETURN_REF('n')}
63
+ ORDER BY filePath, startLine
64
+ LIMIT 50`, { pattern });
65
+ return GraphQuery.toRefs(rows);
66
+ }
67
+ static toRefs(rows) {
68
+ return rows.map((row) => GraphQuery.toRef(row));
69
+ }
70
+ static toRef(row) {
71
+ return {
72
+ id: String(row.id),
73
+ kind: String(row.kind),
74
+ name: String(row.name),
75
+ filePath: String(row.filePath),
76
+ startLine: Number(row.startLine),
77
+ };
78
+ }
79
+ static toNeighbor(row, direction) {
80
+ return { ...GraphQuery.toRef(row), edgeKind: String(row.edgeKind), direction };
81
+ }
82
+ static clampDepth(depth) {
83
+ if (Number.isFinite(depth) === false) {
84
+ return 5;
85
+ }
86
+ const floored = Math.floor(depth);
87
+ if (floored < 1) {
88
+ return 1;
89
+ }
90
+ return floored > 50 ? 50 : floored;
91
+ }
92
+ }
93
+ //# sourceMappingURL=graph-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-query.js","sourceRoot":"","sources":["../../src/query/graph-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ export declare const EDGE_KINDS: readonly ["CONTAINS", "IMPORTS", "EXPORTS", "EXTENDS", "IMPLEMENTS", "USES_TYPE", "RETURNS", "PARAM_TYPE", "CALLS", "INSTANTIATES", "OVERRIDES", "READS", "WRITES"];
3
+ export declare const EdgeKindSchema: z.ZodEnum<["CONTAINS", "IMPORTS", "EXPORTS", "EXTENDS", "IMPLEMENTS", "USES_TYPE", "RETURNS", "PARAM_TYPE", "CALLS", "INSTANTIATES", "OVERRIDES", "READS", "WRITES"]>;
4
+ export type EdgeKind = z.infer<typeof EdgeKindSchema>;
5
+ export declare const GraphEdgeSchema: z.ZodObject<{
6
+ id: z.ZodString;
7
+ kind: z.ZodEnum<["CONTAINS", "IMPORTS", "EXPORTS", "EXTENDS", "IMPLEMENTS", "USES_TYPE", "RETURNS", "PARAM_TYPE", "CALLS", "INSTANTIATES", "OVERRIDES", "READS", "WRITES"]>;
8
+ from: z.ZodString;
9
+ to: z.ZodString;
10
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
11
+ }, "strip", z.ZodTypeAny, {
12
+ id: string;
13
+ kind: "CONTAINS" | "IMPORTS" | "EXPORTS" | "EXTENDS" | "IMPLEMENTS" | "USES_TYPE" | "RETURNS" | "PARAM_TYPE" | "CALLS" | "INSTANTIATES" | "OVERRIDES" | "READS" | "WRITES";
14
+ from: string;
15
+ to: string;
16
+ metadata?: Record<string, unknown> | undefined;
17
+ }, {
18
+ id: string;
19
+ kind: "CONTAINS" | "IMPORTS" | "EXPORTS" | "EXTENDS" | "IMPLEMENTS" | "USES_TYPE" | "RETURNS" | "PARAM_TYPE" | "CALLS" | "INSTANTIATES" | "OVERRIDES" | "READS" | "WRITES";
20
+ from: string;
21
+ to: string;
22
+ metadata?: Record<string, unknown> | undefined;
23
+ }>;
24
+ export type GraphEdge = z.infer<typeof GraphEdgeSchema>;
25
+ //# sourceMappingURL=edge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge.d.ts","sourceRoot":"","sources":["../../src/schema/edge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,UAAU,qKAcb,CAAC;AAEX,eAAO,MAAM,cAAc,uKAAqB,CAAC;AACjD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;EAM1B,CAAC;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { z } from 'zod';
2
+ export const EDGE_KINDS = [
3
+ 'CONTAINS',
4
+ 'IMPORTS',
5
+ 'EXPORTS',
6
+ 'EXTENDS',
7
+ 'IMPLEMENTS',
8
+ 'USES_TYPE',
9
+ 'RETURNS',
10
+ 'PARAM_TYPE',
11
+ 'CALLS',
12
+ 'INSTANTIATES',
13
+ 'OVERRIDES',
14
+ 'READS',
15
+ 'WRITES',
16
+ ];
17
+ export const EdgeKindSchema = z.enum(EDGE_KINDS);
18
+ export const GraphEdgeSchema = z.object({
19
+ id: z.string(),
20
+ kind: EdgeKindSchema,
21
+ from: z.string(),
22
+ to: z.string(),
23
+ metadata: z.record(z.unknown()).optional(),
24
+ });
25
+ //# sourceMappingURL=edge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge.js","sourceRoot":"","sources":["../../src/schema/edge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,UAAU;IACV,SAAS;IACT,SAAS;IACT,SAAS;IACT,YAAY;IACZ,WAAW;IACX,SAAS;IACT,YAAY;IACZ,OAAO;IACP,cAAc;IACd,WAAW;IACX,OAAO;IACP,QAAQ;CACC,CAAC;AAEX,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAGjD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,IAAI,EAAE,cAAc;IACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC"}