@grafema/core 0.1.0-alpha.4 → 0.1.1-alpha

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 (391) hide show
  1. package/README.md +0 -1
  2. package/dist/Orchestrator.d.ts +24 -2
  3. package/dist/Orchestrator.d.ts.map +1 -1
  4. package/dist/Orchestrator.js +197 -24
  5. package/dist/config/ConfigLoader.d.ts +72 -0
  6. package/dist/config/ConfigLoader.d.ts.map +1 -0
  7. package/dist/config/ConfigLoader.js +187 -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/FileNodeManager.d.ts +40 -0
  18. package/dist/core/FileNodeManager.d.ts.map +1 -0
  19. package/dist/core/FileNodeManager.js +84 -0
  20. package/dist/core/GraphFreshnessChecker.d.ts +33 -0
  21. package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
  22. package/dist/core/GraphFreshnessChecker.js +101 -0
  23. package/dist/core/HashUtils.d.ts +24 -0
  24. package/dist/core/HashUtils.d.ts.map +1 -0
  25. package/dist/core/HashUtils.js +45 -0
  26. package/dist/core/IncrementalReanalyzer.d.ts +36 -0
  27. package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
  28. package/dist/core/IncrementalReanalyzer.js +132 -0
  29. package/dist/core/NodeFactory.d.ts +225 -17
  30. package/dist/core/NodeFactory.d.ts.map +1 -1
  31. package/dist/core/NodeFactory.js +208 -18
  32. package/dist/core/ScopeTracker.d.ts +84 -0
  33. package/dist/core/ScopeTracker.d.ts.map +1 -0
  34. package/dist/core/ScopeTracker.js +116 -0
  35. package/dist/core/SemanticId.d.ts +90 -0
  36. package/dist/core/SemanticId.d.ts.map +1 -0
  37. package/dist/core/SemanticId.js +115 -0
  38. package/dist/core/VersionManager.d.ts.map +1 -1
  39. package/dist/core/VersionManager.js +3 -2
  40. package/dist/core/nodes/ArgumentExpressionNode.d.ts +43 -0
  41. package/dist/core/nodes/ArgumentExpressionNode.d.ts.map +1 -0
  42. package/dist/core/nodes/ArgumentExpressionNode.js +60 -0
  43. package/dist/core/nodes/ArrayLiteralNode.d.ts +27 -0
  44. package/dist/core/nodes/ArrayLiteralNode.d.ts.map +1 -0
  45. package/dist/core/nodes/ArrayLiteralNode.js +41 -0
  46. package/dist/core/nodes/CallSiteNode.d.ts +28 -0
  47. package/dist/core/nodes/CallSiteNode.d.ts.map +1 -1
  48. package/dist/core/nodes/CallSiteNode.js +46 -0
  49. package/dist/core/nodes/ClassNode.d.ts +33 -1
  50. package/dist/core/nodes/ClassNode.d.ts.map +1 -1
  51. package/dist/core/nodes/ClassNode.js +46 -2
  52. package/dist/core/nodes/DecoratorNode.d.ts +42 -0
  53. package/dist/core/nodes/DecoratorNode.d.ts.map +1 -0
  54. package/dist/core/nodes/DecoratorNode.js +62 -0
  55. package/dist/core/nodes/EnumNode.d.ts +42 -0
  56. package/dist/core/nodes/EnumNode.d.ts.map +1 -0
  57. package/dist/core/nodes/EnumNode.js +54 -0
  58. package/dist/core/nodes/ExportNode.d.ts +37 -1
  59. package/dist/core/nodes/ExportNode.d.ts.map +1 -1
  60. package/dist/core/nodes/ExportNode.js +48 -2
  61. package/dist/core/nodes/ExpressionNode.d.ts +97 -0
  62. package/dist/core/nodes/ExpressionNode.d.ts.map +1 -0
  63. package/dist/core/nodes/ExpressionNode.js +178 -0
  64. package/dist/core/nodes/ExternalModuleNode.d.ts +28 -0
  65. package/dist/core/nodes/ExternalModuleNode.d.ts.map +1 -0
  66. package/dist/core/nodes/ExternalModuleNode.js +41 -0
  67. package/dist/core/nodes/ExternalStdioNode.d.ts +13 -6
  68. package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -1
  69. package/dist/core/nodes/ExternalStdioNode.js +15 -8
  70. package/dist/core/nodes/FunctionNode.d.ts +36 -0
  71. package/dist/core/nodes/FunctionNode.d.ts.map +1 -1
  72. package/dist/core/nodes/FunctionNode.js +80 -1
  73. package/dist/core/nodes/ImportNode.d.ts +19 -5
  74. package/dist/core/nodes/ImportNode.d.ts.map +1 -1
  75. package/dist/core/nodes/ImportNode.js +23 -5
  76. package/dist/core/nodes/InterfaceNode.d.ts +46 -0
  77. package/dist/core/nodes/InterfaceNode.d.ts.map +1 -0
  78. package/dist/core/nodes/InterfaceNode.js +55 -0
  79. package/dist/core/nodes/IssueNode.d.ts +73 -0
  80. package/dist/core/nodes/IssueNode.d.ts.map +1 -0
  81. package/dist/core/nodes/IssueNode.js +129 -0
  82. package/dist/core/nodes/MethodCallNode.d.ts +30 -0
  83. package/dist/core/nodes/MethodCallNode.d.ts.map +1 -1
  84. package/dist/core/nodes/MethodCallNode.js +49 -0
  85. package/dist/core/nodes/MethodNode.d.ts +32 -0
  86. package/dist/core/nodes/MethodNode.d.ts.map +1 -1
  87. package/dist/core/nodes/MethodNode.js +48 -0
  88. package/dist/core/nodes/ModuleNode.d.ts +31 -0
  89. package/dist/core/nodes/ModuleNode.d.ts.map +1 -1
  90. package/dist/core/nodes/ModuleNode.js +37 -0
  91. package/dist/core/nodes/NetworkRequestNode.d.ts +54 -0
  92. package/dist/core/nodes/NetworkRequestNode.d.ts.map +1 -0
  93. package/dist/core/nodes/NetworkRequestNode.js +65 -0
  94. package/dist/core/nodes/ObjectLiteralNode.d.ts +27 -0
  95. package/dist/core/nodes/ObjectLiteralNode.d.ts.map +1 -0
  96. package/dist/core/nodes/ObjectLiteralNode.js +41 -0
  97. package/dist/core/nodes/ScopeNode.d.ts +31 -0
  98. package/dist/core/nodes/ScopeNode.d.ts.map +1 -1
  99. package/dist/core/nodes/ScopeNode.js +49 -0
  100. package/dist/core/nodes/TypeNode.d.ts +36 -0
  101. package/dist/core/nodes/TypeNode.d.ts.map +1 -0
  102. package/dist/core/nodes/TypeNode.js +53 -0
  103. package/dist/core/nodes/VariableDeclarationNode.d.ts +27 -0
  104. package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -1
  105. package/dist/core/nodes/VariableDeclarationNode.js +40 -0
  106. package/dist/core/nodes/index.d.ts +12 -1
  107. package/dist/core/nodes/index.d.ts.map +1 -1
  108. package/dist/core/nodes/index.js +14 -0
  109. package/dist/diagnostics/DiagnosticCollector.d.ts +98 -0
  110. package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
  111. package/dist/diagnostics/DiagnosticCollector.js +129 -0
  112. package/dist/diagnostics/DiagnosticReporter.d.ts +77 -0
  113. package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
  114. package/dist/diagnostics/DiagnosticReporter.js +159 -0
  115. package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
  116. package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
  117. package/dist/diagnostics/DiagnosticWriter.js +43 -0
  118. package/dist/diagnostics/index.d.ts +14 -0
  119. package/dist/diagnostics/index.d.ts.map +1 -0
  120. package/dist/diagnostics/index.js +11 -0
  121. package/dist/errors/GrafemaError.d.ts +118 -0
  122. package/dist/errors/GrafemaError.d.ts.map +1 -0
  123. package/dist/errors/GrafemaError.js +131 -0
  124. package/dist/index.d.ts +57 -1
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +54 -1
  127. package/dist/logging/Logger.d.ts +48 -0
  128. package/dist/logging/Logger.d.ts.map +1 -0
  129. package/dist/logging/Logger.js +134 -0
  130. package/dist/plugins/Plugin.d.ts +5 -1
  131. package/dist/plugins/Plugin.d.ts.map +1 -1
  132. package/dist/plugins/Plugin.js +33 -0
  133. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -1
  134. package/dist/plugins/analysis/DatabaseAnalyzer.js +13 -6
  135. package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -1
  136. package/dist/plugins/analysis/ExpressAnalyzer.js +27 -19
  137. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -1
  138. package/dist/plugins/analysis/ExpressRouteAnalyzer.js +21 -14
  139. package/dist/plugins/analysis/FetchAnalyzer.d.ts +1 -0
  140. package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -1
  141. package/dist/plugins/analysis/FetchAnalyzer.js +34 -14
  142. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +6 -3
  143. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -1
  144. package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +76 -80
  145. package/dist/plugins/analysis/JSASTAnalyzer.d.ts +180 -17
  146. package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -1
  147. package/dist/plugins/analysis/JSASTAnalyzer.js +1171 -471
  148. package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -1
  149. package/dist/plugins/analysis/ReactAnalyzer.js +56 -57
  150. package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -1
  151. package/dist/plugins/analysis/RustAnalyzer.js +15 -10
  152. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -1
  153. package/dist/plugins/analysis/SQLiteAnalyzer.js +9 -7
  154. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -1
  155. package/dist/plugins/analysis/ServiceLayerAnalyzer.js +21 -9
  156. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -1
  157. package/dist/plugins/analysis/SocketIOAnalyzer.js +27 -15
  158. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -1
  159. package/dist/plugins/analysis/SystemDbAnalyzer.js +15 -5
  160. package/dist/plugins/analysis/ast/GraphBuilder.d.ts +34 -4
  161. package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -1
  162. package/dist/plugins/analysis/ast/GraphBuilder.js +318 -298
  163. package/dist/plugins/analysis/ast/IdGenerator.d.ts +105 -0
  164. package/dist/plugins/analysis/ast/IdGenerator.d.ts.map +1 -0
  165. package/dist/plugins/analysis/ast/IdGenerator.js +116 -0
  166. package/dist/plugins/analysis/ast/types.d.ts +176 -5
  167. package/dist/plugins/analysis/ast/types.d.ts.map +1 -1
  168. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts +33 -0
  169. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts.map +1 -0
  170. package/dist/plugins/analysis/ast/utils/createParameterNodes.js +89 -0
  171. package/dist/plugins/analysis/ast/utils/index.d.ts +6 -0
  172. package/dist/plugins/analysis/ast/utils/index.d.ts.map +1 -0
  173. package/dist/plugins/analysis/ast/utils/index.js +5 -0
  174. package/dist/plugins/analysis/ast/utils/location.d.ts +87 -0
  175. package/dist/plugins/analysis/ast/utils/location.d.ts.map +1 -0
  176. package/dist/plugins/analysis/ast/utils/location.js +78 -0
  177. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +9 -4
  178. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -1
  179. package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +6 -5
  180. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +99 -9
  181. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -1
  182. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +663 -125
  183. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +4 -1
  184. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -1
  185. package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +72 -32
  186. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +4 -1
  187. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -1
  188. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +128 -63
  189. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -1
  190. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +11 -8
  191. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +12 -1
  192. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -1
  193. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +36 -14
  194. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +4 -1
  195. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -1
  196. package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +17 -13
  197. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -1
  198. package/dist/plugins/discovery/MonorepoServiceDiscovery.js +3 -2
  199. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -1
  200. package/dist/plugins/discovery/SimpleProjectDiscovery.js +5 -1
  201. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts +22 -0
  202. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts.map +1 -0
  203. package/dist/plugins/discovery/WorkspaceDiscovery.js +136 -0
  204. package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts +46 -0
  205. package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts.map +1 -0
  206. package/dist/plugins/discovery/resolveSourceEntrypoint.js +86 -0
  207. package/dist/plugins/discovery/workspaces/detector.d.ts +21 -0
  208. package/dist/plugins/discovery/workspaces/detector.d.ts.map +1 -0
  209. package/dist/plugins/discovery/workspaces/detector.js +49 -0
  210. package/dist/plugins/discovery/workspaces/globResolver.d.ts +35 -0
  211. package/dist/plugins/discovery/workspaces/globResolver.d.ts.map +1 -0
  212. package/dist/plugins/discovery/workspaces/globResolver.js +184 -0
  213. package/dist/plugins/discovery/workspaces/index.d.ts +9 -0
  214. package/dist/plugins/discovery/workspaces/index.d.ts.map +1 -0
  215. package/dist/plugins/discovery/workspaces/index.js +8 -0
  216. package/dist/plugins/discovery/workspaces/parsers.d.ts +38 -0
  217. package/dist/plugins/discovery/workspaces/parsers.d.ts.map +1 -0
  218. package/dist/plugins/discovery/workspaces/parsers.js +80 -0
  219. package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -1
  220. package/dist/plugins/enrichment/AliasTracker.js +14 -8
  221. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -1
  222. package/dist/plugins/enrichment/HTTPConnectionEnricher.js +14 -7
  223. package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -1
  224. package/dist/plugins/enrichment/ImportExportLinker.js +23 -6
  225. package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -1
  226. package/dist/plugins/enrichment/MethodCallResolver.js +18 -12
  227. package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -1
  228. package/dist/plugins/enrichment/MountPointResolver.js +8 -3
  229. package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -1
  230. package/dist/plugins/enrichment/PrefixEvaluator.js +16 -7
  231. package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -1
  232. package/dist/plugins/enrichment/RustFFIEnricher.js +6 -5
  233. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +17 -0
  234. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -1
  235. package/dist/plugins/enrichment/ValueDomainAnalyzer.js +129 -10
  236. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -1
  237. package/dist/plugins/indexing/IncrementalModuleIndexer.js +23 -14
  238. package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -1
  239. package/dist/plugins/indexing/JSModuleIndexer.js +63 -31
  240. package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -1
  241. package/dist/plugins/indexing/RustModuleIndexer.js +5 -4
  242. package/dist/plugins/indexing/ServiceDetector.d.ts +10 -0
  243. package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -1
  244. package/dist/plugins/indexing/ServiceDetector.js +28 -15
  245. package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -1
  246. package/dist/plugins/validation/CallResolverValidator.js +8 -7
  247. package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -1
  248. package/dist/plugins/validation/DataFlowValidator.js +17 -12
  249. package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -1
  250. package/dist/plugins/validation/EvalBanValidator.js +17 -16
  251. package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -1
  252. package/dist/plugins/validation/GraphConnectivityValidator.js +19 -23
  253. package/dist/plugins/validation/NodeCreationValidator.d.ts +85 -0
  254. package/dist/plugins/validation/NodeCreationValidator.d.ts.map +1 -0
  255. package/dist/plugins/validation/NodeCreationValidator.js +415 -0
  256. package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -1
  257. package/dist/plugins/validation/SQLInjectionValidator.js +59 -16
  258. package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -1
  259. package/dist/plugins/validation/ShadowingDetector.js +6 -5
  260. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -1
  261. package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +12 -11
  262. package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -1
  263. package/dist/plugins/vcs/GitPlugin.js +10 -12
  264. package/dist/plugins/vcs/VCSPlugin.d.ts +3 -2
  265. package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -1
  266. package/dist/plugins/vcs/VCSPlugin.js +5 -5
  267. package/dist/storage/backends/RFDBServerBackend.d.ts +10 -17
  268. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -1
  269. package/dist/storage/backends/RFDBServerBackend.js +31 -10
  270. package/dist/validation/PathValidator.d.ts +1 -2
  271. package/dist/validation/PathValidator.d.ts.map +1 -1
  272. package/package.json +6 -3
  273. package/src/Orchestrator.ts +237 -24
  274. package/src/config/ConfigLoader.ts +263 -0
  275. package/src/config/index.ts +5 -0
  276. package/src/core/ASTWorker.ts +143 -139
  277. package/src/core/CoverageAnalyzer.ts +243 -0
  278. package/src/core/FileNodeManager.ts +100 -0
  279. package/src/core/GraphFreshnessChecker.ts +143 -0
  280. package/src/core/HashUtils.ts +48 -0
  281. package/src/core/IncrementalReanalyzer.ts +192 -0
  282. package/src/core/NodeFactory.ts +401 -18
  283. package/src/core/ScopeTracker.ts +154 -0
  284. package/src/core/SemanticId.ts +192 -0
  285. package/src/core/VersionManager.ts +3 -2
  286. package/src/core/nodes/ArgumentExpressionNode.ts +89 -0
  287. package/src/core/nodes/ArrayLiteralNode.ts +65 -0
  288. package/src/core/nodes/CallSiteNode.ts +58 -0
  289. package/src/core/nodes/ClassNode.ts +63 -2
  290. package/src/core/nodes/DecoratorNode.ts +91 -0
  291. package/src/core/nodes/EnumNode.ts +86 -0
  292. package/src/core/nodes/ExportNode.ts +70 -2
  293. package/src/core/nodes/ExpressionNode.ts +231 -0
  294. package/src/core/nodes/ExternalModuleNode.ts +56 -0
  295. package/src/core/nodes/ExternalStdioNode.ts +17 -9
  296. package/src/core/nodes/FunctionNode.ts +101 -1
  297. package/src/core/nodes/ImportNode.ts +32 -10
  298. package/src/core/nodes/InterfaceNode.ts +91 -0
  299. package/src/core/nodes/IssueNode.ts +177 -0
  300. package/src/core/nodes/MethodCallNode.ts +64 -0
  301. package/src/core/nodes/MethodNode.ts +63 -0
  302. package/src/core/nodes/ModuleNode.ts +50 -0
  303. package/src/core/nodes/NetworkRequestNode.ts +77 -0
  304. package/src/core/nodes/ObjectLiteralNode.ts +65 -0
  305. package/src/core/nodes/ScopeNode.ts +65 -0
  306. package/src/core/nodes/TypeNode.ts +78 -0
  307. package/src/core/nodes/VariableDeclarationNode.ts +52 -0
  308. package/src/core/nodes/index.ts +18 -1
  309. package/src/diagnostics/DiagnosticCollector.ts +163 -0
  310. package/src/diagnostics/DiagnosticReporter.ts +204 -0
  311. package/src/diagnostics/DiagnosticWriter.ts +50 -0
  312. package/src/diagnostics/index.ts +16 -0
  313. package/src/errors/GrafemaError.ts +174 -0
  314. package/src/index.ts +148 -1
  315. package/src/logging/Logger.ts +152 -0
  316. package/src/plugins/Plugin.ts +42 -0
  317. package/src/plugins/analysis/DatabaseAnalyzer.ts +14 -8
  318. package/src/plugins/analysis/ExpressAnalyzer.ts +29 -19
  319. package/src/plugins/analysis/ExpressRouteAnalyzer.ts +22 -21
  320. package/src/plugins/analysis/FetchAnalyzer.ts +39 -16
  321. package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +84 -101
  322. package/src/plugins/analysis/JSASTAnalyzer.ts +1483 -503
  323. package/src/plugins/analysis/ReactAnalyzer.ts +57 -57
  324. package/src/plugins/analysis/RustAnalyzer.ts +15 -10
  325. package/src/plugins/analysis/SQLiteAnalyzer.ts +10 -7
  326. package/src/plugins/analysis/ServiceLayerAnalyzer.ts +22 -16
  327. package/src/plugins/analysis/SocketIOAnalyzer.ts +31 -22
  328. package/src/plugins/analysis/SystemDbAnalyzer.ts +16 -11
  329. package/src/plugins/analysis/ast/GraphBuilder.ts +439 -327
  330. package/src/plugins/analysis/ast/IdGenerator.ts +177 -0
  331. package/src/plugins/analysis/ast/types.ts +209 -6
  332. package/src/plugins/analysis/ast/utils/createParameterNodes.ts +104 -0
  333. package/src/plugins/analysis/ast/utils/index.ts +12 -0
  334. package/src/plugins/analysis/ast/utils/location.ts +103 -0
  335. package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +11 -8
  336. package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +909 -83
  337. package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +97 -44
  338. package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +159 -93
  339. package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +12 -8
  340. package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +41 -14
  341. package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +37 -17
  342. package/src/plugins/discovery/MonorepoServiceDiscovery.ts +3 -2
  343. package/src/plugins/discovery/SimpleProjectDiscovery.ts +6 -1
  344. package/src/plugins/discovery/WorkspaceDiscovery.ts +177 -0
  345. package/src/plugins/discovery/resolveSourceEntrypoint.ts +103 -0
  346. package/src/plugins/discovery/workspaces/detector.ts +63 -0
  347. package/src/plugins/discovery/workspaces/globResolver.ts +229 -0
  348. package/src/plugins/discovery/workspaces/index.ts +23 -0
  349. package/src/plugins/discovery/workspaces/parsers.ts +99 -0
  350. package/src/plugins/enrichment/AliasTracker.ts +14 -8
  351. package/src/plugins/enrichment/HTTPConnectionEnricher.ts +14 -7
  352. package/src/plugins/enrichment/ImportExportLinker.ts +24 -6
  353. package/src/plugins/enrichment/MethodCallResolver.ts +18 -12
  354. package/src/plugins/enrichment/MountPointResolver.ts +8 -3
  355. package/src/plugins/enrichment/PrefixEvaluator.ts +16 -7
  356. package/src/plugins/enrichment/RustFFIEnricher.ts +6 -5
  357. package/src/plugins/enrichment/ValueDomainAnalyzer.ts +149 -12
  358. package/src/plugins/indexing/IncrementalModuleIndexer.ts +23 -14
  359. package/src/plugins/indexing/JSModuleIndexer.ts +74 -34
  360. package/src/plugins/indexing/RustModuleIndexer.ts +5 -4
  361. package/src/plugins/validation/CallResolverValidator.ts +8 -7
  362. package/src/plugins/validation/DataFlowValidator.ts +16 -12
  363. package/src/plugins/validation/EvalBanValidator.ts +17 -16
  364. package/src/plugins/validation/GraphConnectivityValidator.ts +19 -23
  365. package/src/plugins/validation/NodeCreationValidator.ts +554 -0
  366. package/src/plugins/validation/SQLInjectionValidator.ts +61 -15
  367. package/src/plugins/validation/ShadowingDetector.ts +6 -5
  368. package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +12 -11
  369. package/src/plugins/vcs/GitPlugin.ts +40 -12
  370. package/src/plugins/vcs/VCSPlugin.ts +7 -5
  371. package/src/storage/backends/RFDBServerBackend.ts +43 -29
  372. package/src/validation/PathValidator.ts +1 -1
  373. package/dist/core/AnalysisWorker.d.ts +0 -14
  374. package/dist/core/AnalysisWorker.d.ts.map +0 -1
  375. package/dist/core/AnalysisWorker.js +0 -307
  376. package/dist/core/ParallelAnalyzer.d.ts +0 -120
  377. package/dist/core/ParallelAnalyzer.d.ts.map +0 -1
  378. package/dist/core/ParallelAnalyzer.js +0 -331
  379. package/dist/core/QueueWorker.d.ts +0 -12
  380. package/dist/core/QueueWorker.d.ts.map +0 -1
  381. package/dist/core/QueueWorker.js +0 -567
  382. package/dist/core/RFDBClient.d.ts +0 -179
  383. package/dist/core/RFDBClient.d.ts.map +0 -1
  384. package/dist/core/RFDBClient.js +0 -429
  385. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +0 -19
  386. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +0 -1
  387. package/dist/plugins/discovery/ZonServiceDiscovery.js +0 -204
  388. package/src/core/AnalysisWorker.ts +0 -410
  389. package/src/core/ParallelAnalyzer.ts +0 -476
  390. package/src/core/QueueWorker.ts +0 -780
  391. package/src/plugins/indexing/ServiceDetector.ts +0 -230
