@grafema/core 0.1.0-alpha.5 → 0.2.0-beta

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 (530) hide show
  1. package/README.md +0 -1
  2. package/dist/Orchestrator.d.ts +31 -2
  3. package/dist/Orchestrator.d.ts.map +1 -1
  4. package/dist/Orchestrator.js +222 -27
  5. package/dist/config/ConfigLoader.d.ts +90 -0
  6. package/dist/config/ConfigLoader.d.ts.map +1 -0
  7. package/dist/config/ConfigLoader.js +249 -0
  8. package/dist/config/index.d.ts +6 -0
  9. package/dist/config/index.d.ts.map +1 -0
  10. package/dist/config/index.js +4 -0
  11. package/dist/core/ASTWorker.d.ts +11 -36
  12. package/dist/core/ASTWorker.d.ts.map +1 -1
  13. package/dist/core/ASTWorker.js +93 -99
  14. package/dist/core/CoverageAnalyzer.d.ts +65 -0
  15. package/dist/core/CoverageAnalyzer.d.ts.map +1 -0
  16. package/dist/core/CoverageAnalyzer.js +198 -0
  17. package/dist/core/FileExplainer.d.ts +101 -0
  18. package/dist/core/FileExplainer.d.ts.map +1 -0
  19. package/dist/core/FileExplainer.js +139 -0
  20. package/dist/core/FileNodeManager.d.ts +40 -0
  21. package/dist/core/FileNodeManager.d.ts.map +1 -0
  22. package/dist/core/FileNodeManager.js +84 -0
  23. package/dist/core/GraphFreshnessChecker.d.ts +33 -0
  24. package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
  25. package/dist/core/GraphFreshnessChecker.js +101 -0
  26. package/dist/core/HashUtils.d.ts +24 -0
  27. package/dist/core/HashUtils.d.ts.map +1 -0
  28. package/dist/core/HashUtils.js +45 -0
  29. package/dist/core/IncrementalReanalyzer.d.ts +36 -0
  30. package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
  31. package/dist/core/IncrementalReanalyzer.js +132 -0
  32. package/dist/core/NodeFactory.d.ts +266 -19
  33. package/dist/core/NodeFactory.d.ts.map +1 -1
  34. package/dist/core/NodeFactory.js +256 -21
  35. package/dist/core/ScopeTracker.d.ts +84 -0
  36. package/dist/core/ScopeTracker.d.ts.map +1 -0
  37. package/dist/core/ScopeTracker.js +116 -0
  38. package/dist/core/SemanticId.d.ts +90 -0
  39. package/dist/core/SemanticId.d.ts.map +1 -0
  40. package/dist/core/SemanticId.js +115 -0
  41. package/dist/core/VersionManager.d.ts.map +1 -1
  42. package/dist/core/VersionManager.js +3 -2
  43. package/dist/core/nodes/ArgumentExpressionNode.d.ts +43 -0
  44. package/dist/core/nodes/ArgumentExpressionNode.d.ts.map +1 -0
  45. package/dist/core/nodes/ArgumentExpressionNode.js +60 -0
  46. package/dist/core/nodes/ArrayLiteralNode.d.ts +27 -0
  47. package/dist/core/nodes/ArrayLiteralNode.d.ts.map +1 -0
  48. package/dist/core/nodes/ArrayLiteralNode.js +43 -0
  49. package/dist/core/nodes/BranchNode.d.ts +41 -0
  50. package/dist/core/nodes/BranchNode.d.ts.map +1 -0
  51. package/dist/core/nodes/BranchNode.js +82 -0
  52. package/dist/core/nodes/CallSiteNode.d.ts +30 -2
  53. package/dist/core/nodes/CallSiteNode.d.ts.map +1 -1
  54. package/dist/core/nodes/CallSiteNode.js +54 -4
  55. package/dist/core/nodes/CaseNode.d.ts +43 -0
  56. package/dist/core/nodes/CaseNode.d.ts.map +1 -0
  57. package/dist/core/nodes/CaseNode.js +81 -0
  58. package/dist/core/nodes/ClassNode.d.ts +34 -2
  59. package/dist/core/nodes/ClassNode.d.ts.map +1 -1
  60. package/dist/core/nodes/ClassNode.js +52 -4
  61. package/dist/core/nodes/ConstantNode.d.ts +2 -2
  62. package/dist/core/nodes/ConstantNode.d.ts.map +1 -1
  63. package/dist/core/nodes/ConstantNode.js +6 -4
  64. package/dist/core/nodes/ConstructorCallNode.d.ts +51 -0
  65. package/dist/core/nodes/ConstructorCallNode.d.ts.map +1 -0
  66. package/dist/core/nodes/ConstructorCallNode.js +171 -0
  67. package/dist/core/nodes/DatabaseQueryNode.d.ts +3 -2
  68. package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -1
  69. package/dist/core/nodes/DatabaseQueryNode.js +5 -2
  70. package/dist/core/nodes/DecoratorNode.d.ts +42 -0
  71. package/dist/core/nodes/DecoratorNode.d.ts.map +1 -0
  72. package/dist/core/nodes/DecoratorNode.js +64 -0
  73. package/dist/core/nodes/EnumNode.d.ts +42 -0
  74. package/dist/core/nodes/EnumNode.d.ts.map +1 -0
  75. package/dist/core/nodes/EnumNode.js +56 -0
  76. package/dist/core/nodes/EventListenerNode.d.ts +4 -4
  77. package/dist/core/nodes/EventListenerNode.d.ts.map +1 -1
  78. package/dist/core/nodes/EventListenerNode.js +7 -4
  79. package/dist/core/nodes/ExportNode.d.ts +38 -2
  80. package/dist/core/nodes/ExportNode.d.ts.map +1 -1
  81. package/dist/core/nodes/ExportNode.js +54 -4
  82. package/dist/core/nodes/ExpressionNode.d.ts +97 -0
  83. package/dist/core/nodes/ExpressionNode.d.ts.map +1 -0
  84. package/dist/core/nodes/ExpressionNode.js +180 -0
  85. package/dist/core/nodes/ExternalModuleNode.d.ts +32 -0
  86. package/dist/core/nodes/ExternalModuleNode.d.ts.map +1 -0
  87. package/dist/core/nodes/ExternalModuleNode.js +49 -0
  88. package/dist/core/nodes/ExternalStdioNode.d.ts +13 -6
  89. package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -1
  90. package/dist/core/nodes/ExternalStdioNode.js +15 -8
  91. package/dist/core/nodes/FunctionNode.d.ts +36 -0
  92. package/dist/core/nodes/FunctionNode.d.ts.map +1 -1
  93. package/dist/core/nodes/FunctionNode.js +80 -1
  94. package/dist/core/nodes/HttpRequestNode.d.ts +4 -4
  95. package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -1
  96. package/dist/core/nodes/HttpRequestNode.js +7 -4
  97. package/dist/core/nodes/ImportNode.d.ts +28 -6
  98. package/dist/core/nodes/ImportNode.d.ts.map +1 -1
  99. package/dist/core/nodes/ImportNode.js +43 -8
  100. package/dist/core/nodes/InterfaceNode.d.ts +46 -0
  101. package/dist/core/nodes/InterfaceNode.d.ts.map +1 -0
  102. package/dist/core/nodes/InterfaceNode.js +57 -0
  103. package/dist/core/nodes/IssueNode.d.ts +73 -0
  104. package/dist/core/nodes/IssueNode.d.ts.map +1 -0
  105. package/dist/core/nodes/IssueNode.js +129 -0
  106. package/dist/core/nodes/LiteralNode.d.ts +2 -2
  107. package/dist/core/nodes/LiteralNode.d.ts.map +1 -1
  108. package/dist/core/nodes/LiteralNode.js +6 -4
  109. package/dist/core/nodes/MethodCallNode.d.ts +32 -2
  110. package/dist/core/nodes/MethodCallNode.d.ts.map +1 -1
  111. package/dist/core/nodes/MethodCallNode.js +57 -4
  112. package/dist/core/nodes/MethodNode.d.ts +34 -2
  113. package/dist/core/nodes/MethodNode.d.ts.map +1 -1
  114. package/dist/core/nodes/MethodNode.js +55 -3
  115. package/dist/core/nodes/ModuleNode.d.ts +31 -0
  116. package/dist/core/nodes/ModuleNode.d.ts.map +1 -1
  117. package/dist/core/nodes/ModuleNode.js +37 -0
  118. package/dist/core/nodes/NetworkRequestNode.d.ts +54 -0
  119. package/dist/core/nodes/NetworkRequestNode.d.ts.map +1 -0
  120. package/dist/core/nodes/NetworkRequestNode.js +65 -0
  121. package/dist/core/nodes/ObjectLiteralNode.d.ts +27 -0
  122. package/dist/core/nodes/ObjectLiteralNode.d.ts.map +1 -0
  123. package/dist/core/nodes/ObjectLiteralNode.js +43 -0
  124. package/dist/core/nodes/ParameterNode.d.ts +2 -2
  125. package/dist/core/nodes/ParameterNode.d.ts.map +1 -1
  126. package/dist/core/nodes/ParameterNode.js +5 -3
  127. package/dist/core/nodes/ScopeNode.d.ts +31 -0
  128. package/dist/core/nodes/ScopeNode.d.ts.map +1 -1
  129. package/dist/core/nodes/ScopeNode.js +49 -0
  130. package/dist/core/nodes/TypeNode.d.ts +36 -0
  131. package/dist/core/nodes/TypeNode.d.ts.map +1 -0
  132. package/dist/core/nodes/TypeNode.js +55 -0
  133. package/dist/core/nodes/VariableDeclarationNode.d.ts +29 -2
  134. package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -1
  135. package/dist/core/nodes/VariableDeclarationNode.js +48 -4
  136. package/dist/core/nodes/index.d.ts +15 -1
  137. package/dist/core/nodes/index.d.ts.map +1 -1
  138. package/dist/core/nodes/index.js +17 -0
  139. package/dist/data/builtins/BuiltinRegistry.d.ts +78 -0
  140. package/dist/data/builtins/BuiltinRegistry.d.ts.map +1 -0
  141. package/dist/data/builtins/BuiltinRegistry.js +110 -0
  142. package/dist/data/builtins/definitions.d.ts +28 -0
  143. package/dist/data/builtins/definitions.d.ts.map +1 -0
  144. package/dist/data/builtins/definitions.js +250 -0
  145. package/dist/data/builtins/index.d.ts +10 -0
  146. package/dist/data/builtins/index.d.ts.map +1 -0
  147. package/dist/data/builtins/index.js +8 -0
  148. package/dist/data/builtins/jsGlobals.d.ts +18 -0
  149. package/dist/data/builtins/jsGlobals.d.ts.map +1 -0
  150. package/dist/data/builtins/jsGlobals.js +26 -0
  151. package/dist/data/builtins/types.d.ts +34 -0
  152. package/dist/data/builtins/types.d.ts.map +1 -0
  153. package/dist/data/builtins/types.js +7 -0
  154. package/dist/data/globals/definitions.d.ts +27 -0
  155. package/dist/data/globals/definitions.d.ts.map +1 -0
  156. package/dist/data/globals/definitions.js +117 -0
  157. package/dist/data/globals/index.d.ts +36 -0
  158. package/dist/data/globals/index.d.ts.map +1 -0
  159. package/dist/data/globals/index.js +52 -0
  160. package/dist/diagnostics/DiagnosticCollector.d.ts +98 -0
  161. package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
  162. package/dist/diagnostics/DiagnosticCollector.js +129 -0
  163. package/dist/diagnostics/DiagnosticReporter.d.ts +100 -0
  164. package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
  165. package/dist/diagnostics/DiagnosticReporter.js +247 -0
  166. package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
  167. package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
  168. package/dist/diagnostics/DiagnosticWriter.js +43 -0
  169. package/dist/diagnostics/index.d.ts +14 -0
  170. package/dist/diagnostics/index.d.ts.map +1 -0
  171. package/dist/diagnostics/index.js +11 -0
  172. package/dist/errors/GrafemaError.d.ts +161 -0
  173. package/dist/errors/GrafemaError.d.ts.map +1 -0
  174. package/dist/errors/GrafemaError.js +181 -0
  175. package/dist/index.d.ts +73 -1
  176. package/dist/index.d.ts.map +1 -1
  177. package/dist/index.js +70 -1
  178. package/dist/logging/Logger.d.ts +48 -0
  179. package/dist/logging/Logger.d.ts.map +1 -0
  180. package/dist/logging/Logger.js +134 -0
  181. package/dist/plugins/Plugin.d.ts +5 -1
  182. package/dist/plugins/Plugin.d.ts.map +1 -1
  183. package/dist/plugins/Plugin.js +33 -0
  184. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -1
  185. package/dist/plugins/analysis/DatabaseAnalyzer.js +14 -6
  186. package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -1
  187. package/dist/plugins/analysis/ExpressAnalyzer.js +29 -19
  188. package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts +148 -0
  189. package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts.map +1 -0
  190. package/dist/plugins/analysis/ExpressResponseAnalyzer.js +495 -0
  191. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -1
  192. package/dist/plugins/analysis/ExpressRouteAnalyzer.js +71 -29
  193. package/dist/plugins/analysis/FetchAnalyzer.d.ts +41 -0
  194. package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -1
  195. package/dist/plugins/analysis/FetchAnalyzer.js +187 -19
  196. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +6 -3
  197. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -1
  198. package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +76 -80
  199. package/dist/plugins/analysis/JSASTAnalyzer.d.ts +313 -19
  200. package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -1
  201. package/dist/plugins/analysis/JSASTAnalyzer.js +3430 -503
  202. package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -1
  203. package/dist/plugins/analysis/ReactAnalyzer.js +56 -57
  204. package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -1
  205. package/dist/plugins/analysis/RustAnalyzer.js +16 -11
  206. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -1
  207. package/dist/plugins/analysis/SQLiteAnalyzer.js +11 -7
  208. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -1
  209. package/dist/plugins/analysis/ServiceLayerAnalyzer.js +21 -9
  210. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +9 -0
  211. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -1
  212. package/dist/plugins/analysis/SocketIOAnalyzer.js +117 -21
  213. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -1
  214. package/dist/plugins/analysis/SystemDbAnalyzer.js +15 -5
  215. package/dist/plugins/analysis/ast/GraphBuilder.d.ts +207 -4
  216. package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -1
  217. package/dist/plugins/analysis/ast/GraphBuilder.js +1527 -316
  218. package/dist/plugins/analysis/ast/IdGenerator.d.ts +105 -0
  219. package/dist/plugins/analysis/ast/IdGenerator.d.ts.map +1 -0
  220. package/dist/plugins/analysis/ast/IdGenerator.js +116 -0
  221. package/dist/plugins/analysis/ast/types.d.ts +470 -5
  222. package/dist/plugins/analysis/ast/types.d.ts.map +1 -1
  223. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts +33 -0
  224. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts.map +1 -0
  225. package/dist/plugins/analysis/ast/utils/createParameterNodes.js +89 -0
  226. package/dist/plugins/analysis/ast/utils/index.d.ts +6 -0
  227. package/dist/plugins/analysis/ast/utils/index.d.ts.map +1 -0
  228. package/dist/plugins/analysis/ast/utils/index.js +5 -0
  229. package/dist/plugins/analysis/ast/utils/location.d.ts +87 -0
  230. package/dist/plugins/analysis/ast/utils/location.d.ts.map +1 -0
  231. package/dist/plugins/analysis/ast/utils/location.js +78 -0
  232. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +14 -5
  233. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -1
  234. package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +6 -5
  235. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +100 -9
  236. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -1
  237. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +674 -125
  238. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +4 -1
  239. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -1
  240. package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +72 -32
  241. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +14 -1
  242. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -1
  243. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +190 -63
  244. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +4 -0
  245. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -1
  246. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +112 -8
  247. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +12 -1
  248. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -1
  249. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +36 -14
  250. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +20 -2
  251. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -1
  252. package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +243 -45
  253. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -1
  254. package/dist/plugins/discovery/MonorepoServiceDiscovery.js +3 -2
  255. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -1
  256. package/dist/plugins/discovery/SimpleProjectDiscovery.js +5 -1
  257. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts +22 -0
  258. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts.map +1 -0
  259. package/dist/plugins/discovery/WorkspaceDiscovery.js +141 -0
  260. package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts +46 -0
  261. package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts.map +1 -0
  262. package/dist/plugins/discovery/resolveSourceEntrypoint.js +86 -0
  263. package/dist/plugins/discovery/workspaces/detector.d.ts +21 -0
  264. package/dist/plugins/discovery/workspaces/detector.d.ts.map +1 -0
  265. package/dist/plugins/discovery/workspaces/detector.js +49 -0
  266. package/dist/plugins/discovery/workspaces/globResolver.d.ts +35 -0
  267. package/dist/plugins/discovery/workspaces/globResolver.d.ts.map +1 -0
  268. package/dist/plugins/discovery/workspaces/globResolver.js +184 -0
  269. package/dist/plugins/discovery/workspaces/index.d.ts +9 -0
  270. package/dist/plugins/discovery/workspaces/index.d.ts.map +1 -0
  271. package/dist/plugins/discovery/workspaces/index.js +8 -0
  272. package/dist/plugins/discovery/workspaces/parsers.d.ts +38 -0
  273. package/dist/plugins/discovery/workspaces/parsers.d.ts.map +1 -0
  274. package/dist/plugins/discovery/workspaces/parsers.js +80 -0
  275. package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -1
  276. package/dist/plugins/enrichment/AliasTracker.js +29 -8
  277. package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts +32 -0
  278. package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts.map +1 -0
  279. package/dist/plugins/enrichment/ArgumentParameterLinker.js +175 -0
  280. package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts +51 -0
  281. package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts.map +1 -0
  282. package/dist/plugins/enrichment/ClosureCaptureEnricher.js +205 -0
  283. package/dist/plugins/enrichment/ExternalCallResolver.d.ts +42 -0
  284. package/dist/plugins/enrichment/ExternalCallResolver.d.ts.map +1 -0
  285. package/dist/plugins/enrichment/ExternalCallResolver.js +213 -0
  286. package/dist/plugins/enrichment/FunctionCallResolver.d.ts +58 -0
  287. package/dist/plugins/enrichment/FunctionCallResolver.d.ts.map +1 -0
  288. package/dist/plugins/enrichment/FunctionCallResolver.js +340 -0
  289. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +16 -3
  290. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -1
  291. package/dist/plugins/enrichment/HTTPConnectionEnricher.js +78 -27
  292. package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -1
  293. package/dist/plugins/enrichment/ImportExportLinker.js +23 -6
  294. package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -1
  295. package/dist/plugins/enrichment/MethodCallResolver.js +33 -13
  296. package/dist/plugins/enrichment/MountPointResolver.d.ts +14 -12
  297. package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -1
  298. package/dist/plugins/enrichment/MountPointResolver.js +173 -147
  299. package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts +44 -0
  300. package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts.map +1 -0
  301. package/dist/plugins/enrichment/NodejsBuiltinsResolver.js +271 -0
  302. package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -1
  303. package/dist/plugins/enrichment/PrefixEvaluator.js +16 -7
  304. package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -1
  305. package/dist/plugins/enrichment/RustFFIEnricher.js +6 -5
  306. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +22 -27
  307. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -1
  308. package/dist/plugins/enrichment/ValueDomainAnalyzer.js +185 -143
  309. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -1
  310. package/dist/plugins/indexing/IncrementalModuleIndexer.js +23 -14
  311. package/dist/plugins/indexing/JSModuleIndexer.d.ts +15 -0
  312. package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -1
  313. package/dist/plugins/indexing/JSModuleIndexer.js +121 -31
  314. package/dist/plugins/indexing/RustModuleIndexer.d.ts +1 -1
  315. package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -1
  316. package/dist/plugins/indexing/RustModuleIndexer.js +8 -7
  317. package/dist/plugins/indexing/ServiceDetector.d.ts +10 -0
  318. package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -1
  319. package/dist/plugins/indexing/ServiceDetector.js +28 -15
  320. package/dist/plugins/validation/BrokenImportValidator.d.ts +31 -0
  321. package/dist/plugins/validation/BrokenImportValidator.d.ts.map +1 -0
  322. package/dist/plugins/validation/BrokenImportValidator.js +249 -0
  323. package/dist/plugins/validation/CallResolverValidator.d.ts +21 -10
  324. package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -1
  325. package/dist/plugins/validation/CallResolverValidator.js +103 -77
  326. package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -1
  327. package/dist/plugins/validation/DataFlowValidator.js +62 -49
  328. package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -1
  329. package/dist/plugins/validation/EvalBanValidator.js +17 -16
  330. package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -1
  331. package/dist/plugins/validation/GraphConnectivityValidator.js +44 -24
  332. package/dist/plugins/validation/NodeCreationValidator.d.ts +85 -0
  333. package/dist/plugins/validation/NodeCreationValidator.d.ts.map +1 -0
  334. package/dist/plugins/validation/NodeCreationValidator.js +415 -0
  335. package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -1
  336. package/dist/plugins/validation/SQLInjectionValidator.js +61 -19
  337. package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -1
  338. package/dist/plugins/validation/ShadowingDetector.js +6 -5
  339. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -1
  340. package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +12 -11
  341. package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -1
  342. package/dist/plugins/vcs/GitPlugin.js +10 -12
  343. package/dist/plugins/vcs/VCSPlugin.d.ts +3 -2
  344. package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -1
  345. package/dist/plugins/vcs/VCSPlugin.js +5 -5
  346. package/dist/queries/findCallsInFunction.d.ts +52 -0
  347. package/dist/queries/findCallsInFunction.d.ts.map +1 -0
  348. package/dist/queries/findCallsInFunction.js +135 -0
  349. package/dist/queries/findContainingFunction.d.ts +45 -0
  350. package/dist/queries/findContainingFunction.d.ts.map +1 -0
  351. package/dist/queries/findContainingFunction.js +54 -0
  352. package/dist/queries/index.d.ts +14 -0
  353. package/dist/queries/index.d.ts.map +1 -0
  354. package/dist/queries/index.js +11 -0
  355. package/dist/queries/traceValues.d.ts +70 -0
  356. package/dist/queries/traceValues.d.ts.map +1 -0
  357. package/dist/queries/traceValues.js +299 -0
  358. package/dist/queries/types.d.ts +163 -0
  359. package/dist/queries/types.d.ts.map +1 -0
  360. package/dist/queries/types.js +9 -0
  361. package/dist/schema/GraphSchemaExtractor.d.ts +53 -0
  362. package/dist/schema/GraphSchemaExtractor.d.ts.map +1 -0
  363. package/dist/schema/GraphSchemaExtractor.js +124 -0
  364. package/dist/schema/InterfaceSchemaExtractor.d.ts +73 -0
  365. package/dist/schema/InterfaceSchemaExtractor.d.ts.map +1 -0
  366. package/dist/schema/InterfaceSchemaExtractor.js +112 -0
  367. package/dist/schema/index.d.ts +5 -0
  368. package/dist/schema/index.d.ts.map +1 -0
  369. package/dist/schema/index.js +2 -0
  370. package/dist/storage/backends/RFDBServerBackend.d.ts +21 -34
  371. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -1
  372. package/dist/storage/backends/RFDBServerBackend.js +72 -62
  373. package/dist/storage/backends/typeValidation.d.ts.map +1 -1
  374. package/dist/storage/backends/typeValidation.js +1 -0
  375. package/dist/validation/PathValidator.d.ts +1 -2
  376. package/dist/validation/PathValidator.d.ts.map +1 -1
  377. package/package.json +3 -3
  378. package/src/Orchestrator.ts +272 -27
  379. package/src/config/ConfigLoader.ts +354 -0
  380. package/src/config/index.ts +5 -0
  381. package/src/core/ASTWorker.ts +143 -139
  382. package/src/core/CoverageAnalyzer.ts +243 -0
  383. package/src/core/FileExplainer.ts +179 -0
  384. package/src/core/FileNodeManager.ts +100 -0
  385. package/src/core/GraphFreshnessChecker.ts +143 -0
  386. package/src/core/HashUtils.ts +48 -0
  387. package/src/core/IncrementalReanalyzer.ts +192 -0
  388. package/src/core/NodeFactory.ts +470 -23
  389. package/src/core/ScopeTracker.ts +154 -0
  390. package/src/core/SemanticId.ts +192 -0
  391. package/src/core/VersionManager.ts +3 -2
  392. package/src/core/nodes/ArgumentExpressionNode.ts +89 -0
  393. package/src/core/nodes/ArrayLiteralNode.ts +66 -0
  394. package/src/core/nodes/BranchNode.ts +113 -0
  395. package/src/core/nodes/CallSiteNode.ts +64 -4
  396. package/src/core/nodes/CaseNode.ts +123 -0
  397. package/src/core/nodes/ClassNode.ts +67 -4
  398. package/src/core/nodes/ConstantNode.ts +5 -4
  399. package/src/core/nodes/ConstructorCallNode.ts +217 -0
  400. package/src/core/nodes/DatabaseQueryNode.ts +5 -1
  401. package/src/core/nodes/DecoratorNode.ts +92 -0
  402. package/src/core/nodes/EnumNode.ts +87 -0
  403. package/src/core/nodes/EventListenerNode.ts +7 -4
  404. package/src/core/nodes/ExportNode.ts +74 -4
  405. package/src/core/nodes/ExpressionNode.ts +232 -0
  406. package/src/core/nodes/ExternalModuleNode.ts +65 -0
  407. package/src/core/nodes/ExternalStdioNode.ts +17 -9
  408. package/src/core/nodes/FunctionNode.ts +101 -1
  409. package/src/core/nodes/HttpRequestNode.ts +7 -4
  410. package/src/core/nodes/ImportNode.ts +62 -13
  411. package/src/core/nodes/InterfaceNode.ts +92 -0
  412. package/src/core/nodes/IssueNode.ts +177 -0
  413. package/src/core/nodes/LiteralNode.ts +5 -4
  414. package/src/core/nodes/MethodCallNode.ts +70 -4
  415. package/src/core/nodes/MethodNode.ts +68 -3
  416. package/src/core/nodes/ModuleNode.ts +50 -0
  417. package/src/core/nodes/NetworkRequestNode.ts +77 -0
  418. package/src/core/nodes/ObjectLiteralNode.ts +66 -0
  419. package/src/core/nodes/ParameterNode.ts +4 -3
  420. package/src/core/nodes/ScopeNode.ts +65 -0
  421. package/src/core/nodes/TypeNode.ts +79 -0
  422. package/src/core/nodes/VariableDeclarationNode.ts +58 -4
  423. package/src/core/nodes/index.ts +21 -1
  424. package/src/data/builtins/BuiltinRegistry.ts +124 -0
  425. package/src/data/builtins/definitions.ts +267 -0
  426. package/src/data/builtins/index.ts +10 -0
  427. package/src/data/builtins/jsGlobals.ts +28 -0
  428. package/src/data/builtins/types.ts +36 -0
  429. package/src/data/globals/definitions.ts +156 -0
  430. package/src/data/globals/index.ts +66 -0
  431. package/src/diagnostics/DiagnosticCollector.ts +163 -0
  432. package/src/diagnostics/DiagnosticReporter.ts +324 -0
  433. package/src/diagnostics/DiagnosticWriter.ts +50 -0
  434. package/src/diagnostics/index.ts +16 -0
  435. package/src/errors/GrafemaError.ts +239 -0
  436. package/src/index.ts +193 -1
  437. package/src/logging/Logger.ts +152 -0
  438. package/src/plugins/Plugin.ts +42 -0
  439. package/src/plugins/analysis/DatabaseAnalyzer.ts +16 -8
  440. package/src/plugins/analysis/ExpressAnalyzer.ts +33 -19
  441. package/src/plugins/analysis/ExpressResponseAnalyzer.ts +636 -0
  442. package/src/plugins/analysis/ExpressRouteAnalyzer.ts +76 -36
  443. package/src/plugins/analysis/FetchAnalyzer.ts +232 -21
  444. package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +84 -101
  445. package/src/plugins/analysis/JSASTAnalyzer.ts +4265 -587
  446. package/src/plugins/analysis/ReactAnalyzer.ts +57 -57
  447. package/src/plugins/analysis/RustAnalyzer.ts +16 -11
  448. package/src/plugins/analysis/SQLiteAnalyzer.ts +13 -7
  449. package/src/plugins/analysis/ServiceLayerAnalyzer.ts +22 -16
  450. package/src/plugins/analysis/SocketIOAnalyzer.ts +151 -28
  451. package/src/plugins/analysis/SystemDbAnalyzer.ts +16 -11
  452. package/src/plugins/analysis/ast/GraphBuilder.ts +1947 -327
  453. package/src/plugins/analysis/ast/IdGenerator.ts +177 -0
  454. package/src/plugins/analysis/ast/types.ts +596 -6
  455. package/src/plugins/analysis/ast/utils/createParameterNodes.ts +104 -0
  456. package/src/plugins/analysis/ast/utils/index.ts +12 -0
  457. package/src/plugins/analysis/ast/utils/location.ts +103 -0
  458. package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +19 -8
  459. package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +924 -83
  460. package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +97 -44
  461. package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +234 -93
  462. package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +124 -9
  463. package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +41 -14
  464. package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +294 -49
  465. package/src/plugins/discovery/MonorepoServiceDiscovery.ts +3 -2
  466. package/src/plugins/discovery/SimpleProjectDiscovery.ts +6 -1
  467. package/src/plugins/discovery/WorkspaceDiscovery.ts +184 -0
  468. package/src/plugins/discovery/resolveSourceEntrypoint.ts +103 -0
  469. package/src/plugins/discovery/workspaces/detector.ts +63 -0
  470. package/src/plugins/discovery/workspaces/globResolver.ts +229 -0
  471. package/src/plugins/discovery/workspaces/index.ts +23 -0
  472. package/src/plugins/discovery/workspaces/parsers.ts +99 -0
  473. package/src/plugins/enrichment/AliasTracker.ts +35 -8
  474. package/src/plugins/enrichment/ArgumentParameterLinker.ts +240 -0
  475. package/src/plugins/enrichment/ClosureCaptureEnricher.ts +267 -0
  476. package/src/plugins/enrichment/ExternalCallResolver.ts +262 -0
  477. package/src/plugins/enrichment/FunctionCallResolver.ts +456 -0
  478. package/src/plugins/enrichment/HTTPConnectionEnricher.ts +84 -27
  479. package/src/plugins/enrichment/ImportExportLinker.ts +24 -6
  480. package/src/plugins/enrichment/MethodCallResolver.ts +39 -13
  481. package/src/plugins/enrichment/MountPointResolver.ts +208 -195
  482. package/src/plugins/enrichment/NodejsBuiltinsResolver.ts +365 -0
  483. package/src/plugins/enrichment/PrefixEvaluator.ts +16 -7
  484. package/src/plugins/enrichment/RustFFIEnricher.ts +6 -5
  485. package/src/plugins/enrichment/ValueDomainAnalyzer.ts +209 -189
  486. package/src/plugins/indexing/IncrementalModuleIndexer.ts +23 -14
  487. package/src/plugins/indexing/JSModuleIndexer.ts +140 -34
  488. package/src/plugins/indexing/RustModuleIndexer.ts +8 -7
  489. package/src/plugins/validation/BrokenImportValidator.ts +325 -0
  490. package/src/plugins/validation/CallResolverValidator.ts +131 -110
  491. package/src/plugins/validation/DataFlowValidator.ts +88 -67
  492. package/src/plugins/validation/EvalBanValidator.ts +17 -16
  493. package/src/plugins/validation/GraphConnectivityValidator.ts +58 -24
  494. package/src/plugins/validation/NodeCreationValidator.ts +554 -0
  495. package/src/plugins/validation/SQLInjectionValidator.ts +63 -20
  496. package/src/plugins/validation/ShadowingDetector.ts +6 -5
  497. package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +12 -11
  498. package/src/plugins/vcs/GitPlugin.ts +40 -12
  499. package/src/plugins/vcs/VCSPlugin.ts +7 -5
  500. package/src/queries/README.md +46 -0
  501. package/src/queries/findCallsInFunction.ts +206 -0
  502. package/src/queries/findContainingFunction.ts +83 -0
  503. package/src/queries/index.ts +23 -0
  504. package/src/queries/traceValues.ts +398 -0
  505. package/src/queries/types.ts +187 -0
  506. package/src/schema/GraphSchemaExtractor.ts +177 -0
  507. package/src/schema/InterfaceSchemaExtractor.ts +173 -0
  508. package/src/schema/index.ts +5 -0
  509. package/src/storage/backends/RFDBServerBackend.ts +100 -98
  510. package/src/storage/backends/typeValidation.ts +1 -0
  511. package/src/validation/PathValidator.ts +1 -1
  512. package/dist/core/AnalysisWorker.d.ts +0 -14
  513. package/dist/core/AnalysisWorker.d.ts.map +0 -1
  514. package/dist/core/AnalysisWorker.js +0 -307
  515. package/dist/core/ParallelAnalyzer.d.ts +0 -120
  516. package/dist/core/ParallelAnalyzer.d.ts.map +0 -1
  517. package/dist/core/ParallelAnalyzer.js +0 -331
  518. package/dist/core/QueueWorker.d.ts +0 -12
  519. package/dist/core/QueueWorker.d.ts.map +0 -1
  520. package/dist/core/QueueWorker.js +0 -567
  521. package/dist/core/RFDBClient.d.ts +0 -179
  522. package/dist/core/RFDBClient.d.ts.map +0 -1
  523. package/dist/core/RFDBClient.js +0 -429
  524. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +0 -19
  525. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +0 -1
  526. package/dist/plugins/discovery/ZonServiceDiscovery.js +0 -204
  527. package/src/core/AnalysisWorker.ts +0 -410
  528. package/src/core/ParallelAnalyzer.ts +0 -476
  529. package/src/core/QueueWorker.ts +0 -780
  530. package/src/plugins/indexing/ServiceDetector.ts +0 -230
