repo-codegraph 0.0.0-stage → 0.2.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 (74) hide show
  1. package/README.md +462 -2
  2. package/dist/analyzer/analyzeProject.d.ts +17 -0
  3. package/dist/analyzer/analyzeProject.d.ts.map +1 -0
  4. package/dist/analyzer/analyzeProject.js +338 -0
  5. package/dist/analyzer/analyzeProject.js.map +1 -0
  6. package/dist/analyzer/buildDefinitionGraph.d.ts +47 -0
  7. package/dist/analyzer/buildDefinitionGraph.d.ts.map +1 -0
  8. package/dist/analyzer/buildDefinitionGraph.js +60 -0
  9. package/dist/analyzer/buildDefinitionGraph.js.map +1 -0
  10. package/dist/analyzer/incrementalIndex.d.ts +21 -0
  11. package/dist/analyzer/incrementalIndex.d.ts.map +1 -0
  12. package/dist/analyzer/incrementalIndex.js +115 -0
  13. package/dist/analyzer/incrementalIndex.js.map +1 -0
  14. package/dist/cli.d.ts +3 -0
  15. package/dist/cli.d.ts.map +1 -0
  16. package/dist/cli.js +249 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/files/discoverSourceFiles.d.ts +8 -0
  19. package/dist/files/discoverSourceFiles.d.ts.map +1 -0
  20. package/dist/files/discoverSourceFiles.js +46 -0
  21. package/dist/files/discoverSourceFiles.js.map +1 -0
  22. package/dist/git/diffImpact.d.ts +22 -0
  23. package/dist/git/diffImpact.d.ts.map +1 -0
  24. package/dist/git/diffImpact.js +113 -0
  25. package/dist/git/diffImpact.js.map +1 -0
  26. package/dist/graph/DirectedGraph.d.ts +44 -0
  27. package/dist/graph/DirectedGraph.d.ts.map +1 -0
  28. package/dist/graph/DirectedGraph.js +258 -0
  29. package/dist/graph/DirectedGraph.js.map +1 -0
  30. package/dist/graph/types.d.ts +13 -0
  31. package/dist/graph/types.d.ts.map +1 -0
  32. package/dist/graph/types.js +2 -0
  33. package/dist/graph/types.js.map +1 -0
  34. package/dist/index.d.ts +21 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +13 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/mcp/projectSession.d.ts +18 -0
  39. package/dist/mcp/projectSession.d.ts.map +1 -0
  40. package/dist/mcp/projectSession.js +86 -0
  41. package/dist/mcp/projectSession.js.map +1 -0
  42. package/dist/mcp/server.d.ts +23 -0
  43. package/dist/mcp/server.d.ts.map +1 -0
  44. package/dist/mcp/server.js +512 -0
  45. package/dist/mcp/server.js.map +1 -0
  46. package/dist/mcp/stdio.d.ts +3 -0
  47. package/dist/mcp/stdio.d.ts.map +1 -0
  48. package/dist/mcp/stdio.js +35 -0
  49. package/dist/mcp/stdio.js.map +1 -0
  50. package/dist/parser/extractDeclarations.d.ts +30 -0
  51. package/dist/parser/extractDeclarations.d.ts.map +1 -0
  52. package/dist/parser/extractDeclarations.js +83 -0
  53. package/dist/parser/extractDeclarations.js.map +1 -0
  54. package/dist/parser/parseSourceFile.d.ts +4 -0
  55. package/dist/parser/parseSourceFile.d.ts.map +1 -0
  56. package/dist/parser/parseSourceFile.js +9 -0
  57. package/dist/parser/parseSourceFile.js.map +1 -0
  58. package/dist/persistence/jsonPersistence.d.ts +7 -0
  59. package/dist/persistence/jsonPersistence.d.ts.map +1 -0
  60. package/dist/persistence/jsonPersistence.js +98 -0
  61. package/dist/persistence/jsonPersistence.js.map +1 -0
  62. package/dist/queries/analyzeImpact.d.ts +14 -0
  63. package/dist/queries/analyzeImpact.d.ts.map +1 -0
  64. package/dist/queries/analyzeImpact.js +56 -0
  65. package/dist/queries/analyzeImpact.js.map +1 -0
  66. package/dist/queries/codeGraphQueries.d.ts +7 -0
  67. package/dist/queries/codeGraphQueries.d.ts.map +1 -0
  68. package/dist/queries/codeGraphQueries.js +86 -0
  69. package/dist/queries/codeGraphQueries.js.map +1 -0
  70. package/dist/visualization/viewer.d.ts +17 -0
  71. package/dist/visualization/viewer.d.ts.map +1 -0
  72. package/dist/visualization/viewer.js +349 -0
  73. package/dist/visualization/viewer.js.map +1 -0
  74. package/package.json +55 -3