@@ -0,0 +1,192 @@
1
+ /**
2
+ * SemanticId - Stable identifiers for code elements
3
+ *
4
+ * Semantic IDs provide stable identifiers for code elements that don't change
5
+ * when unrelated code is added/removed (no line numbers in IDs).
6
+ *
7
+ * Format: {file}->{scope_path}->{type}->{name}[#discriminator]
8
+ *
9
+ * Examples:
10
+ * src/app.js->global->FUNCTION->processData
11
+ * src/app.js->UserService->METHOD->login
12
+ * src/app.js->getUser->if#0->CALL->console.log#0
13
+ *
14
+ * Special formats:
15
+ * Singletons: net:stdio->__stdio__
16
+ * External modules: EXTERNAL_MODULE->lodash
17
+ */
18
+
19
+ /**
20
+ * Location in source file
21
+ */
22
+ export interface Location {
23
+ line: number;
24
+ column: number;
25
+ endLine?: number;
26
+ endColumn?: number;
27
+ }
28
+
29
+ /**
30
+ * Scope context for semantic ID generation
31
+ */
32
+ export interface ScopeContext {
33
+ /** Source file path */
34
+ file: string;
35
+ /** Array of scope names, e.g. ['MyClass', 'myMethod', 'if#1'] */
36
+ scopePath: string[];
37
+ }
38
+
39
+ /**
40
+ * Options for semantic ID generation
41
+ */
42
+ export interface SemanticIdOptions {
43
+ /** Counter for disambiguation (#N) */
44
+ discriminator?: number;
45
+ /** Context string for special cases ([context]) */
46
+ context?: string;
47
+ }
48
+
49
+ /**
50
+ * Parsed semantic ID components
51
+ */
52
+ export interface ParsedSemanticId {
53
+ file: string;
54
+ scopePath: string[];
55
+ type: string;
56
+ name: string;
57
+ discriminator?: number;
58
+ context?: string;
59
+ }
60
+
61
+ /**
62
+ * Item with name and location for discriminator computation
63
+ */
64
+ export interface LocatedItem {
65
+ name: string;
66
+ location: Location;
67
+ }
68
+
69
+ /**
70
+ * Compute semantic ID for any node type.
71
+ *
72
+ * @param type - Node type (FUNCTION, CALL, VARIABLE, etc.)
73
+ * @param name - Node name
74
+ * @param context - Scope context from ScopeTracker
75
+ * @param options - Optional discriminator or context
76
+ * @returns Semantic ID string
77
+ */
78
+ export function computeSemanticId(
79
+ type: string,
80
+ name: string,
81
+ context: ScopeContext,
82
+ options?: SemanticIdOptions
83
+ ): string {
84
+ const { file, scopePath } = context;
85
+ const scope = scopePath.length > 0 ? scopePath.join('->') : 'global';
86
+
87
+ let id = `${file}->${scope}->${type}->${name}`;
88
+
89
+ if (options?.discriminator !== undefined) {
90
+ id += `#${options.discriminator}`;
91
+ } else if (options?.context) {
92
+ id += `[${options.context}]`;
93
+ }
94
+
95
+ return id;
96
+ }
97
+
98
+ /**
99
+ * Parse semantic ID back to components.
100
+ *
101
+ * @param id - Semantic ID to parse
102
+ * @returns Parsed components or null if invalid
103
+ */
104
+ export function parseSemanticId(id: string): ParsedSemanticId | null {
105
+ // Handle singletons
106
+ if (id.startsWith('net:stdio') || id.startsWith('net:request')) {
107
+ const [prefix, name] = id.split('->');
108
+ return {
109
+ file: '',
110
+ scopePath: [prefix],
111
+ type: 'SINGLETON',
112
+ name,
113
+ discriminator: undefined
114
+ };
115
+ }
116
+
117
+ if (id.startsWith('EXTERNAL_MODULE')) {
118
+ const [, name] = id.split('->');
119
+ return {
120
+ file: '',
121
+ scopePath: [],
122
+ type: 'EXTERNAL_MODULE',
123
+ name,
124
+ discriminator: undefined
125
+ };
126
+ }
127
+
128
+ const parts = id.split('->');
129
+ if (parts.length < 4) return null;
130
+
131
+ const file = parts[0];
132
+ const type = parts[parts.length - 2];
133
+ let name = parts[parts.length - 1];
134
+ const scopePath = parts.slice(1, -2);
135
+
136
+ // Parse discriminator or context
137
+ let discriminator: number | undefined;
138
+ let context: string | undefined;
139
+
140
+ const hashMatch = name.match(/^(.+)#(\d+)$/);
141
+ if (hashMatch) {
142
+ name = hashMatch[1];
143
+ discriminator = parseInt(hashMatch[2], 10);
144
+ }
145
+
146
+ const bracketMatch = name.match(/^(.+)\[(.+)\]$/);
147
+ if (bracketMatch) {
148
+ name = bracketMatch[1];
149
+ context = bracketMatch[2];
150
+ }
151
+
152
+ return { file, scopePath, type, name, discriminator, context };
153
+ }
154
+
155
+ /**
156
+ * Compute discriminator for items with same name in same scope.
157
+ * Uses line/column for stable ordering.
158
+ *
159
+ * @param items - All items in scope
160
+ * @param targetName - Name to find discriminator for
161
+ * @param targetLocation - Location of target item
162
+ * @returns Discriminator (0-based index among same-named items)
163
+ */
164
+ export function computeDiscriminator(
165
+ items: LocatedItem[],
166
+ targetName: string,
167
+ targetLocation: Location
168
+ ): number {
169
+ // Filter items with same name
170
+ const sameNameItems = items.filter(item => item.name === targetName);
171
+
172
+ if (sameNameItems.length <= 1) {
173
+ return 0;
174
+ }
175
+
176
+ // Sort by line, then by column for stable ordering
177
+ sameNameItems.sort((a, b) => {
178
+ if (a.location.line !== b.location.line) {
179
+ return a.location.line - b.location.line;
180
+ }
181
+ return a.location.column - b.location.column;
182
+ });
183
+
184
+ // Find index of target
185
+ const index = sameNameItems.findIndex(
186
+ item =>
187
+ item.location.line === targetLocation.line &&
188
+ item.location.column === targetLocation.column
189
+ );
190
+
191
+ return index >= 0 ? index : 0;
192
+ }
@@ -170,9 +170,10 @@ export class VersionManager {
170
170
  return `${type}:${name}:${file}:${line || 0}`;
171
171
  }
172
172
 
173
- // Для MODULE - только file
173
+ // Для MODULE - use semantic ID format with name (relative path)
174
174
  if (type === 'MODULE') {
175
- return `MODULE:${file}`;
175
+ // name stores the relative path for MODULE nodes
176
+ return `${name}->global->MODULE->module`;
176
177
  }
177
178
 
178
179
  // Для SERVICE - используем имя или file
@@ -0,0 +1,89 @@
1
+ /**
2
+ * ArgumentExpressionNode - EXPRESSION node with call argument context
3
+ *
4
+ * Extends ExpressionNode with fields tracking which call and argument position
5
+ * this expression appears in. Used for argument data flow tracking.
6
+ *
7
+ * ID format: {file}:EXPRESSION:{expressionType}:{line}:{column}
8
+ * With counter: {file}:EXPRESSION:{expressionType}:{line}:{column}:{counter}
9
+ *
10
+ * Example: /src/app.ts:EXPRESSION:BinaryExpression:25:10
11
+ *
12
+ * Note: Uses counter suffix since same expression at same position can appear
13
+ * multiple times in different argument contexts.
14
+ */
15
+
16
+ import { ExpressionNode, type ExpressionNodeRecord, type ExpressionNodeOptions } from './ExpressionNode.js';
17
+
18
+ interface ArgumentExpressionNodeRecord extends ExpressionNodeRecord {
19
+ parentCallId: string;
20
+ argIndex: number;
21
+ }
22
+
23
+ interface ArgumentExpressionNodeOptions extends ExpressionNodeOptions {
24
+ parentCallId: string;
25
+ argIndex: number;
26
+ counter?: number;
27
+ }
28
+
29
+ export class ArgumentExpressionNode {
30
+ // Inherit TYPE from ExpressionNode
31
+ static readonly TYPE = ExpressionNode.TYPE;
32
+ static readonly REQUIRED: readonly string[] = [...ExpressionNode.REQUIRED, 'parentCallId', 'argIndex'];
33
+ static readonly OPTIONAL: readonly string[] = [...ExpressionNode.OPTIONAL, 'counter'];
34
+
35
+ /**
36
+ * Create EXPRESSION node with argument context
37
+ *
38
+ * @param expressionType - Type of expression (BinaryExpression, LogicalExpression, etc.)
39
+ * @param file - File path
40
+ * @param line - Line number
41
+ * @param column - Column position
42
+ * @param options - Required: parentCallId, argIndex; Optional: expression properties, counter
43
+ * @returns ArgumentExpressionNodeRecord
44
+ */
45
+ static create(
46
+ expressionType: string,
47
+ file: string,
48
+ line: number,
49
+ column: number,
50
+ options: ArgumentExpressionNodeOptions
51
+ ): ArgumentExpressionNodeRecord {
52
+ if (!options.parentCallId) {
53
+ throw new Error('ArgumentExpressionNode.create: parentCallId is required');
54
+ }
55
+ if (options.argIndex === undefined) {
56
+ throw new Error('ArgumentExpressionNode.create: argIndex is required');
57
+ }
58
+
59
+ // Create base EXPRESSION node using parent class
60
+ const baseNode = ExpressionNode.create(expressionType, file, line, column, options);
61
+
62
+ // Override ID with counter suffix (since same location can have multiple expressions)
63
+ const counter = options.counter !== undefined ? `:${options.counter}` : '';
64
+ const id = `${file}:EXPRESSION:${expressionType}:${line}:${column}${counter}`;
65
+
66
+ return {
67
+ ...baseNode,
68
+ id,
69
+ parentCallId: options.parentCallId,
70
+ argIndex: options.argIndex
71
+ };
72
+ }
73
+
74
+ static validate(node: ArgumentExpressionNodeRecord): string[] {
75
+ const errors = ExpressionNode.validate(node);
76
+
77
+ if (!node.parentCallId) {
78
+ errors.push('Missing required field: parentCallId');
79
+ }
80
+
81
+ if (node.argIndex === undefined) {
82
+ errors.push('Missing required field: argIndex');
83
+ }
84
+
85
+ return errors;
86
+ }
87
+ }
88
+
89
+ export type { ArgumentExpressionNodeRecord, ArgumentExpressionNodeOptions };
@@ -0,0 +1,65 @@
1
+ /**
2
+ * ArrayLiteralNode - contract for ARRAY_LITERAL node
3
+ *
4
+ * Represents an array literal expression: [elem1, elem2, ...]
5
+ * Used for tracking data flow through array construction.
6
+ */
7
+
8
+ import type { BaseNodeRecord } from '@grafema/types';
9
+
10
+ interface ArrayLiteralNodeRecord extends BaseNodeRecord {
11
+ type: 'ARRAY_LITERAL';
12
+ column: number;
13
+ parentCallId?: string;
14
+ argIndex?: number;
15
+ }
16
+
17
+ interface ArrayLiteralNodeOptions {
18
+ parentCallId?: string;
19
+ argIndex?: number;
20
+ counter?: number;
21
+ }
22
+
23
+ export class ArrayLiteralNode {
24
+ static readonly TYPE = 'ARRAY_LITERAL' as const;
25
+
26
+ static readonly REQUIRED = ['file', 'line', 'column'] as const;
27
+ static readonly OPTIONAL = ['parentCallId', 'argIndex'] as const;
28
+
29
+ static create(
30
+ file: string,
31
+ line: number,
32
+ column: number,
33
+ options: ArrayLiteralNodeOptions = {}
34
+ ): ArrayLiteralNodeRecord {
35
+ if (!file) throw new Error('ArrayLiteralNode.create: file is required');
36
+ if (line === undefined) throw new Error('ArrayLiteralNode.create: line is required');
37
+
38
+ const counter = options.counter !== undefined ? `:${options.counter}` : '';
39
+ const argSuffix = options.argIndex !== undefined ? `arg${options.argIndex}` : 'arr';
40
+ const id = `ARRAY_LITERAL#${argSuffix}#${file}#${line}:${column || 0}${counter}`;
41
+
42
+ return {
43
+ id,
44
+ type: this.TYPE,
45
+ name: `<array>`,
46
+ file,
47
+ line,
48
+ column: column || 0,
49
+ parentCallId: options.parentCallId,
50
+ argIndex: options.argIndex
51
+ };
52
+ }
53
+
54
+ static validate(node: ArrayLiteralNodeRecord): string[] {
55
+ const errors: string[] = [];
56
+ if (node.type !== this.TYPE) errors.push(`Expected type ${this.TYPE}`);
57
+ const nodeRecord = node as unknown as Record<string, unknown>;
58
+ for (const field of this.REQUIRED) {
59
+ if (nodeRecord[field] === undefined) errors.push(`Missing: ${field}`);
60
+ }
61
+ return errors;
62
+ }
63
+ }
64
+
65
+ export type { ArrayLiteralNodeRecord, ArrayLiteralNodeOptions };
@@ -1,8 +1,16 @@
1
1
  /**
2
2
  * CallSiteNode - contract for CALL_SITE 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}->CALL->{calleeName}#N
9
+ * Example: src/app.js->handler->CALL->console.log#0
3
10
  */
4
11
 
5
12
  import type { BaseNodeRecord } from '@grafema/types';
13
+ import { computeSemanticId, type ScopeContext, type Location } from '../SemanticId.js';
6
14
 
7
15
  interface CallSiteNodeRecord extends BaseNodeRecord {
8
16
  type: 'CALL_SITE';
@@ -16,6 +24,14 @@ interface CallSiteNodeOptions {
16
24
  counter?: number;
17
25
  }
18
26
 
27
+ /**
28
+ * Options for createWithContext
29
+ */
30
+ interface CallSiteContextOptions {
31
+ discriminator: number;
32
+ parentScopeId?: string;
33
+ }
34
+
19
35
  export class CallSiteNode {
20
36
  static readonly TYPE = 'CALL_SITE' as const;
21
37
 
@@ -51,6 +67,48 @@ export class CallSiteNode {
51
67
  };
52
68
  }
53
69
 
70
+ /**
71
+ * Create CALL_SITE node with semantic ID (NEW API)
72
+ *
73
+ * Uses ScopeContext from ScopeTracker for stable identifiers.
74
+ * Requires discriminator for multiple calls to same function within scope.
75
+ *
76
+ * @param targetName - Name of called function (e.g., 'console.log', 'db.query')
77
+ * @param context - Scope context from ScopeTracker.getContext()
78
+ * @param location - Source location { line, column }
79
+ * @param options - Options including required discriminator
80
+ * @returns CallSiteNodeRecord with semantic ID
81
+ */
82
+ static createWithContext(
83
+ targetName: string,
84
+ context: ScopeContext,
85
+ location: Partial<Location>,
86
+ options: CallSiteContextOptions
87
+ ): CallSiteNodeRecord {
88
+ // Validate required fields
89
+ if (!targetName) throw new Error('CallSiteNode.createWithContext: targetName is required');
90
+ if (!context.file) throw new Error('CallSiteNode.createWithContext: file is required');
91
+ if (location.line === undefined) throw new Error('CallSiteNode.createWithContext: line is required');
92
+ if (options.discriminator === undefined) throw new Error('CallSiteNode.createWithContext: discriminator is required');
93
+
94
+ // Compute semantic ID with discriminator
95
+ // Use 'CALL' as the type for cleaner IDs (matches spec)
96
+ const id = computeSemanticId('CALL', targetName, context, {
97
+ discriminator: options.discriminator
98
+ });
99
+
100
+ return {
101
+ id,
102
+ type: this.TYPE,
103
+ name: targetName,
104
+ file: context.file,
105
+ line: location.line,
106
+ column: location.column ?? 0,
107
+ parentScopeId: options.parentScopeId,
108
+ targetFunctionName: targetName
109
+ };
110
+ }
111
+
54
112
  static validate(node: CallSiteNodeRecord): string[] {
55
113
  const errors: string[] = [];
56
114
 
@@ -1,8 +1,16 @@
1
1
  /**
2
2
  * ClassNode - contract for CLASS 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}->CLASS->{name}
9
+ * Example: src/models/User.js->global->CLASS->User
3
10
  */
4
11
 
5
12
  import type { BaseNodeRecord } from '@grafema/types';
13
+ import { computeSemanticId, type ScopeContext, type Location } from '../SemanticId.js';
6
14
 
7
15
  interface ClassNodeRecord extends BaseNodeRecord {
8
16
  type: 'CLASS';
@@ -10,19 +18,31 @@ interface ClassNodeRecord extends BaseNodeRecord {
10
18
  exported: boolean;
11
19
  superClass?: string;
12
20
  methods: string[];
21
+ isInstantiationRef?: boolean;
13
22
  }
14
23
 
15
24
  interface ClassNodeOptions {
16
25
  exported?: boolean;
17
26
  superClass?: string;
18
27
  methods?: string[];
28
+ isInstantiationRef?: boolean;
29
+ }
30
+
31
+ /**
32
+ * Options for createWithContext
33
+ */
34
+ interface ClassContextOptions {
35
+ exported?: boolean;
36
+ superClass?: string;
37
+ methods?: string[];
38
+ isInstantiationRef?: boolean;
19
39
  }
20
40
 
21
41
  export class ClassNode {
22
42
  static readonly TYPE = 'CLASS' as const;
23
43
 
24
44
  static readonly REQUIRED = ['name', 'file', 'line'] as const;
25
- static readonly OPTIONAL = ['column', 'exported', 'superClass', 'methods'] as const;
45
+ static readonly OPTIONAL = ['column', 'exported', 'superClass', 'methods', 'isInstantiationRef'] as const;
26
46
 
27
47
  static create(
28
48
  name: string,
@@ -44,7 +64,48 @@ export class ClassNode {
44
64
  column: column || 0,
45
65
  exported: options.exported || false,
46
66
  superClass: options.superClass,
47
- methods: options.methods || []
67
+ methods: options.methods || [],
68
+ ...(options.isInstantiationRef !== undefined && { isInstantiationRef: options.isInstantiationRef })
69
+ };
70
+ }
71
+
72
+ /**
73
+ * Create CLASS node with semantic ID (NEW API)
74
+ *
75
+ * Uses ScopeContext from ScopeTracker for stable identifiers.
76
+ * Class names are unique within scope, so no discriminator needed.
77
+ *
78
+ * @param name - Class name
79
+ * @param context - Scope context from ScopeTracker.getContext()
80
+ * @param location - Source location { line, column }
81
+ * @param options - Optional class properties
82
+ * @returns ClassNodeRecord with semantic ID
83
+ */
84
+ static createWithContext(
85
+ name: string,
86
+ context: ScopeContext,
87
+ location: Partial<Location>,
88
+ options: ClassContextOptions = {}
89
+ ): ClassNodeRecord {
90
+ // Validate required fields
91
+ if (!name) throw new Error('ClassNode.createWithContext: name is required');
92
+ if (!context.file) throw new Error('ClassNode.createWithContext: file is required');
93
+ if (location.line === undefined) throw new Error('ClassNode.createWithContext: line is required');
94
+
95
+ // Compute semantic ID
96
+ const id = computeSemanticId(this.TYPE, name, context);
97
+
98
+ return {
99
+ id,
100
+ type: this.TYPE,
101
+ name,
102
+ file: context.file,
103
+ line: location.line,
104
+ column: location.column ?? 0,
105
+ exported: options.exported || false,
106
+ superClass: options.superClass,
107
+ methods: options.methods || [],
108
+ ...(options.isInstantiationRef !== undefined && { isInstantiationRef: options.isInstantiationRef })
48
109
  };
49
110
  }
50
111
 
@@ -0,0 +1,91 @@
1
+ /**
2
+ * DecoratorNode - contract for DECORATOR node
3
+ *
4
+ * Represents TypeScript/JavaScript decorators applied to
5
+ * classes, methods, properties, or parameters.
6
+ *
7
+ * ID format: {file}:DECORATOR:{name}:{line}:{column}
8
+ * Example: /src/services/UserService.ts:DECORATOR:Injectable:5:0
9
+ */
10
+
11
+ import type { BaseNodeRecord } from '@grafema/types';
12
+
13
+ type DecoratorTargetType = 'CLASS' | 'METHOD' | 'PROPERTY' | 'PARAMETER';
14
+
15
+ interface DecoratorNodeRecord extends BaseNodeRecord {
16
+ type: 'DECORATOR';
17
+ column: number;
18
+ arguments: unknown[];
19
+ targetId: string;
20
+ targetType: DecoratorTargetType;
21
+ }
22
+
23
+ interface DecoratorNodeOptions {
24
+ arguments?: unknown[];
25
+ }
26
+
27
+ export class DecoratorNode {
28
+ static readonly TYPE = 'DECORATOR' as const;
29
+
30
+ static readonly REQUIRED = ['name', 'file', 'line', 'targetId', 'targetType'] as const;
31
+ static readonly OPTIONAL = ['column', 'arguments'] as const;
32
+
33
+ /**
34
+ * Create DECORATOR node
35
+ *
36
+ * @param name - Decorator name
37
+ * @param file - File path
38
+ * @param line - Line number
39
+ * @param column - Column position
40
+ * @param targetId - ID of decorated element
41
+ * @param targetType - Type of decorated element
42
+ * @param options - Optional decorator properties
43
+ * @returns DecoratorNodeRecord
44
+ */
45
+ static create(
46
+ name: string,
47
+ file: string,
48
+ line: number,
49
+ column: number,
50
+ targetId: string,
51
+ targetType: DecoratorTargetType,
52
+ options: DecoratorNodeOptions = {}
53
+ ): DecoratorNodeRecord {
54
+ if (!name) throw new Error('DecoratorNode.create: name is required');
55
+ if (!file) throw new Error('DecoratorNode.create: file is required');
56
+ if (!line) throw new Error('DecoratorNode.create: line is required');
57
+ if (!targetId) throw new Error('DecoratorNode.create: targetId is required');
58
+ if (!targetType) throw new Error('DecoratorNode.create: targetType is required');
59
+
60
+ return {
61
+ id: `${file}:DECORATOR:${name}:${line}:${column}`,
62
+ type: this.TYPE,
63
+ name,
64
+ file,
65
+ line,
66
+ column: column || 0,
67
+ arguments: options.arguments || [],
68
+ targetId,
69
+ targetType
70
+ };
71
+ }
72
+
73
+ static validate(node: DecoratorNodeRecord): string[] {
74
+ const errors: string[] = [];
75
+
76
+ if (node.type !== this.TYPE) {
77
+ errors.push(`Expected type ${this.TYPE}, got ${node.type}`);
78
+ }
79
+
80
+ const nodeRecord = node as unknown as Record<string, unknown>;
81
+ for (const field of this.REQUIRED) {
82
+ if (!nodeRecord[field]) {
83
+ errors.push(`Missing required field: ${field}`);
84
+ }
85
+ }
86
+
87
+ return errors;
88
+ }
89
+ }
90
+
91
+ export type { DecoratorNodeRecord, DecoratorTargetType };