cli-node-graph 1.0.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.
- package/README.md +69 -0
- package/dist/analysis/CircularDependencyAnalyzer.d.ts +13 -0
- package/dist/analysis/CircularDependencyAnalyzer.d.ts.map +1 -0
- package/dist/analysis/CircularDependencyAnalyzer.js +15 -0
- package/dist/analysis/CircularDependencyAnalyzer.js.map +1 -0
- package/dist/analysis/DeadCodeAnalyzer.d.ts +13 -0
- package/dist/analysis/DeadCodeAnalyzer.d.ts.map +1 -0
- package/dist/analysis/DeadCodeAnalyzer.js +37 -0
- package/dist/analysis/DeadCodeAnalyzer.js.map +1 -0
- package/dist/analysis/DependencyAnalyzer.d.ts +16 -0
- package/dist/analysis/DependencyAnalyzer.d.ts.map +1 -0
- package/dist/analysis/DependencyAnalyzer.js +26 -0
- package/dist/analysis/DependencyAnalyzer.js.map +1 -0
- package/dist/analysis/ImpactAnalyzer.d.ts +16 -0
- package/dist/analysis/ImpactAnalyzer.d.ts.map +1 -0
- package/dist/analysis/ImpactAnalyzer.js +26 -0
- package/dist/analysis/ImpactAnalyzer.js.map +1 -0
- package/dist/analysis/LayerViolationAnalyzer.d.ts +31 -0
- package/dist/analysis/LayerViolationAnalyzer.d.ts.map +1 -0
- package/dist/analysis/LayerViolationAnalyzer.js +71 -0
- package/dist/analysis/LayerViolationAnalyzer.js.map +1 -0
- package/dist/cli/ProjectLoader.d.ts +13 -0
- package/dist/cli/ProjectLoader.d.ts.map +1 -0
- package/dist/cli/ProjectLoader.js +48 -0
- package/dist/cli/ProjectLoader.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +139 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/AnalysisConfig.d.ts +22 -0
- package/dist/config/AnalysisConfig.d.ts.map +1 -0
- package/dist/config/AnalysisConfig.js +6 -0
- package/dist/config/AnalysisConfig.js.map +1 -0
- package/dist/exporters/CytoscapeExporter.d.ts +18 -0
- package/dist/exporters/CytoscapeExporter.d.ts.map +1 -0
- package/dist/exporters/CytoscapeExporter.js +85 -0
- package/dist/exporters/CytoscapeExporter.js.map +1 -0
- package/dist/exporters/DotExporter.d.ts +13 -0
- package/dist/exporters/DotExporter.d.ts.map +1 -0
- package/dist/exporters/DotExporter.js +38 -0
- package/dist/exporters/DotExporter.js.map +1 -0
- package/dist/exporters/GraphExporter.d.ts +7 -0
- package/dist/exporters/GraphExporter.d.ts.map +1 -0
- package/dist/exporters/GraphExporter.js +2 -0
- package/dist/exporters/GraphExporter.js.map +1 -0
- package/dist/exporters/GraphMLExporter.d.ts +8 -0
- package/dist/exporters/GraphMLExporter.d.ts.map +1 -0
- package/dist/exporters/GraphMLExporter.js +30 -0
- package/dist/exporters/GraphMLExporter.js.map +1 -0
- package/dist/exporters/JsonExporter.d.ts +8 -0
- package/dist/exporters/JsonExporter.d.ts.map +1 -0
- package/dist/exporters/JsonExporter.js +16 -0
- package/dist/exporters/JsonExporter.js.map +1 -0
- package/dist/graph/EdgeFactory.d.ts +13 -0
- package/dist/graph/EdgeFactory.d.ts.map +1 -0
- package/dist/graph/EdgeFactory.js +15 -0
- package/dist/graph/EdgeFactory.js.map +1 -0
- package/dist/graph/Graph.d.ts +37 -0
- package/dist/graph/Graph.d.ts.map +1 -0
- package/dist/graph/Graph.js +137 -0
- package/dist/graph/Graph.js.map +1 -0
- package/dist/graph/GraphAlgorithms.d.ts +28 -0
- package/dist/graph/GraphAlgorithms.d.ts.map +1 -0
- package/dist/graph/GraphAlgorithms.js +233 -0
- package/dist/graph/GraphAlgorithms.js.map +1 -0
- package/dist/graph/GraphBuilder.d.ts +10 -0
- package/dist/graph/GraphBuilder.d.ts.map +1 -0
- package/dist/graph/GraphBuilder.js +71 -0
- package/dist/graph/GraphBuilder.js.map +1 -0
- package/dist/graph/NodeFactory.d.ts +21 -0
- package/dist/graph/NodeFactory.d.ts.map +1 -0
- package/dist/graph/NodeFactory.js +53 -0
- package/dist/graph/NodeFactory.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/model/EdgeKind.d.ts +22 -0
- package/dist/model/EdgeKind.d.ts.map +1 -0
- package/dist/model/EdgeKind.js +23 -0
- package/dist/model/EdgeKind.js.map +1 -0
- package/dist/model/GraphEdge.d.ts +22 -0
- package/dist/model/GraphEdge.d.ts.map +1 -0
- package/dist/model/GraphEdge.js +2 -0
- package/dist/model/GraphEdge.js.map +1 -0
- package/dist/model/GraphNode.d.ts +22 -0
- package/dist/model/GraphNode.d.ts.map +1 -0
- package/dist/model/GraphNode.js +2 -0
- package/dist/model/GraphNode.js.map +1 -0
- package/dist/model/NodeKind.d.ts +21 -0
- package/dist/model/NodeKind.d.ts.map +1 -0
- package/dist/model/NodeKind.js +22 -0
- package/dist/model/NodeKind.js.map +1 -0
- package/dist/parser/ASTWalker.d.ts +21 -0
- package/dist/parser/ASTWalker.d.ts.map +1 -0
- package/dist/parser/ASTWalker.js +23 -0
- package/dist/parser/ASTWalker.js.map +1 -0
- package/dist/parser/ProgramFactory.d.ts +15 -0
- package/dist/parser/ProgramFactory.d.ts.map +1 -0
- package/dist/parser/ProgramFactory.js +65 -0
- package/dist/parser/ProgramFactory.js.map +1 -0
- package/dist/parser/visitors/CallVisitor.d.ts +17 -0
- package/dist/parser/visitors/CallVisitor.d.ts.map +1 -0
- package/dist/parser/visitors/CallVisitor.js +111 -0
- package/dist/parser/visitors/CallVisitor.js.map +1 -0
- package/dist/parser/visitors/ClassVisitor.d.ts +14 -0
- package/dist/parser/visitors/ClassVisitor.d.ts.map +1 -0
- package/dist/parser/visitors/ClassVisitor.js +87 -0
- package/dist/parser/visitors/ClassVisitor.js.map +1 -0
- package/dist/parser/visitors/DecoratorVisitor.d.ts +13 -0
- package/dist/parser/visitors/DecoratorVisitor.d.ts.map +1 -0
- package/dist/parser/visitors/DecoratorVisitor.js +65 -0
- package/dist/parser/visitors/DecoratorVisitor.js.map +1 -0
- package/dist/parser/visitors/EnumVisitor.d.ts +11 -0
- package/dist/parser/visitors/EnumVisitor.d.ts.map +1 -0
- package/dist/parser/visitors/EnumVisitor.js +26 -0
- package/dist/parser/visitors/EnumVisitor.js.map +1 -0
- package/dist/parser/visitors/ExportVisitor.d.ts +16 -0
- package/dist/parser/visitors/ExportVisitor.d.ts.map +1 -0
- package/dist/parser/visitors/ExportVisitor.js +95 -0
- package/dist/parser/visitors/ExportVisitor.js.map +1 -0
- package/dist/parser/visitors/FunctionVisitor.d.ts +14 -0
- package/dist/parser/visitors/FunctionVisitor.d.ts.map +1 -0
- package/dist/parser/visitors/FunctionVisitor.js +74 -0
- package/dist/parser/visitors/FunctionVisitor.js.map +1 -0
- package/dist/parser/visitors/HeritageVisitor.d.ts +14 -0
- package/dist/parser/visitors/HeritageVisitor.d.ts.map +1 -0
- package/dist/parser/visitors/HeritageVisitor.js +87 -0
- package/dist/parser/visitors/HeritageVisitor.js.map +1 -0
- package/dist/parser/visitors/ImportVisitor.d.ts +14 -0
- package/dist/parser/visitors/ImportVisitor.d.ts.map +1 -0
- package/dist/parser/visitors/ImportVisitor.js +96 -0
- package/dist/parser/visitors/ImportVisitor.js.map +1 -0
- package/dist/parser/visitors/InterfaceVisitor.d.ts +11 -0
- package/dist/parser/visitors/InterfaceVisitor.d.ts.map +1 -0
- package/dist/parser/visitors/InterfaceVisitor.js +28 -0
- package/dist/parser/visitors/InterfaceVisitor.js.map +1 -0
- package/dist/parser/visitors/MethodVisitor.d.ts +11 -0
- package/dist/parser/visitors/MethodVisitor.d.ts.map +1 -0
- package/dist/parser/visitors/MethodVisitor.js +30 -0
- package/dist/parser/visitors/MethodVisitor.js.map +1 -0
- package/dist/parser/visitors/TypeReferenceVisitor.d.ts +15 -0
- package/dist/parser/visitors/TypeReferenceVisitor.d.ts.map +1 -0
- package/dist/parser/visitors/TypeReferenceVisitor.js +85 -0
- package/dist/parser/visitors/TypeReferenceVisitor.js.map +1 -0
- package/dist/parser/visitors/VariableVisitor.d.ts +11 -0
- package/dist/parser/visitors/VariableVisitor.d.ts.map +1 -0
- package/dist/parser/visitors/VariableVisitor.js +27 -0
- package/dist/parser/visitors/VariableVisitor.js.map +1 -0
- package/dist/parser/visitors/context.d.ts +54 -0
- package/dist/parser/visitors/context.d.ts.map +1 -0
- package/dist/parser/visitors/context.js +117 -0
- package/dist/parser/visitors/context.js.map +1 -0
- package/dist/resolver/ModuleResolver.d.ts +16 -0
- package/dist/resolver/ModuleResolver.d.ts.map +1 -0
- package/dist/resolver/ModuleResolver.js +40 -0
- package/dist/resolver/ModuleResolver.js.map +1 -0
- package/dist/resolver/SymbolResolver.d.ts +15 -0
- package/dist/resolver/SymbolResolver.d.ts.map +1 -0
- package/dist/resolver/SymbolResolver.js +62 -0
- package/dist/resolver/SymbolResolver.js.map +1 -0
- package/dist/resolver/TypeResolver.d.ts +13 -0
- package/dist/resolver/TypeResolver.d.ts.map +1 -0
- package/dist/resolver/TypeResolver.js +32 -0
- package/dist/resolver/TypeResolver.js.map +1 -0
- package/dist/utils/cache.d.ts +12 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +38 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/id.d.ts +7 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +15 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/path.d.ts +9 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +18 -0
- package/dist/utils/path.js.map +1 -0
- package/docs/ARCHITECTURE.md +100 -0
- package/docs/CLI.md +62 -0
- package/package.json +58 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { EdgeKind } from '../../model/EdgeKind.js';
|
|
3
|
+
import { NodeKind } from '../../model/NodeKind.js';
|
|
4
|
+
import { addLocatedEdge, registerSymbolNode } from './context.js';
|
|
5
|
+
/** Captures type references in signatures and type annotations. */
|
|
6
|
+
export class TypeReferenceVisitor {
|
|
7
|
+
ctx;
|
|
8
|
+
name = 'TypeReferenceVisitor';
|
|
9
|
+
constructor(ctx) {
|
|
10
|
+
this.ctx = ctx;
|
|
11
|
+
}
|
|
12
|
+
visit(node, vctx) {
|
|
13
|
+
if (ts.isTypeReferenceNode(node)) {
|
|
14
|
+
this.handleTypeReference(node, vctx);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
handleTypeReference(node, vctx) {
|
|
18
|
+
const type = vctx.checker.getTypeFromTypeNode(node);
|
|
19
|
+
const symbol = type.getSymbol() ?? type.aliasSymbol;
|
|
20
|
+
if (!symbol)
|
|
21
|
+
return;
|
|
22
|
+
const resolved = this.ctx.symbolResolver.resolveAlias(symbol);
|
|
23
|
+
const decl = this.ctx.symbolResolver.getDeclaration(resolved);
|
|
24
|
+
if (!decl)
|
|
25
|
+
return;
|
|
26
|
+
const typeName = this.ctx.symbolResolver.getSymbolName(resolved);
|
|
27
|
+
const typeId = registerSymbolNode(this.ctx, {
|
|
28
|
+
kind: this.inferTypeKind(resolved),
|
|
29
|
+
name: typeName,
|
|
30
|
+
node: decl,
|
|
31
|
+
sourceFile: decl.getSourceFile(),
|
|
32
|
+
});
|
|
33
|
+
const enclosing = this.ctx.symbolResolver.getEnclosingSymbol(node);
|
|
34
|
+
if (!enclosing)
|
|
35
|
+
return;
|
|
36
|
+
const enclosingDecl = this.ctx.symbolResolver.getDeclaration(enclosing);
|
|
37
|
+
if (!enclosingDecl)
|
|
38
|
+
return;
|
|
39
|
+
const enclosingName = this.getEnclosingName(enclosingDecl);
|
|
40
|
+
const enclosingId = registerSymbolNode(this.ctx, {
|
|
41
|
+
kind: this.inferEnclosingKind(enclosingDecl),
|
|
42
|
+
name: enclosingName,
|
|
43
|
+
node: enclosingDecl,
|
|
44
|
+
sourceFile: enclosingDecl.getSourceFile(),
|
|
45
|
+
});
|
|
46
|
+
addLocatedEdge(this.ctx, {
|
|
47
|
+
source: enclosingId,
|
|
48
|
+
target: typeId,
|
|
49
|
+
kind: EdgeKind.TYPE_REFERENCE,
|
|
50
|
+
sourceFile: vctx.sourceFile,
|
|
51
|
+
node,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
inferTypeKind(symbol) {
|
|
55
|
+
if (symbol.flags & ts.SymbolFlags.Interface)
|
|
56
|
+
return NodeKind.Interface;
|
|
57
|
+
if (symbol.flags & ts.SymbolFlags.Class)
|
|
58
|
+
return NodeKind.Class;
|
|
59
|
+
if (symbol.flags & ts.SymbolFlags.Enum)
|
|
60
|
+
return NodeKind.Enum;
|
|
61
|
+
return NodeKind.TypeAlias;
|
|
62
|
+
}
|
|
63
|
+
inferEnclosingKind(decl) {
|
|
64
|
+
if (ts.isClassDeclaration(decl))
|
|
65
|
+
return NodeKind.Class;
|
|
66
|
+
if (ts.isInterfaceDeclaration(decl))
|
|
67
|
+
return NodeKind.Interface;
|
|
68
|
+
if (ts.isFunctionDeclaration(decl))
|
|
69
|
+
return NodeKind.Function;
|
|
70
|
+
if (ts.isMethodDeclaration(decl))
|
|
71
|
+
return NodeKind.Method;
|
|
72
|
+
return NodeKind.Variable;
|
|
73
|
+
}
|
|
74
|
+
getEnclosingName(decl) {
|
|
75
|
+
if ('name' in decl && decl.name && ts.isIdentifier(decl.name)) {
|
|
76
|
+
const name = decl.name.text;
|
|
77
|
+
if (ts.isMethodDeclaration(decl) && decl.parent && ts.isClassDeclaration(decl.parent) && decl.parent.name) {
|
|
78
|
+
return `${decl.parent.name.text}.${name}`;
|
|
79
|
+
}
|
|
80
|
+
return name;
|
|
81
|
+
}
|
|
82
|
+
return 'anonymous';
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=TypeReferenceVisitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypeReferenceVisitor.js","sourceRoot":"","sources":["../../../src/parser/visitors/TypeReferenceVisitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGnD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElE,mEAAmE;AACnE,MAAM,OAAO,oBAAoB;IAGF;IAFpB,IAAI,GAAG,sBAAsB,CAAC;IAEvC,YAA6B,GAAsB;QAAtB,QAAG,GAAH,GAAG,CAAmB;IAAG,CAAC;IAEvD,KAAK,CAAC,IAAa,EAAE,IAAoB;QACvC,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,IAA0B,EAAE,IAAoB;QAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC;QACpD,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE;YAC1C,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;YAClC,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,IAAI,CAAC,aAAa,EAAE;SACjC,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACnE,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACxE,IAAI,CAAC,aAAa;YAAE,OAAO;QAE3B,MAAM,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC;YAC5C,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,aAAa;YACnB,UAAU,EAAE,aAAa,CAAC,aAAa,EAAE;SAC1C,CAAC,CAAC;QAEH,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE;YACvB,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,QAAQ,CAAC,cAAc;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAEO,aAAa,CAAC,MAAiB;QACrC,IAAI,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS;YAAE,OAAO,QAAQ,CAAC,SAAS,CAAC;QACvE,IAAI,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK;YAAE,OAAO,QAAQ,CAAC,KAAK,CAAC;QAC/D,IAAI,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC;QAC7D,OAAO,QAAQ,CAAC,SAAS,CAAC;IAC5B,CAAC;IAEO,kBAAkB,CAAC,IAAoB;QAC7C,IAAI,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC;YAAE,OAAO,QAAQ,CAAC,KAAK,CAAC;QACvD,IAAI,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC;YAAE,OAAO,QAAQ,CAAC,SAAS,CAAC;QAC/D,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;YAAE,OAAO,QAAQ,CAAC,QAAQ,CAAC;QAC7D,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;QACzD,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAC3B,CAAC;IAEO,gBAAgB,CAAC,IAAoB;QAC3C,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAqB,CAAC,EAAE,CAAC;YAC/E,MAAM,IAAI,GAAI,IAAI,CAAC,IAAsB,CAAC,IAAI,CAAC;YAC/C,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC1G,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;YAC5C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,WAAW,CAAC;IACrB,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import type { ASTVisitor, VisitorContext } from '../ASTWalker.js';
|
|
3
|
+
import type { GraphBuildContext } from './context.js';
|
|
4
|
+
/** Captures variable declarations. */
|
|
5
|
+
export declare class VariableVisitor implements ASTVisitor {
|
|
6
|
+
private readonly ctx;
|
|
7
|
+
readonly name = "VariableVisitor";
|
|
8
|
+
constructor(ctx: GraphBuildContext);
|
|
9
|
+
visit(node: ts.Node, vctx: VisitorContext): void;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=VariableVisitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VariableVisitor.d.ts","sourceRoot":"","sources":["../../../src/parser/visitors/VariableVisitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtD,sCAAsC;AACtC,qBAAa,eAAgB,YAAW,UAAU;IAGpC,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,QAAQ,CAAC,IAAI,qBAAqB;gBAEL,GAAG,EAAE,iBAAiB;IAEnD,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI;CAiBjD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { NodeKind } from '../../model/NodeKind.js';
|
|
3
|
+
import { registerSymbolNode } from './context.js';
|
|
4
|
+
/** Captures variable declarations. */
|
|
5
|
+
export class VariableVisitor {
|
|
6
|
+
ctx;
|
|
7
|
+
name = 'VariableVisitor';
|
|
8
|
+
constructor(ctx) {
|
|
9
|
+
this.ctx = ctx;
|
|
10
|
+
}
|
|
11
|
+
visit(node, vctx) {
|
|
12
|
+
if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name)) {
|
|
13
|
+
const parent = node.parent?.parent;
|
|
14
|
+
const isExported = parent && ts.isVariableStatement(parent) && ts.canHaveModifiers(parent)
|
|
15
|
+
? !!(ts.getCombinedModifierFlags(parent) & ts.ModifierFlags.Export)
|
|
16
|
+
: false;
|
|
17
|
+
registerSymbolNode(this.ctx, {
|
|
18
|
+
kind: NodeKind.Variable,
|
|
19
|
+
name: node.name.text,
|
|
20
|
+
node,
|
|
21
|
+
sourceFile: vctx.sourceFile,
|
|
22
|
+
metadata: { exported: isExported ?? false },
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=VariableVisitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VariableVisitor.js","sourceRoot":"","sources":["../../../src/parser/visitors/VariableVisitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,sCAAsC;AACtC,MAAM,OAAO,eAAe;IAGG;IAFpB,IAAI,GAAG,iBAAiB,CAAC;IAElC,YAA6B,GAAsB;QAAtB,QAAG,GAAH,GAAG,CAAmB;IAAG,CAAC;IAEvD,KAAK,CAAC,IAAa,EAAE,IAAoB;QACvC,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACjE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;YACnC,MAAM,UAAU,GACd,MAAM,IAAI,EAAE,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC;gBACrE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC,MAAmC,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC;gBAChG,CAAC,CAAC,KAAK,CAAC;YAEZ,kBAAkB,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC3B,IAAI,EAAE,QAAQ,CAAC,QAAQ;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;gBACpB,IAAI;gBACJ,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,QAAQ,EAAE,EAAE,QAAQ,EAAE,UAAU,IAAI,KAAK,EAAE;aAC5C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { GraphEdge } from '../../model/GraphEdge.js';
|
|
2
|
+
import type { SourceRange } from '../../model/GraphNode.js';
|
|
3
|
+
import { EdgeKind } from '../../model/EdgeKind.js';
|
|
4
|
+
import { NodeKind } from '../../model/NodeKind.js';
|
|
5
|
+
import type { EdgeFactory } from '../../graph/EdgeFactory.js';
|
|
6
|
+
import type { NodeFactory } from '../../graph/NodeFactory.js';
|
|
7
|
+
import type { Graph } from '../../graph/Graph.js';
|
|
8
|
+
import type { ModuleResolver } from '../../resolver/ModuleResolver.js';
|
|
9
|
+
import type { PathResolver } from '../../resolver/ModuleResolver.js';
|
|
10
|
+
import type { SymbolResolver } from '../../resolver/SymbolResolver.js';
|
|
11
|
+
import type { TypeResolver } from '../../resolver/TypeResolver.js';
|
|
12
|
+
import ts from 'typescript';
|
|
13
|
+
/** Shared context for graph-building visitors. */
|
|
14
|
+
export interface GraphBuildContext {
|
|
15
|
+
graph: Graph;
|
|
16
|
+
nodeFactory: NodeFactory;
|
|
17
|
+
edgeFactory: EdgeFactory;
|
|
18
|
+
symbolResolver: SymbolResolver;
|
|
19
|
+
typeResolver: TypeResolver;
|
|
20
|
+
moduleResolver: ModuleResolver;
|
|
21
|
+
pathResolver: PathResolver;
|
|
22
|
+
projectRoot: string;
|
|
23
|
+
symbolNodeMap: Map<string, string>;
|
|
24
|
+
fileNodeMap: Map<string, string>;
|
|
25
|
+
}
|
|
26
|
+
/** Get source range from a node. */
|
|
27
|
+
export declare function getSourceRange(node: ts.Node, sourceFile: ts.SourceFile): SourceRange;
|
|
28
|
+
/** Get line/column for a node. */
|
|
29
|
+
export declare function getLocation(node: ts.Node, sourceFile: ts.SourceFile): {
|
|
30
|
+
line: number;
|
|
31
|
+
column: number;
|
|
32
|
+
};
|
|
33
|
+
/** Ensure structural nodes (project, folders, files) exist. */
|
|
34
|
+
export declare function ensureFileNode(ctx: GraphBuildContext, filePath: string): string;
|
|
35
|
+
/** Register a symbol node and return its id. */
|
|
36
|
+
export declare function registerSymbolNode(ctx: GraphBuildContext, params: {
|
|
37
|
+
kind: NodeKind;
|
|
38
|
+
name: string;
|
|
39
|
+
node: ts.Node;
|
|
40
|
+
sourceFile: ts.SourceFile;
|
|
41
|
+
metadata?: Record<string, string | number | boolean | string[] | undefined>;
|
|
42
|
+
}): string;
|
|
43
|
+
/** Add an edge with standard location metadata. */
|
|
44
|
+
export declare function addLocatedEdge(ctx: GraphBuildContext, params: {
|
|
45
|
+
source: string;
|
|
46
|
+
target: string;
|
|
47
|
+
kind: EdgeKind;
|
|
48
|
+
sourceFile: ts.SourceFile;
|
|
49
|
+
node: ts.Node;
|
|
50
|
+
confidence?: 'high' | 'medium' | 'low';
|
|
51
|
+
static?: boolean;
|
|
52
|
+
extra?: Record<string, string | number | boolean | string[] | undefined>;
|
|
53
|
+
}): GraphEdge;
|
|
54
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/parser/visitors/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,kDAAkD;AAClD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,oCAAoC;AACpC,wBAAgB,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,WAAW,CAapF;AAED,kCAAkC;AAClC,wBAAgB,WAAW,CACzB,IAAI,EAAE,EAAE,CAAC,IAAI,EACb,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAGlC;AAED,+DAA+D;AAC/D,wBAAgB,cAAc,CAAC,GAAG,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAY/E;AA0CD,gDAAgD;AAChD,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE;IACN,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;IACd,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;CAC7E,GACA,MAAM,CAqCR;AAED,mDAAmD;AACnD,wBAAgB,cAAc,CAC5B,GAAG,EAAE,iBAAiB,EACtB,MAAM,EAAE;IACN,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC;IAC1B,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;CAC1E,GACA,SAAS,CAiBX"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { EdgeKind } from '../../model/EdgeKind.js';
|
|
2
|
+
import { NodeKind } from '../../model/NodeKind.js';
|
|
3
|
+
import { toPosixPath } from '../../utils/path.js';
|
|
4
|
+
/** Get source range from a node. */
|
|
5
|
+
export function getSourceRange(node, sourceFile) {
|
|
6
|
+
const { line: startLine, character: startColumn } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));
|
|
7
|
+
const { line: endLine, character: endColumn } = sourceFile.getLineAndCharacterOfPosition(node.getEnd());
|
|
8
|
+
return {
|
|
9
|
+
startLine: startLine + 1,
|
|
10
|
+
startColumn: startColumn + 1,
|
|
11
|
+
endLine: endLine + 1,
|
|
12
|
+
endColumn: endColumn + 1,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/** Get line/column for a node. */
|
|
16
|
+
export function getLocation(node, sourceFile) {
|
|
17
|
+
const { line, character } = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));
|
|
18
|
+
return { line: line + 1, column: character + 1 };
|
|
19
|
+
}
|
|
20
|
+
/** Ensure structural nodes (project, folders, files) exist. */
|
|
21
|
+
export function ensureFileNode(ctx, filePath) {
|
|
22
|
+
const normalized = toPosixPath(filePath);
|
|
23
|
+
const existing = ctx.fileNodeMap.get(normalized);
|
|
24
|
+
if (existing)
|
|
25
|
+
return existing;
|
|
26
|
+
const fileName = normalized.split('/').pop() ?? normalized;
|
|
27
|
+
const fileNode = ctx.nodeFactory.file(fileName, normalized);
|
|
28
|
+
ctx.graph.addNode(fileNode);
|
|
29
|
+
ctx.fileNodeMap.set(normalized, fileNode.id);
|
|
30
|
+
ensureFolderHierarchy(ctx, normalized);
|
|
31
|
+
return fileNode.id;
|
|
32
|
+
}
|
|
33
|
+
function ensureFolderHierarchy(ctx, filePath) {
|
|
34
|
+
const parts = filePath.split('/');
|
|
35
|
+
parts.pop();
|
|
36
|
+
let currentPath = '';
|
|
37
|
+
let parentId;
|
|
38
|
+
const projectNodes = ctx.graph.getNodesByKind(NodeKind.Project);
|
|
39
|
+
parentId = projectNodes[0]?.id;
|
|
40
|
+
for (const part of parts) {
|
|
41
|
+
currentPath = currentPath ? `${currentPath}/${part}` : part;
|
|
42
|
+
const folderId = `Folder:${currentPath}`;
|
|
43
|
+
if (!ctx.graph.getNode(folderId)) {
|
|
44
|
+
const folderNode = ctx.nodeFactory.folder(part, currentPath);
|
|
45
|
+
ctx.graph.addNode(folderNode);
|
|
46
|
+
if (parentId) {
|
|
47
|
+
ctx.graph.addEdge(ctx.edgeFactory.create({
|
|
48
|
+
source: folderNode.id,
|
|
49
|
+
target: parentId,
|
|
50
|
+
kind: EdgeKind.BELONGS_TO,
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
parentId = folderId;
|
|
55
|
+
}
|
|
56
|
+
const fileNodeId = ctx.fileNodeMap.get(filePath);
|
|
57
|
+
if (fileNodeId && parentId) {
|
|
58
|
+
ctx.graph.addEdge(ctx.edgeFactory.create({
|
|
59
|
+
source: fileNodeId,
|
|
60
|
+
target: parentId,
|
|
61
|
+
kind: EdgeKind.BELONGS_TO,
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Register a symbol node and return its id. */
|
|
66
|
+
export function registerSymbolNode(ctx, params) {
|
|
67
|
+
const filePath = toPosixPath(params.sourceFile.fileName);
|
|
68
|
+
ensureFileNode(ctx, filePath);
|
|
69
|
+
const loc = getLocation(params.node, params.sourceFile);
|
|
70
|
+
const range = getSourceRange(params.node, params.sourceFile);
|
|
71
|
+
const graphNode = ctx.nodeFactory.create({
|
|
72
|
+
kind: params.kind,
|
|
73
|
+
label: params.name,
|
|
74
|
+
file: filePath,
|
|
75
|
+
line: loc.line,
|
|
76
|
+
column: loc.column,
|
|
77
|
+
range,
|
|
78
|
+
metadata: params.metadata,
|
|
79
|
+
});
|
|
80
|
+
ctx.graph.addNode(graphNode);
|
|
81
|
+
const fileNodeId = ctx.fileNodeMap.get(filePath);
|
|
82
|
+
if (fileNodeId) {
|
|
83
|
+
ctx.graph.addEdge(ctx.edgeFactory.create({
|
|
84
|
+
source: graphNode.id,
|
|
85
|
+
target: fileNodeId,
|
|
86
|
+
kind: EdgeKind.CONTAINS,
|
|
87
|
+
metadata: {
|
|
88
|
+
file: filePath,
|
|
89
|
+
line: loc.line,
|
|
90
|
+
column: loc.column,
|
|
91
|
+
confidence: 'high',
|
|
92
|
+
static: true,
|
|
93
|
+
},
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
return graphNode.id;
|
|
97
|
+
}
|
|
98
|
+
/** Add an edge with standard location metadata. */
|
|
99
|
+
export function addLocatedEdge(ctx, params) {
|
|
100
|
+
const loc = getLocation(params.node, params.sourceFile);
|
|
101
|
+
const edge = ctx.edgeFactory.create({
|
|
102
|
+
source: params.source,
|
|
103
|
+
target: params.target,
|
|
104
|
+
kind: params.kind,
|
|
105
|
+
metadata: {
|
|
106
|
+
file: toPosixPath(params.sourceFile.fileName),
|
|
107
|
+
line: loc.line,
|
|
108
|
+
column: loc.column,
|
|
109
|
+
confidence: params.confidence ?? 'high',
|
|
110
|
+
static: params.static ?? true,
|
|
111
|
+
...params.extra,
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
ctx.graph.addEdge(edge);
|
|
115
|
+
return edge;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/parser/visitors/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
/** Resolves module specifiers to absolute file paths. */
|
|
3
|
+
export declare class ModuleResolver {
|
|
4
|
+
resolveImport(moduleSpecifier: string, containingFile: string, program: ts.Program): string | undefined;
|
|
5
|
+
isPackageImport(moduleSpecifier: string): boolean;
|
|
6
|
+
getPackageName(moduleSpecifier: string): string;
|
|
7
|
+
}
|
|
8
|
+
/** Resolves file system paths relative to project root. */
|
|
9
|
+
export declare class PathResolver {
|
|
10
|
+
private readonly projectRoot;
|
|
11
|
+
constructor(projectRoot: string);
|
|
12
|
+
toAbsolute(relativePath: string): string;
|
|
13
|
+
toRelative(absolutePath: string): string;
|
|
14
|
+
folderPath(filePath: string): string;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=ModuleResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModuleResolver.d.ts","sourceRoot":"","sources":["../../src/resolver/ModuleResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,YAAY,CAAC;AAG5B,yDAAyD;AACzD,qBAAa,cAAc;IACzB,aAAa,CACX,eAAe,EAAE,MAAM,EACvB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,EAAE,CAAC,OAAO,GAClB,MAAM,GAAG,SAAS;IAarB,eAAe,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO;IAIjD,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM;CAOhD;AAED,2DAA2D;AAC3D,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,EAAE,MAAM;IAEhD,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAIxC,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAOxC,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAGrC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { dirname, resolve } from 'node:path';
|
|
2
|
+
import ts from 'typescript';
|
|
3
|
+
import { toPosixPath } from '../utils/path.js';
|
|
4
|
+
/** Resolves module specifiers to absolute file paths. */
|
|
5
|
+
export class ModuleResolver {
|
|
6
|
+
resolveImport(moduleSpecifier, containingFile, program) {
|
|
7
|
+
const resolved = ts.resolveModuleName(moduleSpecifier, containingFile, program.getCompilerOptions(), ts.sys);
|
|
8
|
+
if (resolved.resolvedModule) {
|
|
9
|
+
return toPosixPath(resolved.resolvedModule.resolvedFileName);
|
|
10
|
+
}
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
isPackageImport(moduleSpecifier) {
|
|
14
|
+
return !moduleSpecifier.startsWith('.') && !moduleSpecifier.startsWith('/');
|
|
15
|
+
}
|
|
16
|
+
getPackageName(moduleSpecifier) {
|
|
17
|
+
if (moduleSpecifier.startsWith('@')) {
|
|
18
|
+
const parts = moduleSpecifier.split('/');
|
|
19
|
+
return parts.slice(0, 2).join('/');
|
|
20
|
+
}
|
|
21
|
+
return moduleSpecifier.split('/')[0] ?? moduleSpecifier;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/** Resolves file system paths relative to project root. */
|
|
25
|
+
export class PathResolver {
|
|
26
|
+
projectRoot;
|
|
27
|
+
constructor(projectRoot) {
|
|
28
|
+
this.projectRoot = projectRoot;
|
|
29
|
+
}
|
|
30
|
+
toAbsolute(relativePath) {
|
|
31
|
+
return toPosixPath(resolve(this.projectRoot, relativePath));
|
|
32
|
+
}
|
|
33
|
+
toRelative(absolutePath) {
|
|
34
|
+
return toPosixPath(resolve(absolutePath)).replace(toPosixPath(resolve(this.projectRoot)) + '/', '');
|
|
35
|
+
}
|
|
36
|
+
folderPath(filePath) {
|
|
37
|
+
return toPosixPath(dirname(filePath));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=ModuleResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModuleResolver.js","sourceRoot":"","sources":["../../src/resolver/ModuleResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,yDAAyD;AACzD,MAAM,OAAO,cAAc;IACzB,aAAa,CACX,eAAuB,EACvB,cAAsB,EACtB,OAAmB;QAEnB,MAAM,QAAQ,GAAG,EAAE,CAAC,iBAAiB,CACnC,eAAe,EACf,cAAc,EACd,OAAO,CAAC,kBAAkB,EAAE,EAC5B,EAAE,CAAC,GAAG,CACP,CAAC;QACF,IAAI,QAAQ,CAAC,cAAc,EAAE,CAAC;YAC5B,OAAO,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,eAAe,CAAC,eAAuB;QACrC,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9E,CAAC;IAED,cAAc,CAAC,eAAuB;QACpC,IAAI,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACzC,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC;IAC1D,CAAC;CACF;AAED,2DAA2D;AAC3D,MAAM,OAAO,YAAY;IACM;IAA7B,YAA6B,WAAmB;QAAnB,gBAAW,GAAX,WAAW,CAAQ;IAAG,CAAC;IAEpD,UAAU,CAAC,YAAoB;QAC7B,OAAO,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,UAAU,CAAC,YAAoB;QAC7B,OAAO,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAC/C,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,GAAG,EAC5C,EAAE,CACH,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,QAAgB;QACzB,OAAO,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxC,CAAC;CACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
/** Resolves TypeScript symbols to their original declarations. */
|
|
3
|
+
export declare class SymbolResolver {
|
|
4
|
+
private readonly checker;
|
|
5
|
+
private readonly cache;
|
|
6
|
+
constructor(checker: ts.TypeChecker);
|
|
7
|
+
getSymbolAtLocation(node: ts.Node): ts.Symbol | undefined;
|
|
8
|
+
resolveAlias(symbol: ts.Symbol): ts.Symbol;
|
|
9
|
+
getDeclaration(symbol: ts.Symbol): ts.Declaration | undefined;
|
|
10
|
+
getDeclarationFile(symbol: ts.Symbol): string | undefined;
|
|
11
|
+
getSymbolName(symbol: ts.Symbol): string;
|
|
12
|
+
getExportsOfModule(sourceFile: ts.SourceFile): ts.Symbol[];
|
|
13
|
+
getEnclosingSymbol(node: ts.Node): ts.Symbol | undefined;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=SymbolResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SymbolResolver.d.ts","sourceRoot":"","sources":["../../src/resolver/SymbolResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,kEAAkE;AAClE,qBAAa,cAAc;IAGb,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoD;gBAE7C,OAAO,EAAE,EAAE,CAAC,WAAW;IAEpD,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,MAAM,GAAG,SAAS;IAWzD,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM;IAO1C,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,WAAW,GAAG,SAAS;IAI7D,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS;IAMzD,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,GAAG,MAAM;IAIxC,kBAAkB,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,MAAM,EAAE;IAM1D,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,MAAM,GAAG,SAAS;CAkBzD"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
import { LookupCache } from '../utils/cache.js';
|
|
3
|
+
import { toPosixPath } from '../utils/path.js';
|
|
4
|
+
/** Resolves TypeScript symbols to their original declarations. */
|
|
5
|
+
export class SymbolResolver {
|
|
6
|
+
checker;
|
|
7
|
+
cache = new LookupCache();
|
|
8
|
+
constructor(checker) {
|
|
9
|
+
this.checker = checker;
|
|
10
|
+
}
|
|
11
|
+
getSymbolAtLocation(node) {
|
|
12
|
+
const key = `${node.getSourceFile().fileName}:${node.getStart()}`;
|
|
13
|
+
if (this.cache.has(key)) {
|
|
14
|
+
return this.cache.get(key);
|
|
15
|
+
}
|
|
16
|
+
const symbol = this.checker.getSymbolAtLocation(node);
|
|
17
|
+
const resolved = symbol ? this.resolveAlias(symbol) : undefined;
|
|
18
|
+
this.cache.set(key, resolved);
|
|
19
|
+
return resolved;
|
|
20
|
+
}
|
|
21
|
+
resolveAlias(symbol) {
|
|
22
|
+
if (symbol.flags & ts.SymbolFlags.Alias) {
|
|
23
|
+
return this.checker.getAliasedSymbol(symbol);
|
|
24
|
+
}
|
|
25
|
+
return symbol;
|
|
26
|
+
}
|
|
27
|
+
getDeclaration(symbol) {
|
|
28
|
+
return symbol.valueDeclaration ?? symbol.declarations?.[0];
|
|
29
|
+
}
|
|
30
|
+
getDeclarationFile(symbol) {
|
|
31
|
+
const decl = this.getDeclaration(symbol);
|
|
32
|
+
if (!decl)
|
|
33
|
+
return undefined;
|
|
34
|
+
return toPosixPath(decl.getSourceFile().fileName);
|
|
35
|
+
}
|
|
36
|
+
getSymbolName(symbol) {
|
|
37
|
+
return symbol.getName();
|
|
38
|
+
}
|
|
39
|
+
getExportsOfModule(sourceFile) {
|
|
40
|
+
const moduleSymbol = this.checker.getSymbolAtLocation(sourceFile);
|
|
41
|
+
if (!moduleSymbol)
|
|
42
|
+
return [];
|
|
43
|
+
return this.checker.getExportsOfModule(moduleSymbol);
|
|
44
|
+
}
|
|
45
|
+
getEnclosingSymbol(node) {
|
|
46
|
+
let current = node;
|
|
47
|
+
while (current) {
|
|
48
|
+
const symbol = this.getSymbolAtLocation(current);
|
|
49
|
+
if (symbol &&
|
|
50
|
+
symbol.flags &
|
|
51
|
+
(ts.SymbolFlags.Class |
|
|
52
|
+
ts.SymbolFlags.Function |
|
|
53
|
+
ts.SymbolFlags.Method |
|
|
54
|
+
ts.SymbolFlags.Interface)) {
|
|
55
|
+
return symbol;
|
|
56
|
+
}
|
|
57
|
+
current = current.parent;
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=SymbolResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SymbolResolver.js","sourceRoot":"","sources":["../../src/resolver/SymbolResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,kEAAkE;AAClE,MAAM,OAAO,cAAc;IAGI;IAFZ,KAAK,GAAG,IAAI,WAAW,EAAiC,CAAC;IAE1E,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAExD,mBAAmB,CAAC,IAAa;QAC/B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QAClE,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,YAAY,CAAC,MAAiB;QAC5B,IAAI,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,cAAc,CAAC,MAAiB;QAC9B,OAAO,MAAM,CAAC,gBAAgB,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,kBAAkB,CAAC,MAAiB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI;YAAE,OAAO,SAAS,CAAC;QAC5B,OAAO,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,aAAa,CAAC,MAAiB;QAC7B,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC;IAED,kBAAkB,CAAC,UAAyB;QAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;QAClE,IAAI,CAAC,YAAY;YAAE,OAAO,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;IAED,kBAAkB,CAAC,IAAa;QAC9B,IAAI,OAAO,GAAwB,IAAI,CAAC;QACxC,OAAO,OAAO,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACjD,IACE,MAAM;gBACN,MAAM,CAAC,KAAK;oBACV,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK;wBACnB,EAAE,CAAC,WAAW,CAAC,QAAQ;wBACvB,EAAE,CAAC,WAAW,CAAC,MAAM;wBACrB,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,EAC7B,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;QAC3B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import ts from 'typescript';
|
|
2
|
+
/** Resolves TypeScript types at AST locations. */
|
|
3
|
+
export declare class TypeResolver {
|
|
4
|
+
private readonly checker;
|
|
5
|
+
private readonly cache;
|
|
6
|
+
constructor(checker: ts.TypeChecker);
|
|
7
|
+
getTypeAtLocation(node: ts.Node): ts.Type;
|
|
8
|
+
getCallSignature(type: ts.Type): ts.Signature | undefined;
|
|
9
|
+
getReturnType(signature: ts.Signature): ts.Type;
|
|
10
|
+
getTypeName(type: ts.Type): string;
|
|
11
|
+
isPromise(type: ts.Type): boolean;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=TypeResolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypeResolver.d.ts","sourceRoot":"","sources":["../../src/resolver/TypeResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAG5B,kDAAkD;AAClD,qBAAa,YAAY;IAGX,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsC;gBAE/B,OAAO,EAAE,EAAE,CAAC,WAAW;IAEpD,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI;IASzC,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,SAAS,GAAG,SAAS;IAIzD,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,IAAI;IAI/C,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,MAAM;IAIlC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO;CAIlC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { LookupCache } from '../utils/cache.js';
|
|
2
|
+
/** Resolves TypeScript types at AST locations. */
|
|
3
|
+
export class TypeResolver {
|
|
4
|
+
checker;
|
|
5
|
+
cache = new LookupCache();
|
|
6
|
+
constructor(checker) {
|
|
7
|
+
this.checker = checker;
|
|
8
|
+
}
|
|
9
|
+
getTypeAtLocation(node) {
|
|
10
|
+
const key = `${node.getSourceFile().fileName}:${node.getStart()}`;
|
|
11
|
+
const cached = this.cache.get(key);
|
|
12
|
+
if (cached)
|
|
13
|
+
return cached;
|
|
14
|
+
const type = this.checker.getTypeAtLocation(node);
|
|
15
|
+
this.cache.set(key, type);
|
|
16
|
+
return type;
|
|
17
|
+
}
|
|
18
|
+
getCallSignature(type) {
|
|
19
|
+
return type.getCallSignatures()[0];
|
|
20
|
+
}
|
|
21
|
+
getReturnType(signature) {
|
|
22
|
+
return this.checker.getReturnTypeOfSignature(signature);
|
|
23
|
+
}
|
|
24
|
+
getTypeName(type) {
|
|
25
|
+
return this.checker.typeToString(type);
|
|
26
|
+
}
|
|
27
|
+
isPromise(type) {
|
|
28
|
+
const symbol = type.getSymbol();
|
|
29
|
+
return symbol?.getName() === 'Promise';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=TypeResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypeResolver.js","sourceRoot":"","sources":["../../src/resolver/TypeResolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,kDAAkD;AAClD,MAAM,OAAO,YAAY;IAGM;IAFZ,KAAK,GAAG,IAAI,WAAW,EAAmB,CAAC;IAE5D,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAExD,iBAAiB,CAAC,IAAa;QAC7B,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;QAClE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,IAAa;QAC5B,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,aAAa,CAAC,SAAuB;QACnC,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;IAED,WAAW,CAAC,IAAa;QACvB,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IAED,SAAS,CAAC,IAAa;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,OAAO,MAAM,EAAE,OAAO,EAAE,KAAK,SAAS,CAAC;IACzC,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Simple LRU-style cache for symbol lookups. */
|
|
2
|
+
export declare class LookupCache<K, V> {
|
|
3
|
+
private readonly map;
|
|
4
|
+
private readonly maxSize;
|
|
5
|
+
constructor(maxSize?: number);
|
|
6
|
+
get(key: K): V | undefined;
|
|
7
|
+
set(key: K, value: V): void;
|
|
8
|
+
has(key: K): boolean;
|
|
9
|
+
clear(): void;
|
|
10
|
+
get size(): number;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,qBAAa,WAAW,CAAC,CAAC,EAAE,CAAC;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAmB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,SAAS;IAI5B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAS1B,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;IAY3B,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO;IAIpB,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Simple LRU-style cache for symbol lookups. */
|
|
2
|
+
export class LookupCache {
|
|
3
|
+
map = new Map();
|
|
4
|
+
maxSize;
|
|
5
|
+
constructor(maxSize = 10_000) {
|
|
6
|
+
this.maxSize = maxSize;
|
|
7
|
+
}
|
|
8
|
+
get(key) {
|
|
9
|
+
const value = this.map.get(key);
|
|
10
|
+
if (value !== undefined) {
|
|
11
|
+
this.map.delete(key);
|
|
12
|
+
this.map.set(key, value);
|
|
13
|
+
}
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
set(key, value) {
|
|
17
|
+
if (this.map.has(key)) {
|
|
18
|
+
this.map.delete(key);
|
|
19
|
+
}
|
|
20
|
+
else if (this.map.size >= this.maxSize) {
|
|
21
|
+
const firstKey = this.map.keys().next().value;
|
|
22
|
+
if (firstKey !== undefined) {
|
|
23
|
+
this.map.delete(firstKey);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
this.map.set(key, value);
|
|
27
|
+
}
|
|
28
|
+
has(key) {
|
|
29
|
+
return this.map.has(key);
|
|
30
|
+
}
|
|
31
|
+
clear() {
|
|
32
|
+
this.map.clear();
|
|
33
|
+
}
|
|
34
|
+
get size() {
|
|
35
|
+
return this.map.size;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/utils/cache.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,MAAM,OAAO,WAAW;IACL,GAAG,GAAG,IAAI,GAAG,EAAQ,CAAC;IACtB,OAAO,CAAS;IAEjC,YAAY,OAAO,GAAG,MAAM;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,GAAG,CAAC,GAAM;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG,CAAC,GAAM,EAAE,KAAQ;QAClB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YAC9C,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,GAAG,CAAC,GAAM;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Create a stable hash-based id from parts. */
|
|
2
|
+
export declare function hashId(...parts: string[]): string;
|
|
3
|
+
/** Build a node id from kind, file, and name. */
|
|
4
|
+
export declare function nodeId(kind: string, file: string, name: string, line?: number): string;
|
|
5
|
+
/** Build an edge id from source, target, and kind. */
|
|
6
|
+
export declare function edgeId(source: string, target: string, kind: string): string;
|
|
7
|
+
//# sourceMappingURL=id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAEA,gDAAgD;AAChD,wBAAgB,MAAM,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEjD;AAED,iDAAiD;AACjD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAGtF;AAED,sDAAsD;AACtD,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3E"}
|
package/dist/utils/id.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
/** Create a stable hash-based id from parts. */
|
|
3
|
+
export function hashId(...parts) {
|
|
4
|
+
return createHash('sha256').update(parts.join('|')).digest('hex').slice(0, 16);
|
|
5
|
+
}
|
|
6
|
+
/** Build a node id from kind, file, and name. */
|
|
7
|
+
export function nodeId(kind, file, name, line) {
|
|
8
|
+
const linePart = line !== undefined ? String(line) : '';
|
|
9
|
+
return `${kind}:${hashId(file, name, linePart)}`;
|
|
10
|
+
}
|
|
11
|
+
/** Build an edge id from source, target, and kind. */
|
|
12
|
+
export function edgeId(source, target, kind) {
|
|
13
|
+
return `edge:${hashId(source, target, kind)}`;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,gDAAgD;AAChD,MAAM,UAAU,MAAM,CAAC,GAAG,KAAe;IACvC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,IAAY,EAAE,IAAY,EAAE,IAAa;IAC5E,MAAM,QAAQ,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,OAAO,GAAG,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;AACnD,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,MAAM,CAAC,MAAc,EAAE,MAAc,EAAE,IAAY;IACjE,OAAO,QAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;AAChD,CAAC"}
|