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.
Files changed (180) hide show
  1. package/README.md +69 -0
  2. package/dist/analysis/CircularDependencyAnalyzer.d.ts +13 -0
  3. package/dist/analysis/CircularDependencyAnalyzer.d.ts.map +1 -0
  4. package/dist/analysis/CircularDependencyAnalyzer.js +15 -0
  5. package/dist/analysis/CircularDependencyAnalyzer.js.map +1 -0
  6. package/dist/analysis/DeadCodeAnalyzer.d.ts +13 -0
  7. package/dist/analysis/DeadCodeAnalyzer.d.ts.map +1 -0
  8. package/dist/analysis/DeadCodeAnalyzer.js +37 -0
  9. package/dist/analysis/DeadCodeAnalyzer.js.map +1 -0
  10. package/dist/analysis/DependencyAnalyzer.d.ts +16 -0
  11. package/dist/analysis/DependencyAnalyzer.d.ts.map +1 -0
  12. package/dist/analysis/DependencyAnalyzer.js +26 -0
  13. package/dist/analysis/DependencyAnalyzer.js.map +1 -0
  14. package/dist/analysis/ImpactAnalyzer.d.ts +16 -0
  15. package/dist/analysis/ImpactAnalyzer.d.ts.map +1 -0
  16. package/dist/analysis/ImpactAnalyzer.js +26 -0
  17. package/dist/analysis/ImpactAnalyzer.js.map +1 -0
  18. package/dist/analysis/LayerViolationAnalyzer.d.ts +31 -0
  19. package/dist/analysis/LayerViolationAnalyzer.d.ts.map +1 -0
  20. package/dist/analysis/LayerViolationAnalyzer.js +71 -0
  21. package/dist/analysis/LayerViolationAnalyzer.js.map +1 -0
  22. package/dist/cli/ProjectLoader.d.ts +13 -0
  23. package/dist/cli/ProjectLoader.d.ts.map +1 -0
  24. package/dist/cli/ProjectLoader.js +48 -0
  25. package/dist/cli/ProjectLoader.js.map +1 -0
  26. package/dist/cli/index.d.ts +3 -0
  27. package/dist/cli/index.d.ts.map +1 -0
  28. package/dist/cli/index.js +139 -0
  29. package/dist/cli/index.js.map +1 -0
  30. package/dist/config/AnalysisConfig.d.ts +22 -0
  31. package/dist/config/AnalysisConfig.d.ts.map +1 -0
  32. package/dist/config/AnalysisConfig.js +6 -0
  33. package/dist/config/AnalysisConfig.js.map +1 -0
  34. package/dist/exporters/CytoscapeExporter.d.ts +18 -0
  35. package/dist/exporters/CytoscapeExporter.d.ts.map +1 -0
  36. package/dist/exporters/CytoscapeExporter.js +85 -0
  37. package/dist/exporters/CytoscapeExporter.js.map +1 -0
  38. package/dist/exporters/DotExporter.d.ts +13 -0
  39. package/dist/exporters/DotExporter.d.ts.map +1 -0
  40. package/dist/exporters/DotExporter.js +38 -0
  41. package/dist/exporters/DotExporter.js.map +1 -0
  42. package/dist/exporters/GraphExporter.d.ts +7 -0
  43. package/dist/exporters/GraphExporter.d.ts.map +1 -0
  44. package/dist/exporters/GraphExporter.js +2 -0
  45. package/dist/exporters/GraphExporter.js.map +1 -0
  46. package/dist/exporters/GraphMLExporter.d.ts +8 -0
  47. package/dist/exporters/GraphMLExporter.d.ts.map +1 -0
  48. package/dist/exporters/GraphMLExporter.js +30 -0
  49. package/dist/exporters/GraphMLExporter.js.map +1 -0
  50. package/dist/exporters/JsonExporter.d.ts +8 -0
  51. package/dist/exporters/JsonExporter.d.ts.map +1 -0
  52. package/dist/exporters/JsonExporter.js +16 -0
  53. package/dist/exporters/JsonExporter.js.map +1 -0
  54. package/dist/graph/EdgeFactory.d.ts +13 -0
  55. package/dist/graph/EdgeFactory.d.ts.map +1 -0
  56. package/dist/graph/EdgeFactory.js +15 -0
  57. package/dist/graph/EdgeFactory.js.map +1 -0
  58. package/dist/graph/Graph.d.ts +37 -0
  59. package/dist/graph/Graph.d.ts.map +1 -0
  60. package/dist/graph/Graph.js +137 -0
  61. package/dist/graph/Graph.js.map +1 -0
  62. package/dist/graph/GraphAlgorithms.d.ts +28 -0
  63. package/dist/graph/GraphAlgorithms.d.ts.map +1 -0
  64. package/dist/graph/GraphAlgorithms.js +233 -0
  65. package/dist/graph/GraphAlgorithms.js.map +1 -0
  66. package/dist/graph/GraphBuilder.d.ts +10 -0
  67. package/dist/graph/GraphBuilder.d.ts.map +1 -0
  68. package/dist/graph/GraphBuilder.js +71 -0
  69. package/dist/graph/GraphBuilder.js.map +1 -0
  70. package/dist/graph/NodeFactory.d.ts +21 -0
  71. package/dist/graph/NodeFactory.d.ts.map +1 -0
  72. package/dist/graph/NodeFactory.js +53 -0
  73. package/dist/graph/NodeFactory.js.map +1 -0
  74. package/dist/index.d.ts +35 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +24 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/model/EdgeKind.d.ts +22 -0
  79. package/dist/model/EdgeKind.d.ts.map +1 -0
  80. package/dist/model/EdgeKind.js +23 -0
  81. package/dist/model/EdgeKind.js.map +1 -0
  82. package/dist/model/GraphEdge.d.ts +22 -0
  83. package/dist/model/GraphEdge.d.ts.map +1 -0
  84. package/dist/model/GraphEdge.js +2 -0
  85. package/dist/model/GraphEdge.js.map +1 -0
  86. package/dist/model/GraphNode.d.ts +22 -0
  87. package/dist/model/GraphNode.d.ts.map +1 -0
  88. package/dist/model/GraphNode.js +2 -0
  89. package/dist/model/GraphNode.js.map +1 -0
  90. package/dist/model/NodeKind.d.ts +21 -0
  91. package/dist/model/NodeKind.d.ts.map +1 -0
  92. package/dist/model/NodeKind.js +22 -0
  93. package/dist/model/NodeKind.js.map +1 -0
  94. package/dist/parser/ASTWalker.d.ts +21 -0
  95. package/dist/parser/ASTWalker.d.ts.map +1 -0
  96. package/dist/parser/ASTWalker.js +23 -0
  97. package/dist/parser/ASTWalker.js.map +1 -0
  98. package/dist/parser/ProgramFactory.d.ts +15 -0
  99. package/dist/parser/ProgramFactory.d.ts.map +1 -0
  100. package/dist/parser/ProgramFactory.js +65 -0
  101. package/dist/parser/ProgramFactory.js.map +1 -0
  102. package/dist/parser/visitors/CallVisitor.d.ts +17 -0
  103. package/dist/parser/visitors/CallVisitor.d.ts.map +1 -0
  104. package/dist/parser/visitors/CallVisitor.js +111 -0
  105. package/dist/parser/visitors/CallVisitor.js.map +1 -0
  106. package/dist/parser/visitors/ClassVisitor.d.ts +14 -0
  107. package/dist/parser/visitors/ClassVisitor.d.ts.map +1 -0
  108. package/dist/parser/visitors/ClassVisitor.js +87 -0
  109. package/dist/parser/visitors/ClassVisitor.js.map +1 -0
  110. package/dist/parser/visitors/DecoratorVisitor.d.ts +13 -0
  111. package/dist/parser/visitors/DecoratorVisitor.d.ts.map +1 -0
  112. package/dist/parser/visitors/DecoratorVisitor.js +65 -0
  113. package/dist/parser/visitors/DecoratorVisitor.js.map +1 -0
  114. package/dist/parser/visitors/EnumVisitor.d.ts +11 -0
  115. package/dist/parser/visitors/EnumVisitor.d.ts.map +1 -0
  116. package/dist/parser/visitors/EnumVisitor.js +26 -0
  117. package/dist/parser/visitors/EnumVisitor.js.map +1 -0
  118. package/dist/parser/visitors/ExportVisitor.d.ts +16 -0
  119. package/dist/parser/visitors/ExportVisitor.d.ts.map +1 -0
  120. package/dist/parser/visitors/ExportVisitor.js +95 -0
  121. package/dist/parser/visitors/ExportVisitor.js.map +1 -0
  122. package/dist/parser/visitors/FunctionVisitor.d.ts +14 -0
  123. package/dist/parser/visitors/FunctionVisitor.d.ts.map +1 -0
  124. package/dist/parser/visitors/FunctionVisitor.js +74 -0
  125. package/dist/parser/visitors/FunctionVisitor.js.map +1 -0
  126. package/dist/parser/visitors/HeritageVisitor.d.ts +14 -0
  127. package/dist/parser/visitors/HeritageVisitor.d.ts.map +1 -0
  128. package/dist/parser/visitors/HeritageVisitor.js +87 -0
  129. package/dist/parser/visitors/HeritageVisitor.js.map +1 -0
  130. package/dist/parser/visitors/ImportVisitor.d.ts +14 -0
  131. package/dist/parser/visitors/ImportVisitor.d.ts.map +1 -0
  132. package/dist/parser/visitors/ImportVisitor.js +96 -0
  133. package/dist/parser/visitors/ImportVisitor.js.map +1 -0
  134. package/dist/parser/visitors/InterfaceVisitor.d.ts +11 -0
  135. package/dist/parser/visitors/InterfaceVisitor.d.ts.map +1 -0
  136. package/dist/parser/visitors/InterfaceVisitor.js +28 -0
  137. package/dist/parser/visitors/InterfaceVisitor.js.map +1 -0
  138. package/dist/parser/visitors/MethodVisitor.d.ts +11 -0
  139. package/dist/parser/visitors/MethodVisitor.d.ts.map +1 -0
  140. package/dist/parser/visitors/MethodVisitor.js +30 -0
  141. package/dist/parser/visitors/MethodVisitor.js.map +1 -0
  142. package/dist/parser/visitors/TypeReferenceVisitor.d.ts +15 -0
  143. package/dist/parser/visitors/TypeReferenceVisitor.d.ts.map +1 -0
  144. package/dist/parser/visitors/TypeReferenceVisitor.js +85 -0
  145. package/dist/parser/visitors/TypeReferenceVisitor.js.map +1 -0
  146. package/dist/parser/visitors/VariableVisitor.d.ts +11 -0
  147. package/dist/parser/visitors/VariableVisitor.d.ts.map +1 -0
  148. package/dist/parser/visitors/VariableVisitor.js +27 -0
  149. package/dist/parser/visitors/VariableVisitor.js.map +1 -0
  150. package/dist/parser/visitors/context.d.ts +54 -0
  151. package/dist/parser/visitors/context.d.ts.map +1 -0
  152. package/dist/parser/visitors/context.js +117 -0
  153. package/dist/parser/visitors/context.js.map +1 -0
  154. package/dist/resolver/ModuleResolver.d.ts +16 -0
  155. package/dist/resolver/ModuleResolver.d.ts.map +1 -0
  156. package/dist/resolver/ModuleResolver.js +40 -0
  157. package/dist/resolver/ModuleResolver.js.map +1 -0
  158. package/dist/resolver/SymbolResolver.d.ts +15 -0
  159. package/dist/resolver/SymbolResolver.d.ts.map +1 -0
  160. package/dist/resolver/SymbolResolver.js +62 -0
  161. package/dist/resolver/SymbolResolver.js.map +1 -0
  162. package/dist/resolver/TypeResolver.d.ts +13 -0
  163. package/dist/resolver/TypeResolver.d.ts.map +1 -0
  164. package/dist/resolver/TypeResolver.js +32 -0
  165. package/dist/resolver/TypeResolver.js.map +1 -0
  166. package/dist/utils/cache.d.ts +12 -0
  167. package/dist/utils/cache.d.ts.map +1 -0
  168. package/dist/utils/cache.js +38 -0
  169. package/dist/utils/cache.js.map +1 -0
  170. package/dist/utils/id.d.ts +7 -0
  171. package/dist/utils/id.d.ts.map +1 -0
  172. package/dist/utils/id.js +15 -0
  173. package/dist/utils/id.js.map +1 -0
  174. package/dist/utils/path.d.ts +9 -0
  175. package/dist/utils/path.d.ts.map +1 -0
  176. package/dist/utils/path.js +18 -0
  177. package/dist/utils/path.js.map +1 -0
  178. package/docs/ARCHITECTURE.md +100 -0
  179. package/docs/CLI.md +62 -0
  180. 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"}
@@ -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"}