@@ -1,9 +1,20 @@
1
1
  /**
2
2
  * FunctionNode - contract for FUNCTION node
3
+ *
4
+ * Supports two creation modes:
5
+ * 1. createWithContext() - NEW: Uses ScopeContext + Location for semantic IDs
6
+ * 2. create() - LEGACY: Uses line-based IDs for backward compatibility
7
+ *
8
+ * Semantic ID format: {file}->{scope_path}->FUNCTION->{name}
9
+ * Example: src/app.js->global->FUNCTION->processData
3
10
  */
4
11
 
5
12
  import type { FunctionNodeRecord } from '@grafema/types';
13
+ import { computeSemanticId, type ScopeContext, type Location } from '../SemanticId.js';
6
14
 
15
+ /**
16
+ * Options for function node creation
17
+ */
7
18
  interface FunctionNodeOptions {
8
19
  async?: boolean;
9
20
  generator?: boolean;
@@ -16,6 +27,19 @@ interface FunctionNodeOptions {
16
27
  counter?: number;
17
28
  }
18
29
 
30
+ /**
31
+ * Options specific to createWithContext
32
+ */
33
+ interface FunctionNodeContextOptions {
34
+ async?: boolean;
35
+ generator?: boolean;
36
+ exported?: boolean;
37
+ arrowFunction?: boolean;
38
+ isClassMethod?: boolean;
39
+ className?: string;
40
+ params?: string[];
41
+ }
42
+
19
43
  export class FunctionNode {
20
44
  static readonly TYPE = 'FUNCTION' as const;
21
45
 
@@ -42,7 +66,6 @@ export class FunctionNode {
42
66
 
43
67
  return {
44
68
  id,
45
- stableId: id,
46
69
  type: this.TYPE,
47
70
  name,
48
71
  file,
@@ -59,6 +82,83 @@ export class FunctionNode {
59
82
  };
60
83
  }
61
84
 
85
+ /**
86
+ * Create FUNCTION node with semantic ID (NEW API)
87
+ *
88
+ * Uses ScopeContext from ScopeTracker for stable identifiers that
89
+ * don't change when unrelated code is added/removed.
90
+ *
91
+ * @param name - Function name (or 'anonymous[N]' for anonymous functions)
92
+ * @param context - Scope context from ScopeTracker.getContext()
93
+ * @param location - Source location { line, column }
94
+ * @param options - Optional function properties
95
+ * @returns FunctionNodeRecord with semantic ID
96
+ */
97
+ static createWithContext(
98
+ name: string,
99
+ context: ScopeContext,
100
+ location: Partial<Location>,
101
+ options: FunctionNodeContextOptions = {}
102
+ ): FunctionNodeRecord {
103
+ // Validate required fields
104
+ if (!name) throw new Error('FunctionNode.createWithContext: name is required');
105
+ if (!context.file) throw new Error('FunctionNode.createWithContext: file is required');
106
+ if (location.line === undefined) throw new Error('FunctionNode.createWithContext: line is required');
107
+ if (location.column === undefined) throw new Error('FunctionNode.createWithContext: column is required');
108
+
109
+ // Compute semantic ID
110
+ const id = computeSemanticId(this.TYPE, name, context);
111
+
112
+ // Compute parentScopeId from context
113
+ // If we have a scope path, the parent is the last scope in the path
114
+ let parentScopeId: string | undefined;
115
+ if (context.scopePath.length > 0) {
116
+ // Find the most recent function/method scope to use as parent
117
+ // For now, we construct the parent's semantic ID from the scope path
118
+ const parentContext = {
119
+ file: context.file,
120
+ scopePath: context.scopePath.slice(0, -1) // Remove last scope
121
+ };
122
+ const parentScopeName = context.scopePath[context.scopePath.length - 1];
123
+
124
+ // Check if parent is a function/method scope (not a control flow scope)
125
+ if (!parentScopeName.includes('#')) {
126
+ // Named scope - likely a function or class
127
+ parentScopeId = computeSemanticId('FUNCTION', parentScopeName, parentContext);
128
+ } else {
129
+ // Control flow scope - find the nearest function ancestor
130
+ // For simplicity, take the first non-control-flow scope from the path
131
+ const nonControlFlowScopes = context.scopePath.filter(s => !s.includes('#'));
132
+ if (nonControlFlowScopes.length > 0) {
133
+ const parentName = nonControlFlowScopes[nonControlFlowScopes.length - 1];
134
+ const idx = context.scopePath.indexOf(parentName);
135
+ const ancestorContext = {
136
+ file: context.file,
137
+ scopePath: context.scopePath.slice(0, idx)
138
+ };
139
+ parentScopeId = computeSemanticId('FUNCTION', parentName, ancestorContext);
140
+ }
141
+ }
142
+ }
143
+
144
+ return {
145
+ id,
146
+ type: this.TYPE,
147
+ name,
148
+ file: context.file,
149
+ line: location.line,
150
+ column: location.column,
151
+ async: options.async || false,
152
+ generator: options.generator || false,
153
+ exported: options.exported || false,
154
+ arrowFunction: options.arrowFunction || false,
155
+ parentScopeId,
156
+ isClassMethod: options.isClassMethod || false,
157
+ className: options.className,
158
+ params: options.params || []
159
+ };
160
+ }
161
+
62
162
  static validate(node: FunctionNodeRecord): string[] {
63
163
  const errors: string[] = [];
64
164
 
@@ -6,13 +6,13 @@ import type { BaseNodeRecord } from '@grafema/types';
6
6
 
7
7
  interface HttpRequestNodeRecord extends BaseNodeRecord {
8
8
  type: 'HTTP_REQUEST';
9
+ column: number;
9
10
  url?: string;
10
11
  method: string;
11
12
  parentScopeId?: string;
12
13
  }
13
14
 
14
15
  interface HttpRequestNodeOptions {
15
- column?: number;
16
16
  parentScopeId?: string;
17
17
  counter?: number;
18
18
  }
@@ -20,22 +20,24 @@ interface HttpRequestNodeOptions {
20
20
  export class HttpRequestNode {
21
21
  static readonly TYPE = 'HTTP_REQUEST' as const;
22
22
 
23
- static readonly REQUIRED = ['name', 'file', 'line'] as const;
24
- static readonly OPTIONAL = ['url', 'method', 'column', 'parentScopeId'] as const;
23
+ static readonly REQUIRED = ['name', 'file', 'line', 'column'] as const;
24
+ static readonly OPTIONAL = ['url', 'method', 'parentScopeId'] as const;
25
25
 
26
26
  static create(
27
27
  url: string | undefined,
28
28
  method: string | undefined,
29
29
  file: string,
30
30
  line: number,
31
+ column: number,
31
32
  options: HttpRequestNodeOptions = {}
32
33
  ): HttpRequestNodeRecord {
33
34
  if (!file) throw new Error('HttpRequestNode.create: file is required');
34
35
  if (line === undefined) throw new Error('HttpRequestNode.create: line is required');
36
+ if (column === undefined) throw new Error('HttpRequestNode.create: column is required');
35
37
 
36
38
  const httpMethod = method || 'GET';
37
39
  const counter = options.counter !== undefined ? `:${options.counter}` : '';
38
- const id = `${file}:HTTP_REQUEST:${httpMethod}:${line}:${options.column || 0}${counter}`;
40
+ const id = `${file}:HTTP_REQUEST:${httpMethod}:${line}:${column}${counter}`;
39
41
 
40
42
  return {
41
43
  id,
@@ -45,6 +47,7 @@ export class HttpRequestNode {
45
47
  method: httpMethod,
46
48
  file,
47
49
  line,
50
+ column,
48
51
  parentScopeId: options.parentScopeId
49
52
  };
50
53
  }
@@ -4,29 +4,51 @@
4
4
 
5
5
  import type { BaseNodeRecord } from '@grafema/types';
6
6
 
7
- type ImportKind = 'value' | 'type' | 'typeof';
7
+ type ImportBinding = 'value' | 'type' | 'typeof';
8
+ type ImportType = 'default' | 'named' | 'namespace';
8
9
 
9
10
  interface ImportNodeRecord extends BaseNodeRecord {
10
11
  type: 'IMPORT';
11
12
  column: number;
12
13
  source: string;
13
- importKind: ImportKind;
14
+ importType: ImportType; // NEW: HOW it's imported (syntax)
15
+ importBinding: ImportBinding; // RENAMED: WHAT is imported (semantics)
14
16
  imported: string;
15
17
  local: string;
18
+ isDynamic?: boolean; // true for dynamic import() expressions
19
+ isResolvable?: boolean; // true if path is a string literal (statically analyzable)
20
+ dynamicPath?: string; // original expression for template/variable paths
21
+ sideEffect?: boolean; // REG-273: true for side-effect-only imports
16
22
  }
17
23
 
18
24
  interface ImportNodeOptions {
19
- importKind?: ImportKind;
20
- imported?: string;
25
+ importType?: ImportType; // Optional - will be auto-detected if not provided
26
+ importBinding?: ImportBinding;
27
+ imported?: string; // Used for auto-detection if importType not provided
21
28
  local?: string;
29
+ isDynamic?: boolean; // true for dynamic import() expressions
30
+ isResolvable?: boolean; // true if path is a string literal (statically analyzable)
31
+ dynamicPath?: string; // original expression for template/variable paths
32
+ sideEffect?: boolean; // REG-273: true for side-effect-only imports
22
33
  }
23
34
 
24
35
  export class ImportNode {
25
36
  static readonly TYPE = 'IMPORT' as const;
26
37
 
27
- static readonly REQUIRED = ['name', 'file', 'line', 'source'] as const;
28
- static readonly OPTIONAL = ['column', 'importKind', 'imported', 'local'] as const;
38
+ static readonly REQUIRED = ['name', 'file', 'line', 'column', 'source'] as const;
39
+ static readonly OPTIONAL = ['importType', 'importBinding', 'imported', 'local', 'isDynamic', 'isResolvable', 'dynamicPath', 'sideEffect'] as const;
29
40
 
41
+ /**
42
+ * Create IMPORT node
43
+ *
44
+ * @param name - The local binding name (what the import is called in this module)
45
+ * @param file - Absolute file path
46
+ * @param line - Line number (for debugging only, not part of ID)
47
+ * @param column - Column position (pass 0 if unavailable - JSASTAnalyzer limitation)
48
+ * @param source - Module source (e.g., 'react', './utils')
49
+ * @param options - Optional fields
50
+ * @returns ImportNodeRecord
51
+ */
30
52
  static create(
31
53
  name: string,
32
54
  file: string,
@@ -37,21 +59,48 @@ export class ImportNode {
37
59
  ): ImportNodeRecord {
38
60
  if (!name) throw new Error('ImportNode.create: name is required');
39
61
  if (!file) throw new Error('ImportNode.create: file is required');
40
- if (!line) throw new Error('ImportNode.create: line is required');
62
+ if (line === undefined) throw new Error('ImportNode.create: line is required');
63
+ if (column === undefined) throw new Error('ImportNode.create: column is required');
41
64
  if (!source) throw new Error('ImportNode.create: source is required');
42
65
 
43
- return {
44
- id: `${file}:IMPORT:${name}:${line}`,
66
+ // Auto-detect importType from imported field if not explicitly provided
67
+ let importType = options.importType;
68
+ if (!importType && options.imported) {
69
+ importType = options.imported === 'default' ? 'default' :
70
+ options.imported === '*' ? 'namespace' : 'named';
71
+ }
72
+
73
+ const record: ImportNodeRecord = {
74
+ id: `${file}:IMPORT:${source}:${name}`, // SEMANTIC ID: no line number
45
75
  type: this.TYPE,
46
76
  name,
47
77
  file,
48
- line,
49
- column: column || 0,
78
+ line, // Stored as field, not in ID
79
+ column,
50
80
  source,
51
- importKind: options.importKind || 'value',
81
+ importType: importType || 'named', // NEW field with auto-detection
82
+ importBinding: options.importBinding || 'value', // RENAMED field
52
83
  imported: options.imported || name,
53
84
  local: options.local || name
54
85
  };
86
+
87
+ // Add dynamic import fields if provided
88
+ if (options.isDynamic !== undefined) {
89
+ record.isDynamic = options.isDynamic;
90
+ }
91
+ if (options.isResolvable !== undefined) {
92
+ record.isResolvable = options.isResolvable;
93
+ }
94
+ if (options.dynamicPath !== undefined) {
95
+ record.dynamicPath = options.dynamicPath;
96
+ }
97
+
98
+ // REG-273: Add sideEffect field if provided
99
+ if (options.sideEffect !== undefined) {
100
+ record.sideEffect = options.sideEffect;
101
+ }
102
+
103
+ return record;
55
104
  }
56
105
 
57
106
  static validate(node: ImportNodeRecord): string[] {
@@ -72,4 +121,4 @@ export class ImportNode {
72
121
  }
73
122
  }
74
123
 
75
- export type { ImportNodeRecord, ImportKind };
124
+ export type { ImportNodeRecord, ImportBinding, ImportType };
@@ -0,0 +1,92 @@
1
+ /**
2
+ * InterfaceNode - contract for INTERFACE node
3
+ *
4
+ * Represents TypeScript interface declarations.
5
+ *
6
+ * ID format: {file}:INTERFACE:{name}:{line}
7
+ * Example: /src/types.ts:INTERFACE:IUser:5
8
+ */
9
+
10
+ import type { BaseNodeRecord } from '@grafema/types';
11
+
12
+ interface InterfacePropertyRecord {
13
+ name: string;
14
+ type?: string;
15
+ optional?: boolean;
16
+ readonly?: boolean;
17
+ }
18
+
19
+ interface InterfaceNodeRecord extends BaseNodeRecord {
20
+ type: 'INTERFACE';
21
+ column: number;
22
+ extends: string[];
23
+ properties: InterfacePropertyRecord[];
24
+ isExternal?: boolean;
25
+ }
26
+
27
+ interface InterfaceNodeOptions {
28
+ extends?: string[];
29
+ properties?: InterfacePropertyRecord[];
30
+ isExternal?: boolean;
31
+ }
32
+
33
+ export class InterfaceNode {
34
+ static readonly TYPE = 'INTERFACE' as const;
35
+
36
+ static readonly REQUIRED = ['name', 'file', 'line', 'column'] as const;
37
+ static readonly OPTIONAL = ['extends', 'properties', 'isExternal'] as const;
38
+
39
+ /**
40
+ * Create INTERFACE node
41
+ *
42
+ * @param name - Interface name
43
+ * @param file - File path
44
+ * @param line - Line number
45
+ * @param column - Column position
46
+ * @param options - Optional interface properties
47
+ * @returns InterfaceNodeRecord
48
+ */
49
+ static create(
50
+ name: string,
51
+ file: string,
52
+ line: number,
53
+ column: number,
54
+ options: InterfaceNodeOptions = {}
55
+ ): InterfaceNodeRecord {
56
+ if (!name) throw new Error('InterfaceNode.create: name is required');
57
+ if (!file) throw new Error('InterfaceNode.create: file is required');
58
+ if (!line) throw new Error('InterfaceNode.create: line is required');
59
+ if (column === undefined) throw new Error('InterfaceNode.create: column is required');
60
+
61
+ return {
62
+ id: `${file}:INTERFACE:${name}:${line}`,
63
+ type: this.TYPE,
64
+ name,
65
+ file,
66
+ line,
67
+ column,
68
+ extends: options.extends || [],
69
+ properties: options.properties || [],
70
+ ...(options.isExternal !== undefined && { isExternal: options.isExternal })
71
+ };
72
+ }
73
+
74
+ static validate(node: InterfaceNodeRecord): string[] {
75
+ const errors: string[] = [];
76
+
77
+ if (node.type !== this.TYPE) {
78
+ errors.push(`Expected type ${this.TYPE}, got ${node.type}`);
79
+ }
80
+
81
+ const nodeRecord = node as unknown as Record<string, unknown>;
82
+ for (const field of this.REQUIRED) {
83
+ if (!nodeRecord[field]) {
84
+ errors.push(`Missing required field: ${field}`);
85
+ }
86
+ }
87
+
88
+ return errors;
89
+ }
90
+ }
91
+
92
+ export type { InterfaceNodeRecord, InterfacePropertyRecord };
@@ -0,0 +1,177 @@
1
+ /**
2
+ * IssueNode - contract for issue:* nodes
3
+ *
4
+ * Types: issue:security, issue:performance, issue:style, issue:smell
5
+ * ID format: issue:<category>#<hash>
6
+ *
7
+ * Issues represent detected problems in the codebase.
8
+ * They connect to affected code via AFFECTS edges.
9
+ */
10
+
11
+ import { createHash } from 'crypto';
12
+ import type { BaseNodeRecord } from '@grafema/types';
13
+ import { getNamespace } from './NodeKind.js';
14
+
15
+ // Severity type
16
+ export type IssueSeverity = 'error' | 'warning' | 'info';
17
+
18
+ // Issue types
19
+ export type IssueType = `issue:${string}`;
20
+
21
+ export interface IssueNodeRecord extends BaseNodeRecord {
22
+ type: IssueType;
23
+ severity: IssueSeverity;
24
+ category: string;
25
+ message: string;
26
+ plugin: string;
27
+ targetNodeId?: string;
28
+ createdAt: number;
29
+ context?: Record<string, unknown>;
30
+ }
31
+
32
+ export interface IssueNodeOptions {
33
+ context?: Record<string, unknown>;
34
+ }
35
+
36
+ // Valid severity levels
37
+ const VALID_SEVERITIES = ['error', 'warning', 'info'] as const;
38
+
39
+ export class IssueNode {
40
+ static readonly REQUIRED = ['category', 'severity', 'message', 'plugin', 'file'] as const;
41
+ static readonly OPTIONAL = ['targetNodeId', 'context'] as const;
42
+
43
+ /**
44
+ * Generate deterministic issue ID
45
+ * Format: issue:<category>#<hash12>
46
+ *
47
+ * Hash is based on plugin + file + line + column + message
48
+ * This ensures same issue = same ID across analysis runs
49
+ */
50
+ static generateId(
51
+ category: string,
52
+ plugin: string,
53
+ file: string,
54
+ line: number,
55
+ column: number,
56
+ message: string
57
+ ): string {
58
+ const hashInput = `${plugin}|${file}|${line}|${column}|${message}`;
59
+ const hash = createHash('sha256').update(hashInput).digest('hex').substring(0, 12);
60
+ return `issue:${category}#${hash}`;
61
+ }
62
+
63
+ /**
64
+ * Create issue node
65
+ *
66
+ * @param category - Issue category (security, performance, style, smell, or custom)
67
+ * @param severity - error | warning | info
68
+ * @param message - Human-readable description
69
+ * @param plugin - Plugin name that detected this issue
70
+ * @param file - File where issue was detected
71
+ * @param line - Line number
72
+ * @param column - Column number (optional, defaults to 0)
73
+ * @param options - Optional fields (context)
74
+ */
75
+ static create(
76
+ category: string,
77
+ severity: IssueSeverity,
78
+ message: string,
79
+ plugin: string,
80
+ file: string,
81
+ line: number,
82
+ column: number = 0,
83
+ options: IssueNodeOptions = {}
84
+ ): IssueNodeRecord {
85
+ if (!category) throw new Error('IssueNode.create: category is required');
86
+ if (!severity) throw new Error('IssueNode.create: severity is required');
87
+ if (!VALID_SEVERITIES.includes(severity)) {
88
+ throw new Error(`IssueNode.create: invalid severity "${severity}". Valid: ${VALID_SEVERITIES.join(', ')}`);
89
+ }
90
+ if (!message) throw new Error('IssueNode.create: message is required');
91
+ if (!plugin) throw new Error('IssueNode.create: plugin is required');
92
+ if (!file) throw new Error('IssueNode.create: file is required');
93
+
94
+ const type = `issue:${category}` as IssueType;
95
+ const id = this.generateId(category, plugin, file, line, column, message);
96
+ const now = Date.now();
97
+
98
+ return {
99
+ id,
100
+ type,
101
+ name: message.substring(0, 100), // Truncate for display
102
+ file,
103
+ line,
104
+ column,
105
+ severity,
106
+ category,
107
+ message,
108
+ plugin,
109
+ createdAt: now,
110
+ context: options.context,
111
+ };
112
+ }
113
+
114
+ /**
115
+ * Validate issue node
116
+ * @returns array of error messages, empty if valid
117
+ */
118
+ static validate(node: IssueNodeRecord): string[] {
119
+ const errors: string[] = [];
120
+
121
+ if (!IssueNode.isIssueType(node.type)) {
122
+ errors.push(`Expected issue:* type, got ${node.type}`);
123
+ }
124
+
125
+ if (!node.category) {
126
+ errors.push('Missing required field: category');
127
+ }
128
+
129
+ if (!node.severity) {
130
+ errors.push('Missing required field: severity');
131
+ } else if (!VALID_SEVERITIES.includes(node.severity as IssueSeverity)) {
132
+ errors.push(`Invalid severity: ${node.severity}. Valid: ${VALID_SEVERITIES.join(', ')}`);
133
+ }
134
+
135
+ if (!node.message) {
136
+ errors.push('Missing required field: message');
137
+ }
138
+
139
+ if (!node.plugin) {
140
+ errors.push('Missing required field: plugin');
141
+ }
142
+
143
+ return errors;
144
+ }
145
+
146
+ /**
147
+ * Parse issue ID into components
148
+ * @param id - full ID (e.g., 'issue:security#a3f2b1c4d5e6')
149
+ * @returns { category, hash } or null if invalid
150
+ */
151
+ static parseId(id: string): { category: string; hash: string } | null {
152
+ if (!id) return null;
153
+
154
+ const match = id.match(/^issue:([^#]+)#(.+)$/);
155
+ if (!match) return null;
156
+
157
+ return {
158
+ category: match[1],
159
+ hash: match[2],
160
+ };
161
+ }
162
+
163
+ /**
164
+ * Check if type is an issue type
165
+ */
166
+ static isIssueType(type: string): boolean {
167
+ if (!type) return false;
168
+ return getNamespace(type) === 'issue';
169
+ }
170
+
171
+ /**
172
+ * Get all known issue categories
173
+ */
174
+ static getCategories(): string[] {
175
+ return ['security', 'performance', 'style', 'smell'];
176
+ }
177
+ }
@@ -22,8 +22,8 @@ interface LiteralNodeOptions {
22
22
  export class LiteralNode {
23
23
  static readonly TYPE = 'LITERAL' as const;
24
24
 
25
- static readonly REQUIRED = ['file', 'line'] as const;
26
- static readonly OPTIONAL = ['value', 'valueType', 'column', 'parentCallId', 'argIndex'] as const;
25
+ static readonly REQUIRED = ['file', 'line', 'column'] as const;
26
+ static readonly OPTIONAL = ['value', 'valueType', 'parentCallId', 'argIndex'] as const;
27
27
 
28
28
  static create(
29
29
  value: unknown,
@@ -34,10 +34,11 @@ export class LiteralNode {
34
34
  ): LiteralNodeRecord {
35
35
  if (!file) throw new Error('LiteralNode.create: file is required');
36
36
  if (line === undefined) throw new Error('LiteralNode.create: line is required');
37
+ if (column === undefined) throw new Error('LiteralNode.create: column is required');
37
38
 
38
39
  const counter = options.counter !== undefined ? `:${options.counter}` : '';
39
40
  const argIndex = options.argIndex !== undefined ? `arg${options.argIndex}` : 'value';
40
- const id = `${file}:LITERAL:${argIndex}:${line}:${column || 0}${counter}`;
41
+ const id = `${file}:LITERAL:${argIndex}:${line}:${column}${counter}`;
41
42
 
42
43
  return {
43
44
  id,
@@ -47,7 +48,7 @@ export class LiteralNode {
47
48
  valueType: typeof value,
48
49
  file,
49
50
  line,
50
- column: column || 0,
51
+ column,
51
52
  parentCallId: options.parentCallId,
52
53
  argIndex: options.argIndex
53
54
  };