@@ -0,0 +1,338 @@
1
+ import path from "node:path";
2
+ import { createHash } from "node:crypto";
3
+ import { readFile } from "node:fs/promises";
4
+ import ts from "typescript";
5
+ import { discoverSourceFiles } from "../files/discoverSourceFiles.js";
6
+ import { buildDefinitionGraph, createFileNodeId, } from "./buildDefinitionGraph.js";
7
+ export async function analyzeProject(rootDirectory) {
8
+ const absoluteRoot = path.resolve(rootDirectory);
9
+ const relativeFiles = await discoverSourceFiles(absoluteRoot);
10
+ const rootNames = relativeFiles.map((file) => path.join(absoluteRoot, file));
11
+ const fileHashes = await hashSourceFiles(absoluteRoot, relativeFiles);
12
+ const compilerOptions = readCompilerOptions(absoluteRoot);
13
+ const program = ts.createProgram({ rootNames, options: compilerOptions });
14
+ const checker = program.getTypeChecker();
15
+ const projectFilesByCanonicalName = new Map();
16
+ for (const sourceFile of program.getSourceFiles()) {
17
+ const canonicalName = canonicalPath(sourceFile.fileName);
18
+ if (rootNames.some((rootName) => canonicalPath(rootName) === canonicalName)) {
19
+ projectFilesByCanonicalName.set(canonicalName, sourceFile);
20
+ }
21
+ }
22
+ const sourceFiles = [...projectFilesByCanonicalName.values()];
23
+ const filePathFor = (sourceFile) => toProjectPath(absoluteRoot, sourceFile.fileName);
24
+ const graph = buildDefinitionGraph(sourceFiles, {
25
+ getFilePath: filePathFor,
26
+ });
27
+ const diagnostics = compilerDiagnostics(program, absoluteRoot);
28
+ const symbolNodesByLocation = indexSymbolNodesByLocation(graph);
29
+ addImportEdges(graph, sourceFiles, projectFilesByCanonicalName, compilerOptions, absoluteRoot, diagnostics);
30
+ addCallEdges(graph, sourceFiles, checker, symbolNodesByLocation, absoluteRoot, diagnostics);
31
+ return { rootDirectory: absoluteRoot, graph, diagnostics, fileHashes };
32
+ }
33
+ async function hashSourceFiles(rootDirectory, relativeFiles) {
34
+ const entries = await Promise.all(relativeFiles.map(async (filePath) => {
35
+ const contents = await readFile(path.join(rootDirectory, filePath));
36
+ return [filePath, createHash("sha256").update(contents).digest("hex")];
37
+ }));
38
+ return Object.fromEntries(entries);
39
+ }
40
+ function readCompilerOptions(rootDirectory) {
41
+ const defaults = {
42
+ target: ts.ScriptTarget.ES2022,
43
+ module: ts.ModuleKind.NodeNext,
44
+ moduleResolution: ts.ModuleResolutionKind.NodeNext,
45
+ jsx: ts.JsxEmit.Preserve,
46
+ skipLibCheck: true,
47
+ };
48
+ const configPath = ts.findConfigFile(rootDirectory, ts.sys.fileExists);
49
+ if (configPath === undefined) {
50
+ return defaults;
51
+ }
52
+ const loaded = ts.readConfigFile(configPath, ts.sys.readFile);
53
+ if (loaded.error !== undefined) {
54
+ throw new Error(formatDiagnostic(loaded.error, rootDirectory));
55
+ }
56
+ const parsed = ts.parseJsonConfigFileContent(loaded.config, ts.sys, path.dirname(configPath));
57
+ if (parsed.errors.length > 0) {
58
+ throw new Error(parsed.errors.map((error) => formatDiagnostic(error, rootDirectory)).join("\n"));
59
+ }
60
+ return { ...defaults, ...parsed.options };
61
+ }
62
+ function addImportEdges(graph, sourceFiles, projectFilesByCanonicalName, compilerOptions, rootDirectory, diagnostics) {
63
+ for (const sourceFile of sourceFiles) {
64
+ const sourcePath = toProjectPath(rootDirectory, sourceFile.fileName);
65
+ const sourceId = createFileNodeId(sourcePath);
66
+ for (const statement of sourceFile.statements) {
67
+ const moduleReference = getModuleReference(statement);
68
+ if (moduleReference === null) {
69
+ continue;
70
+ }
71
+ const resolved = ts.resolveModuleName(moduleReference.specifier, sourceFile.fileName, compilerOptions, ts.sys).resolvedModule;
72
+ const location = locationFor(sourceFile, moduleReference.node, sourcePath);
73
+ if (resolved === undefined) {
74
+ if (!isRelativeModuleSpecifier(moduleReference.specifier)) {
75
+ continue;
76
+ }
77
+ diagnostics.push({
78
+ kind: "unresolved-import",
79
+ message: `Could not resolve module '${moduleReference.specifier}'`,
80
+ ...location,
81
+ });
82
+ continue;
83
+ }
84
+ const targetFile = projectFilesByCanonicalName.get(canonicalPath(resolved.resolvedFileName));
85
+ if (targetFile === undefined) {
86
+ continue;
87
+ }
88
+ const targetId = createFileNodeId(toProjectPath(rootDirectory, targetFile.fileName));
89
+ if (graph.hasEdge(sourceId, targetId, "IMPORTS")) {
90
+ continue;
91
+ }
92
+ const data = {
93
+ relationship: "IMPORTS",
94
+ confidence: "exact",
95
+ provenance: "typescript-module-resolution",
96
+ moduleSpecifier: moduleReference.specifier,
97
+ importKind: moduleReference.kind,
98
+ };
99
+ graph.addEdge({ from: sourceId, to: targetId, type: "IMPORTS", data });
100
+ }
101
+ }
102
+ }
103
+ function getModuleReference(statement) {
104
+ if (ts.isExportDeclaration(statement) &&
105
+ statement.moduleSpecifier !== undefined &&
106
+ ts.isStringLiteral(statement.moduleSpecifier)) {
107
+ return {
108
+ node: statement.moduleSpecifier,
109
+ specifier: statement.moduleSpecifier.text,
110
+ kind: "re-export",
111
+ };
112
+ }
113
+ if (!ts.isImportDeclaration(statement) || !ts.isStringLiteral(statement.moduleSpecifier)) {
114
+ return null;
115
+ }
116
+ const clause = statement.importClause;
117
+ let kind;
118
+ if (clause === undefined) {
119
+ kind = "side-effect";
120
+ }
121
+ else if (clause.name !== undefined && clause.namedBindings !== undefined) {
122
+ kind = "mixed";
123
+ }
124
+ else if (clause.name !== undefined) {
125
+ kind = "default";
126
+ }
127
+ else if (clause.namedBindings !== undefined && ts.isNamespaceImport(clause.namedBindings)) {
128
+ kind = "namespace";
129
+ }
130
+ else {
131
+ kind = "named";
132
+ }
133
+ return {
134
+ node: statement.moduleSpecifier,
135
+ specifier: statement.moduleSpecifier.text,
136
+ kind,
137
+ };
138
+ }
139
+ function addCallEdges(graph, sourceFiles, checker, symbolNodesByLocation, rootDirectory, diagnostics) {
140
+ for (const sourceFile of sourceFiles) {
141
+ const filePath = toProjectPath(rootDirectory, sourceFile.fileName);
142
+ function visit(node) {
143
+ if (ts.isCallExpression(node)) {
144
+ addCallEdge(node, sourceFile, filePath, graph, checker, symbolNodesByLocation, rootDirectory, diagnostics);
145
+ }
146
+ ts.forEachChild(node, visit);
147
+ }
148
+ visit(sourceFile);
149
+ }
150
+ }
151
+ function addCallEdge(call, sourceFile, filePath, graph, checker, symbolNodesByLocation, rootDirectory, diagnostics) {
152
+ const callLocation = locationFor(sourceFile, call.expression, filePath);
153
+ const targetDeclarations = resolvedCallDeclarations(call, checker);
154
+ const targetIds = new Map();
155
+ let hasInternalTarget = false;
156
+ for (const declaration of targetDeclarations) {
157
+ const name = declarationNameNode(declaration);
158
+ const targetSourceFile = declaration.getSourceFile();
159
+ if (!isInsideRoot(rootDirectory, targetSourceFile.fileName)) {
160
+ continue;
161
+ }
162
+ const targetPath = toProjectPath(rootDirectory, targetSourceFile.fileName);
163
+ if (graph.getNode(createFileNodeId(targetPath)) === undefined) {
164
+ continue;
165
+ }
166
+ hasInternalTarget = true;
167
+ if (name === undefined) {
168
+ continue;
169
+ }
170
+ const targetId = symbolNodesByLocation.get(nodeLocationKey(targetSourceFile, name, targetPath))?.id;
171
+ if (targetId !== undefined) {
172
+ targetIds.set(targetId, declaration);
173
+ }
174
+ }
175
+ if (targetIds.size === 0) {
176
+ if (targetDeclarations.length > 0 && !hasInternalTarget) {
177
+ return;
178
+ }
179
+ diagnostics.push({
180
+ kind: targetDeclarations.length === 0 ? "unresolved-call" : "external-call",
181
+ message: `Could not map call '${call.expression.getText(sourceFile)}' to an indexed declaration`,
182
+ ...callLocation,
183
+ });
184
+ return;
185
+ }
186
+ if (targetIds.size > 1) {
187
+ diagnostics.push({
188
+ kind: "ambiguous-call",
189
+ message: `Call '${call.expression.getText(sourceFile)}' has ${targetIds.size} possible indexed targets`,
190
+ ...callLocation,
191
+ });
192
+ return;
193
+ }
194
+ const callerDeclaration = findContainingCallable(call);
195
+ const callerName = callerDeclaration === undefined
196
+ ? undefined
197
+ : declarationNameNode(callerDeclaration);
198
+ if (callerName === undefined) {
199
+ diagnostics.push({
200
+ kind: "unmodeled-caller",
201
+ message: `Call '${call.expression.getText(sourceFile)}' is outside a modeled named function or method`,
202
+ ...callLocation,
203
+ });
204
+ return;
205
+ }
206
+ const callerId = symbolNodesByLocation.get(nodeLocationKey(sourceFile, callerName, filePath))?.id;
207
+ if (callerId === undefined) {
208
+ diagnostics.push({
209
+ kind: "unmodeled-caller",
210
+ message: `Could not map the containing declaration for '${call.expression.getText(sourceFile)}'`,
211
+ ...callLocation,
212
+ });
213
+ return;
214
+ }
215
+ const target = [...targetIds.entries()][0];
216
+ if (target === undefined) {
217
+ return;
218
+ }
219
+ const [targetId, declaration] = target;
220
+ if (graph.hasEdge(callerId, targetId, "CALLS")) {
221
+ return;
222
+ }
223
+ const data = {
224
+ relationship: "CALLS",
225
+ confidence: ts.isMethodSignature(declaration) ? "inferred" : "exact",
226
+ provenance: "typescript-type-checker",
227
+ location: {
228
+ file: filePath,
229
+ line: callLocation.line ?? 1,
230
+ column: callLocation.column ?? 1,
231
+ },
232
+ };
233
+ graph.addEdge({ from: callerId, to: targetId, type: "CALLS", data });
234
+ }
235
+ function resolvedCallDeclarations(call, checker) {
236
+ const signatureDeclaration = checker.getResolvedSignature(call)?.declaration;
237
+ if (signatureDeclaration !== undefined) {
238
+ return [signatureDeclaration];
239
+ }
240
+ let symbol = checker.getSymbolAtLocation(call.expression);
241
+ if (symbol === undefined && ts.isPropertyAccessExpression(call.expression)) {
242
+ symbol = checker.getSymbolAtLocation(call.expression.name);
243
+ }
244
+ if (symbol === undefined) {
245
+ return [];
246
+ }
247
+ if ((symbol.flags & ts.SymbolFlags.Alias) !== 0) {
248
+ symbol = checker.getAliasedSymbol(symbol);
249
+ }
250
+ return symbol.declarations ?? [];
251
+ }
252
+ function findContainingCallable(call) {
253
+ let current = call.parent;
254
+ while (current !== undefined && !ts.isSourceFile(current)) {
255
+ if (ts.isFunctionDeclaration(current) || ts.isMethodDeclaration(current)) {
256
+ return current;
257
+ }
258
+ if (ts.isArrowFunction(current) || ts.isFunctionExpression(current)) {
259
+ return undefined;
260
+ }
261
+ current = current.parent;
262
+ }
263
+ return undefined;
264
+ }
265
+ function declarationNameNode(declaration) {
266
+ if (ts.isFunctionDeclaration(declaration) ||
267
+ ts.isMethodDeclaration(declaration) ||
268
+ ts.isMethodSignature(declaration) ||
269
+ ts.isClassDeclaration(declaration) ||
270
+ ts.isInterfaceDeclaration(declaration)) {
271
+ return declaration.name;
272
+ }
273
+ return undefined;
274
+ }
275
+ function indexSymbolNodesByLocation(graph) {
276
+ const result = new Map();
277
+ for (const node of graph.getNodes()) {
278
+ if (node.data.nodeType === "symbol") {
279
+ result.set(locationKey(node.data.location.file, node.data.location.line, node.data.location.column), node);
280
+ }
281
+ }
282
+ return result;
283
+ }
284
+ function nodeLocationKey(sourceFile, node, filePath) {
285
+ const position = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));
286
+ return locationKey(filePath, position.line + 1, position.character + 1);
287
+ }
288
+ function locationKey(file, line, column) {
289
+ return `${file}:${line}:${column}`;
290
+ }
291
+ function locationFor(sourceFile, node, filePath) {
292
+ const position = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));
293
+ return { file: filePath, line: position.line + 1, column: position.character + 1 };
294
+ }
295
+ function compilerDiagnostics(program, rootDirectory) {
296
+ return ts.getPreEmitDiagnostics(program).map((diagnostic) => {
297
+ if (diagnostic.file === undefined || diagnostic.start === undefined) {
298
+ return {
299
+ kind: "compiler",
300
+ message: ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n"),
301
+ file: null,
302
+ line: null,
303
+ column: null,
304
+ };
305
+ }
306
+ const position = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
307
+ return {
308
+ kind: "compiler",
309
+ message: ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n"),
310
+ file: toProjectPath(rootDirectory, diagnostic.file.fileName),
311
+ line: position.line + 1,
312
+ column: position.character + 1,
313
+ };
314
+ });
315
+ }
316
+ function formatDiagnostic(diagnostic, rootDirectory) {
317
+ const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n");
318
+ if (diagnostic.file === undefined || diagnostic.start === undefined) {
319
+ return message;
320
+ }
321
+ const position = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
322
+ return `${toProjectPath(rootDirectory, diagnostic.file.fileName)}:${position.line + 1}:${position.character + 1} ${message}`;
323
+ }
324
+ function canonicalPath(filePath) {
325
+ const resolved = path.resolve(filePath);
326
+ return ts.sys.useCaseSensitiveFileNames ? resolved : resolved.toLowerCase();
327
+ }
328
+ function isRelativeModuleSpecifier(specifier) {
329
+ return specifier.startsWith("./") || specifier.startsWith("../") || specifier.startsWith("/");
330
+ }
331
+ function isInsideRoot(rootDirectory, filePath) {
332
+ const relative = path.relative(rootDirectory, filePath);
333
+ return relative !== "" && relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
334
+ }
335
+ function toProjectPath(rootDirectory, filePath) {
336
+ return path.relative(rootDirectory, filePath).split(path.sep).join("/");
337
+ }
338
+ //# sourceMappingURL=analyzeProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzeProject.js","sourceRoot":"","sources":["../../src/analyzer/analyzeProject.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type ts from "typescript";
2
+ import { DirectedGraph } from "../graph/DirectedGraph.js";
3
+ import { type DeclarationKind, type SourceLocation, type SourceRange } from "../parser/extractDeclarations.js";
4
+ export interface FileNodeData {
5
+ readonly nodeType: "file";
6
+ readonly filePath: string;
7
+ }
8
+ export interface SymbolNodeData {
9
+ readonly nodeType: "symbol";
10
+ readonly declarationKind: DeclarationKind;
11
+ readonly name: string;
12
+ readonly qualifiedName: string;
13
+ readonly location: SourceLocation;
14
+ readonly range: SourceRange;
15
+ }
16
+ export type CodeGraphNodeData = FileNodeData | SymbolNodeData;
17
+ export type CodeGraphEdgeType = "DEFINES" | "IMPORTS" | "CALLS";
18
+ export type ResolutionConfidence = "exact" | "inferred";
19
+ export interface DefinesEdgeData {
20
+ readonly relationship: "DEFINES";
21
+ readonly confidence: "exact";
22
+ readonly provenance: "syntax";
23
+ }
24
+ export interface ImportEdgeData {
25
+ readonly relationship: "IMPORTS";
26
+ readonly confidence: "exact";
27
+ readonly provenance: "typescript-module-resolution";
28
+ readonly moduleSpecifier: string;
29
+ readonly importKind: "side-effect" | "default" | "named" | "namespace" | "mixed" | "re-export";
30
+ }
31
+ export interface CallEdgeData {
32
+ readonly relationship: "CALLS";
33
+ readonly confidence: ResolutionConfidence;
34
+ readonly provenance: "typescript-type-checker";
35
+ readonly location: SourceLocation;
36
+ }
37
+ export type CodeGraphEdgeData = DefinesEdgeData | ImportEdgeData | CallEdgeData;
38
+ export type CodeGraph = DirectedGraph<CodeGraphNodeData, CodeGraphEdgeType, CodeGraphEdgeData>;
39
+ export type DefinitionGraph = CodeGraph;
40
+ export interface BuildDefinitionGraphOptions {
41
+ readonly getFilePath?: (sourceFile: ts.SourceFile) => string;
42
+ }
43
+ export declare function createFileNodeId(filePath: string): string;
44
+ export declare function createSymbolNodeId(filePath: string, qualifiedName: string): string;
45
+ /** Builds file/symbol nodes and their DEFINES relationships from parsed ASTs. */
46
+ export declare function buildDefinitionGraph(sourceFiles: readonly ts.SourceFile[], options?: BuildDefinitionGraphOptions): DefinitionGraph;
47
+ //# sourceMappingURL=buildDefinitionGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildDefinitionGraph.d.ts","sourceRoot":"","sources":["../../src/analyzer/buildDefinitionGraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,WAAW,EACjB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,cAAc,CAAC;AAC9D,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAChE,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,UAAU,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,8BAA8B,CAAC;IACpD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EACf,aAAa,GACb,SAAS,GACT,OAAO,GACP,WAAW,GACX,OAAO,GACP,WAAW,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,yBAAyB,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;CACnC;AAED,MAAM,MAAM,iBAAiB,GACzB,eAAe,GACf,cAAc,GACd,YAAY,CAAC;AAEjB,MAAM,MAAM,SAAS,GAAG,aAAa,CACnC,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,CAClB,CAAC;AACF,MAAM,MAAM,eAAe,GAAG,SAAS,CAAC;AAExC,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,KAAK,MAAM,CAAC;CAC9D;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,MAAM,CAMR;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,EACrC,OAAO,GAAE,2BAAgC,GACxC,eAAe,CAwDjB"}
@@ -0,0 +1,60 @@
1
+ import { DirectedGraph } from "../graph/DirectedGraph.js";
2
+ import { extractDeclarations, } from "../parser/extractDeclarations.js";
3
+ export function createFileNodeId(filePath) {
4
+ return `file:${encodeURIComponent(filePath)}`;
5
+ }
6
+ export function createSymbolNodeId(filePath, qualifiedName) {
7
+ return [
8
+ "symbol",
9
+ encodeURIComponent(filePath),
10
+ encodeURIComponent(qualifiedName),
11
+ ].join(":");
12
+ }
13
+ /** Builds file/symbol nodes and their DEFINES relationships from parsed ASTs. */
14
+ export function buildDefinitionGraph(sourceFiles, options = {}) {
15
+ const graph = new DirectedGraph();
16
+ for (const sourceFile of sourceFiles) {
17
+ const filePath = options.getFilePath?.(sourceFile) ?? sourceFile.fileName;
18
+ const fileNodeId = createFileNodeId(filePath);
19
+ const declarations = extractDeclarations(sourceFile);
20
+ graph.addNode({
21
+ id: fileNodeId,
22
+ data: {
23
+ nodeType: "file",
24
+ filePath,
25
+ },
26
+ });
27
+ // Add all declaration nodes before their edges so edge insertion never
28
+ // depends on the order in which declarations were extracted.
29
+ for (const declaration of declarations) {
30
+ graph.addNode({
31
+ id: createSymbolNodeId(filePath, declaration.qualifiedName),
32
+ data: {
33
+ nodeType: "symbol",
34
+ declarationKind: declaration.kind,
35
+ name: declaration.name,
36
+ qualifiedName: declaration.qualifiedName,
37
+ location: { ...declaration.location, file: filePath },
38
+ range: { ...declaration.range, file: filePath },
39
+ },
40
+ });
41
+ }
42
+ for (const declaration of declarations) {
43
+ const ownerNodeId = declaration.parentQualifiedName === null
44
+ ? fileNodeId
45
+ : createSymbolNodeId(filePath, declaration.parentQualifiedName);
46
+ graph.addEdge({
47
+ from: ownerNodeId,
48
+ to: createSymbolNodeId(filePath, declaration.qualifiedName),
49
+ type: "DEFINES",
50
+ data: {
51
+ relationship: "DEFINES",
52
+ confidence: "exact",
53
+ provenance: "syntax",
54
+ },
55
+ });
56
+ }
57
+ }
58
+ return graph;
59
+ }
60
+ //# sourceMappingURL=buildDefinitionGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildDefinitionGraph.js","sourceRoot":"","sources":["../../src/analyzer/buildDefinitionGraph.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EACL,mBAAmB,GAIpB,MAAM,kCAAkC,CAAC;AA+D1C,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,QAAQ,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAAgB,EAChB,aAAqB;IAErB,OAAO;QACL,QAAQ;QACR,kBAAkB,CAAC,QAAQ,CAAC;QAC5B,kBAAkB,CAAC,aAAa,CAAC;KAClC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,oBAAoB,CAClC,WAAqC,EACrC,UAAuC,EAAE;IAEzC,MAAM,KAAK,GAAG,IAAI,aAAa,EAI5B,CAAC;IAEJ,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC;QAC1E,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAErD,KAAK,CAAC,OAAO,CAAC;YACZ,EAAE,EAAE,UAAU;YACd,IAAI,EAAE;gBACJ,QAAQ,EAAE,MAAM;gBAChB,QAAQ;aACT;SACF,CAAC,CAAC;QAEH,uEAAuE;QACvE,6DAA6D;QAC7D,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,KAAK,CAAC,OAAO,CAAC;gBACZ,EAAE,EAAE,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,aAAa,CAAC;gBAC3D,IAAI,EAAE;oBACJ,QAAQ,EAAE,QAAQ;oBAClB,eAAe,EAAE,WAAW,CAAC,IAAI;oBACjC,IAAI,EAAE,WAAW,CAAC,IAAI;oBACtB,aAAa,EAAE,WAAW,CAAC,aAAa;oBACxC,QAAQ,EAAE,EAAE,GAAG,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACrD,KAAK,EAAE,EAAE,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAChD;aACF,CAAC,CAAC;QACL,CAAC;QAED,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,MAAM,WAAW,GACf,WAAW,CAAC,mBAAmB,KAAK,IAAI;gBACtC,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,mBAAmB,CAAC,CAAC;YAEpE,KAAK,CAAC,OAAO,CAAC;gBACZ,IAAI,EAAE,WAAW;gBACjB,EAAE,EAAE,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,aAAa,CAAC;gBAC3D,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE;oBACJ,YAAY,EAAE,SAAS;oBACvB,UAAU,EAAE,OAAO;oBACnB,UAAU,EAAE,QAAQ;iBACrB;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { ProjectAnalysis } from "./analyzeProject.js";
2
+ export interface FileChanges {
3
+ readonly added: readonly string[];
4
+ readonly changed: readonly string[];
5
+ readonly deleted: readonly string[];
6
+ readonly affected: readonly string[];
7
+ readonly reused: readonly string[];
8
+ }
9
+ export interface IncrementalUpdateResult {
10
+ readonly analysis: ProjectAnalysis;
11
+ readonly files: FileChanges;
12
+ }
13
+ export declare function updateProjectIndex(indexPath: string, rootDirectory?: string): Promise<IncrementalUpdateResult>;
14
+ /**
15
+ * Applies a fresh semantic snapshot to only the affected portion of a cached
16
+ * graph. The fresh snapshot currently comes from a project-wide TypeScript
17
+ * Program so cross-file symbol resolution remains correct.
18
+ */
19
+ export declare function updateProjectAnalysis(cached: ProjectAnalysis, fresh: ProjectAnalysis): IncrementalUpdateResult;
20
+ export declare function defaultIndexPath(rootDirectory: string): string;
21
+ //# sourceMappingURL=incrementalIndex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incrementalIndex.d.ts","sourceRoot":"","sources":["../../src/analyzer/incrementalIndex.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAY3D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC7B;AAED,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,EACjB,aAAa,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,uBAAuB,CAAC,CAMlC;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,eAAe,GACrB,uBAAuB,CA6BzB;AA8FD,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAE9D"}
@@ -0,0 +1,115 @@
1
+ import path from "node:path";
2
+ import { analyzeProject } from "./analyzeProject.js";
3
+ import { createFileNodeId, } from "./buildDefinitionGraph.js";
4
+ import { loadProjectAnalysis, saveProjectAnalysis, } from "../persistence/jsonPersistence.js";
5
+ export async function updateProjectIndex(indexPath, rootDirectory) {
6
+ const cached = await loadProjectAnalysis(indexPath);
7
+ const fresh = await analyzeProject(rootDirectory ?? cached.rootDirectory);
8
+ const result = updateProjectAnalysis(cached, fresh);
9
+ await saveProjectAnalysis(result.analysis, indexPath);
10
+ return result;
11
+ }
12
+ /**
13
+ * Applies a fresh semantic snapshot to only the affected portion of a cached
14
+ * graph. The fresh snapshot currently comes from a project-wide TypeScript
15
+ * Program so cross-file symbol resolution remains correct.
16
+ */
17
+ export function updateProjectAnalysis(cached, fresh) {
18
+ const directChanges = compareFileHashes(cached.fileHashes, fresh.fileHashes);
19
+ const affected = new Set([
20
+ ...directChanges.added,
21
+ ...directChanges.changed,
22
+ ...directChanges.deleted,
23
+ ]);
24
+ expandReverseImportDependents(cached.graph, affected);
25
+ expandReverseImportDependents(fresh.graph, affected);
26
+ patchAffectedGraph(cached.graph, fresh.graph, affected);
27
+ const currentFiles = Object.keys(fresh.fileHashes).sort();
28
+ const affectedFiles = [...affected].sort();
29
+ const analysis = {
30
+ rootDirectory: fresh.rootDirectory,
31
+ graph: cached.graph,
32
+ diagnostics: fresh.diagnostics,
33
+ fileHashes: fresh.fileHashes,
34
+ };
35
+ return {
36
+ analysis,
37
+ files: {
38
+ ...directChanges,
39
+ affected: affectedFiles,
40
+ reused: currentFiles.filter((file) => !affected.has(file)),
41
+ },
42
+ };
43
+ }
44
+ function compareFileHashes(previous, current) {
45
+ const previousPaths = new Set(Object.keys(previous));
46
+ const currentPaths = new Set(Object.keys(current));
47
+ const added = [...currentPaths].filter((file) => !previousPaths.has(file));
48
+ const deleted = [...previousPaths].filter((file) => !currentPaths.has(file));
49
+ const changed = [...currentPaths].filter((file) => previousPaths.has(file) && previous[file] !== current[file]);
50
+ return {
51
+ added: added.sort(),
52
+ changed: changed.sort(),
53
+ deleted: deleted.sort(),
54
+ };
55
+ }
56
+ function expandReverseImportDependents(graph, affected) {
57
+ const queue = [...affected];
58
+ let nextIndex = 0;
59
+ while (nextIndex < queue.length) {
60
+ const filePath = queue[nextIndex];
61
+ nextIndex += 1;
62
+ if (filePath === undefined) {
63
+ continue;
64
+ }
65
+ const fileNode = graph.getNode(createFileNodeId(filePath));
66
+ if (fileNode === undefined) {
67
+ continue;
68
+ }
69
+ for (const edge of graph.getIncomingEdges(fileNode.id)) {
70
+ if (edge.type !== "IMPORTS") {
71
+ continue;
72
+ }
73
+ const importer = graph.getNode(edge.from);
74
+ if (importer?.data.nodeType !== "file" || affected.has(importer.data.filePath)) {
75
+ continue;
76
+ }
77
+ affected.add(importer.data.filePath);
78
+ queue.push(importer.data.filePath);
79
+ }
80
+ }
81
+ }
82
+ function patchAffectedGraph(cached, fresh, affected) {
83
+ for (const node of cached.getNodes()) {
84
+ if (affected.has(filePathForNode(node.data))) {
85
+ cached.removeNode(node.id);
86
+ }
87
+ }
88
+ for (const node of fresh.getNodes()) {
89
+ if (affected.has(filePathForNode(node.data))) {
90
+ cached.addNode(node);
91
+ }
92
+ }
93
+ for (const edge of fresh.getEdges()) {
94
+ const source = fresh.getNode(edge.from);
95
+ const target = fresh.getNode(edge.to);
96
+ if (source === undefined || target === undefined) {
97
+ throw new Error("Fresh graph contains an edge with a missing endpoint");
98
+ }
99
+ const touchesAffected = affected.has(filePathForNode(source.data)) ||
100
+ affected.has(filePathForNode(target.data));
101
+ if (touchesAffected &&
102
+ cached.getNode(edge.from) !== undefined &&
103
+ cached.getNode(edge.to) !== undefined &&
104
+ !cached.hasEdge(edge.from, edge.to, edge.type)) {
105
+ cached.addEdge(edge);
106
+ }
107
+ }
108
+ }
109
+ function filePathForNode(node) {
110
+ return node.nodeType === "file" ? node.filePath : node.location.file;
111
+ }
112
+ export function defaultIndexPath(rootDirectory) {
113
+ return path.join(rootDirectory, ".codegraph", "index.json");
114
+ }
115
+ //# sourceMappingURL=incrementalIndex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incrementalIndex.js","sourceRoot":"","sources":["../../src/analyzer/incrementalIndex.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function runCli(arguments_: readonly string[]): Promise<number>;
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAwBA,wBAAsB,MAAM,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgK3E"}