@grafema/core 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +76 -0
  3. package/dist/Orchestrator.d.ts +142 -0
  4. package/dist/Orchestrator.d.ts.map +1 -0
  5. package/dist/Orchestrator.js +481 -0
  6. package/dist/api/GraphAPI.d.ts +87 -0
  7. package/dist/api/GraphAPI.d.ts.map +1 -0
  8. package/dist/api/GraphAPI.js +210 -0
  9. package/dist/api/GuaranteeAPI.d.ts +147 -0
  10. package/dist/api/GuaranteeAPI.d.ts.map +1 -0
  11. package/dist/api/GuaranteeAPI.js +288 -0
  12. package/dist/core/ASTWorker.d.ts +133 -0
  13. package/dist/core/ASTWorker.d.ts.map +1 -0
  14. package/dist/core/ASTWorker.js +352 -0
  15. package/dist/core/ASTWorkerPool.d.ts +85 -0
  16. package/dist/core/ASTWorkerPool.d.ts.map +1 -0
  17. package/dist/core/ASTWorkerPool.js +207 -0
  18. package/dist/core/AnalysisQueue.d.ts +104 -0
  19. package/dist/core/AnalysisQueue.d.ts.map +1 -0
  20. package/dist/core/AnalysisQueue.js +299 -0
  21. package/dist/core/AnalysisWorker.d.ts +14 -0
  22. package/dist/core/AnalysisWorker.d.ts.map +1 -0
  23. package/dist/core/AnalysisWorker.js +307 -0
  24. package/dist/core/GraphBackend.d.ts +156 -0
  25. package/dist/core/GraphBackend.d.ts.map +1 -0
  26. package/dist/core/GraphBackend.js +85 -0
  27. package/dist/core/GuaranteeManager.d.ts +230 -0
  28. package/dist/core/GuaranteeManager.d.ts.map +1 -0
  29. package/dist/core/GuaranteeManager.js +352 -0
  30. package/dist/core/ManifestStore.d.ts +71 -0
  31. package/dist/core/ManifestStore.d.ts.map +1 -0
  32. package/dist/core/ManifestStore.js +146 -0
  33. package/dist/core/NodeFactory.d.ts +160 -0
  34. package/dist/core/NodeFactory.d.ts.map +1 -0
  35. package/dist/core/NodeFactory.js +137 -0
  36. package/dist/core/NodeId.d.ts +88 -0
  37. package/dist/core/NodeId.d.ts.map +1 -0
  38. package/dist/core/NodeId.js +170 -0
  39. package/dist/core/ParallelAnalyzer.d.ts +120 -0
  40. package/dist/core/ParallelAnalyzer.d.ts.map +1 -0
  41. package/dist/core/ParallelAnalyzer.js +331 -0
  42. package/dist/core/PriorityQueue.d.ts +106 -0
  43. package/dist/core/PriorityQueue.d.ts.map +1 -0
  44. package/dist/core/PriorityQueue.js +168 -0
  45. package/dist/core/Profiler.d.ts +75 -0
  46. package/dist/core/Profiler.d.ts.map +1 -0
  47. package/dist/core/Profiler.js +149 -0
  48. package/dist/core/QueueWorker.d.ts +12 -0
  49. package/dist/core/QueueWorker.d.ts.map +1 -0
  50. package/dist/core/QueueWorker.js +567 -0
  51. package/dist/core/RFDBClient.d.ts +179 -0
  52. package/dist/core/RFDBClient.d.ts.map +1 -0
  53. package/dist/core/RFDBClient.js +429 -0
  54. package/dist/core/Task.d.ts +56 -0
  55. package/dist/core/Task.d.ts.map +1 -0
  56. package/dist/core/Task.js +85 -0
  57. package/dist/core/TaskTypes.d.ts +20 -0
  58. package/dist/core/TaskTypes.d.ts.map +1 -0
  59. package/dist/core/TaskTypes.js +10 -0
  60. package/dist/core/VersionManager.d.ts +166 -0
  61. package/dist/core/VersionManager.d.ts.map +1 -0
  62. package/dist/core/VersionManager.js +237 -0
  63. package/dist/core/WorkerPool.d.ts +82 -0
  64. package/dist/core/WorkerPool.d.ts.map +1 -0
  65. package/dist/core/WorkerPool.js +109 -0
  66. package/dist/core/nodes/CallSiteNode.d.ts +26 -0
  67. package/dist/core/nodes/CallSiteNode.d.ts.map +1 -0
  68. package/dist/core/nodes/CallSiteNode.js +44 -0
  69. package/dist/core/nodes/ClassNode.d.ts +25 -0
  70. package/dist/core/nodes/ClassNode.d.ts.map +1 -0
  71. package/dist/core/nodes/ClassNode.js +40 -0
  72. package/dist/core/nodes/ConstantNode.d.ts +24 -0
  73. package/dist/core/nodes/ConstantNode.d.ts.map +1 -0
  74. package/dist/core/nodes/ConstantNode.js +39 -0
  75. package/dist/core/nodes/DatabaseQueryNode.d.ts +22 -0
  76. package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -0
  77. package/dist/core/nodes/DatabaseQueryNode.js +37 -0
  78. package/dist/core/nodes/EntrypointNode.d.ts +102 -0
  79. package/dist/core/nodes/EntrypointNode.d.ts.map +1 -0
  80. package/dist/core/nodes/EntrypointNode.js +119 -0
  81. package/dist/core/nodes/EventListenerNode.d.ts +25 -0
  82. package/dist/core/nodes/EventListenerNode.d.ts.map +1 -0
  83. package/dist/core/nodes/EventListenerNode.js +39 -0
  84. package/dist/core/nodes/ExportNode.d.ts +26 -0
  85. package/dist/core/nodes/ExportNode.d.ts.map +1 -0
  86. package/dist/core/nodes/ExportNode.js +40 -0
  87. package/dist/core/nodes/ExternalStdioNode.d.ts +17 -0
  88. package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -0
  89. package/dist/core/nodes/ExternalStdioNode.js +26 -0
  90. package/dist/core/nodes/FunctionNode.d.ts +27 -0
  91. package/dist/core/nodes/FunctionNode.d.ts.map +1 -0
  92. package/dist/core/nodes/FunctionNode.js +53 -0
  93. package/dist/core/nodes/GuaranteeNode.d.ts +76 -0
  94. package/dist/core/nodes/GuaranteeNode.d.ts.map +1 -0
  95. package/dist/core/nodes/GuaranteeNode.js +117 -0
  96. package/dist/core/nodes/HttpRequestNode.d.ts +24 -0
  97. package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -0
  98. package/dist/core/nodes/HttpRequestNode.js +38 -0
  99. package/dist/core/nodes/ImportNode.d.ts +27 -0
  100. package/dist/core/nodes/ImportNode.d.ts.map +1 -0
  101. package/dist/core/nodes/ImportNode.js +43 -0
  102. package/dist/core/nodes/LiteralNode.d.ts +26 -0
  103. package/dist/core/nodes/LiteralNode.d.ts.map +1 -0
  104. package/dist/core/nodes/LiteralNode.js +40 -0
  105. package/dist/core/nodes/MethodCallNode.d.ts +29 -0
  106. package/dist/core/nodes/MethodCallNode.d.ts.map +1 -0
  107. package/dist/core/nodes/MethodCallNode.js +47 -0
  108. package/dist/core/nodes/MethodNode.d.ts +29 -0
  109. package/dist/core/nodes/MethodNode.d.ts.map +1 -0
  110. package/dist/core/nodes/MethodNode.js +44 -0
  111. package/dist/core/nodes/ModuleNode.d.ts +29 -0
  112. package/dist/core/nodes/ModuleNode.d.ts.map +1 -0
  113. package/dist/core/nodes/ModuleNode.js +49 -0
  114. package/dist/core/nodes/NodeKind.d.ts +91 -0
  115. package/dist/core/nodes/NodeKind.d.ts.map +1 -0
  116. package/dist/core/nodes/NodeKind.js +146 -0
  117. package/dist/core/nodes/ParameterNode.d.ts +26 -0
  118. package/dist/core/nodes/ParameterNode.d.ts.map +1 -0
  119. package/dist/core/nodes/ParameterNode.js +43 -0
  120. package/dist/core/nodes/ScopeNode.d.ts +32 -0
  121. package/dist/core/nodes/ScopeNode.d.ts.map +1 -0
  122. package/dist/core/nodes/ScopeNode.js +47 -0
  123. package/dist/core/nodes/ServiceNode.d.ts +44 -0
  124. package/dist/core/nodes/ServiceNode.d.ts.map +1 -0
  125. package/dist/core/nodes/ServiceNode.js +49 -0
  126. package/dist/core/nodes/VariableDeclarationNode.d.ts +22 -0
  127. package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -0
  128. package/dist/core/nodes/VariableDeclarationNode.js +38 -0
  129. package/dist/core/nodes/index.d.ts +25 -0
  130. package/dist/core/nodes/index.d.ts.map +1 -0
  131. package/dist/core/nodes/index.js +30 -0
  132. package/dist/index.d.ts +57 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +63 -0
  135. package/dist/plugins/Plugin.d.ts +44 -0
  136. package/dist/plugins/Plugin.d.ts.map +1 -0
  137. package/dist/plugins/Plugin.js +46 -0
  138. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts +23 -0
  139. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -0
  140. package/dist/plugins/analysis/DatabaseAnalyzer.js +260 -0
  141. package/dist/plugins/analysis/ExpressAnalyzer.d.ts +19 -0
  142. package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -0
  143. package/dist/plugins/analysis/ExpressAnalyzer.js +306 -0
  144. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts +17 -0
  145. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -0
  146. package/dist/plugins/analysis/ExpressRouteAnalyzer.js +308 -0
  147. package/dist/plugins/analysis/FetchAnalyzer.d.ts +38 -0
  148. package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -0
  149. package/dist/plugins/analysis/FetchAnalyzer.js +344 -0
  150. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +65 -0
  151. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -0
  152. package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +472 -0
  153. package/dist/plugins/analysis/JSASTAnalyzer.d.ts +84 -0
  154. package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -0
  155. package/dist/plugins/analysis/JSASTAnalyzer.js +1378 -0
  156. package/dist/plugins/analysis/ReactAnalyzer.d.ts +90 -0
  157. package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -0
  158. package/dist/plugins/analysis/ReactAnalyzer.js +1153 -0
  159. package/dist/plugins/analysis/RustAnalyzer.d.ts +13 -0
  160. package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -0
  161. package/dist/plugins/analysis/RustAnalyzer.js +259 -0
  162. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts +21 -0
  163. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -0
  164. package/dist/plugins/analysis/SQLiteAnalyzer.js +317 -0
  165. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts +35 -0
  166. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -0
  167. package/dist/plugins/analysis/ServiceLayerAnalyzer.js +303 -0
  168. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +33 -0
  169. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -0
  170. package/dist/plugins/analysis/SocketIOAnalyzer.js +283 -0
  171. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts +27 -0
  172. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -0
  173. package/dist/plugins/analysis/SystemDbAnalyzer.js +211 -0
  174. package/dist/plugins/analysis/ast/ConditionParser.d.ts +85 -0
  175. package/dist/plugins/analysis/ast/ConditionParser.d.ts.map +1 -0
  176. package/dist/plugins/analysis/ast/ConditionParser.js +277 -0
  177. package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts +15 -0
  178. package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts.map +1 -0
  179. package/dist/plugins/analysis/ast/ExpressionEvaluator.js +91 -0
  180. package/dist/plugins/analysis/ast/GraphBuilder.d.ts +77 -0
  181. package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -0
  182. package/dist/plugins/analysis/ast/GraphBuilder.js +1077 -0
  183. package/dist/plugins/analysis/ast/OxcAdapter.d.ts +41 -0
  184. package/dist/plugins/analysis/ast/OxcAdapter.d.ts.map +1 -0
  185. package/dist/plugins/analysis/ast/OxcAdapter.js +40 -0
  186. package/dist/plugins/analysis/ast/types.d.ts +346 -0
  187. package/dist/plugins/analysis/ast/types.d.ts.map +1 -0
  188. package/dist/plugins/analysis/ast/types.js +4 -0
  189. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +93 -0
  190. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -0
  191. package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +24 -0
  192. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +77 -0
  193. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -0
  194. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +377 -0
  195. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +27 -0
  196. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -0
  197. package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +232 -0
  198. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +25 -0
  199. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -0
  200. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +172 -0
  201. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +29 -0
  202. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -0
  203. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +180 -0
  204. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +14 -0
  205. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -0
  206. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +200 -0
  207. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +45 -0
  208. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -0
  209. package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +150 -0
  210. package/dist/plugins/analysis/ast/visitors/index.d.ts +17 -0
  211. package/dist/plugins/analysis/ast/visitors/index.d.ts.map +1 -0
  212. package/dist/plugins/analysis/ast/visitors/index.js +13 -0
  213. package/dist/plugins/discovery/DiscoveryPlugin.d.ts +34 -0
  214. package/dist/plugins/discovery/DiscoveryPlugin.d.ts.map +1 -0
  215. package/dist/plugins/discovery/DiscoveryPlugin.js +26 -0
  216. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts +26 -0
  217. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -0
  218. package/dist/plugins/discovery/MonorepoServiceDiscovery.js +79 -0
  219. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts +14 -0
  220. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -0
  221. package/dist/plugins/discovery/SimpleProjectDiscovery.js +65 -0
  222. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +19 -0
  223. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +1 -0
  224. package/dist/plugins/discovery/ZonServiceDiscovery.js +204 -0
  225. package/dist/plugins/enrichment/AliasTracker.d.ts +40 -0
  226. package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -0
  227. package/dist/plugins/enrichment/AliasTracker.js +290 -0
  228. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +30 -0
  229. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -0
  230. package/dist/plugins/enrichment/HTTPConnectionEnricher.js +135 -0
  231. package/dist/plugins/enrichment/ImportExportLinker.d.ts +30 -0
  232. package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -0
  233. package/dist/plugins/enrichment/ImportExportLinker.js +176 -0
  234. package/dist/plugins/enrichment/InstanceOfResolver.d.ts +21 -0
  235. package/dist/plugins/enrichment/InstanceOfResolver.d.ts.map +1 -0
  236. package/dist/plugins/enrichment/InstanceOfResolver.js +117 -0
  237. package/dist/plugins/enrichment/MethodCallResolver.d.ts +41 -0
  238. package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -0
  239. package/dist/plugins/enrichment/MethodCallResolver.js +252 -0
  240. package/dist/plugins/enrichment/MountPointResolver.d.ts +26 -0
  241. package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -0
  242. package/dist/plugins/enrichment/MountPointResolver.js +189 -0
  243. package/dist/plugins/enrichment/PrefixEvaluator.d.ts +89 -0
  244. package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -0
  245. package/dist/plugins/enrichment/PrefixEvaluator.js +415 -0
  246. package/dist/plugins/enrichment/RustFFIEnricher.d.ts +25 -0
  247. package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -0
  248. package/dist/plugins/enrichment/RustFFIEnricher.js +170 -0
  249. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +114 -0
  250. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -0
  251. package/dist/plugins/enrichment/ValueDomainAnalyzer.js +464 -0
  252. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts +27 -0
  253. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -0
  254. package/dist/plugins/indexing/IncrementalModuleIndexer.js +238 -0
  255. package/dist/plugins/indexing/JSModuleIndexer.d.ts +33 -0
  256. package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -0
  257. package/dist/plugins/indexing/JSModuleIndexer.js +299 -0
  258. package/dist/plugins/indexing/RustModuleIndexer.d.ts +28 -0
  259. package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -0
  260. package/dist/plugins/indexing/RustModuleIndexer.js +140 -0
  261. package/dist/plugins/indexing/ServiceDetector.d.ts +46 -0
  262. package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -0
  263. package/dist/plugins/indexing/ServiceDetector.js +164 -0
  264. package/dist/plugins/validation/CallResolverValidator.d.ts +23 -0
  265. package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -0
  266. package/dist/plugins/validation/CallResolverValidator.js +108 -0
  267. package/dist/plugins/validation/DataFlowValidator.d.ts +24 -0
  268. package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -0
  269. package/dist/plugins/validation/DataFlowValidator.js +148 -0
  270. package/dist/plugins/validation/EvalBanValidator.d.ts +25 -0
  271. package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -0
  272. package/dist/plugins/validation/EvalBanValidator.js +123 -0
  273. package/dist/plugins/validation/GraphConnectivityValidator.d.ts +11 -0
  274. package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -0
  275. package/dist/plugins/validation/GraphConnectivityValidator.js +135 -0
  276. package/dist/plugins/validation/SQLInjectionValidator.d.ts +43 -0
  277. package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -0
  278. package/dist/plugins/validation/SQLInjectionValidator.js +251 -0
  279. package/dist/plugins/validation/ShadowingDetector.d.ts +26 -0
  280. package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -0
  281. package/dist/plugins/validation/ShadowingDetector.js +119 -0
  282. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts +21 -0
  283. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -0
  284. package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +151 -0
  285. package/dist/plugins/vcs/GitPlugin.d.ts +84 -0
  286. package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -0
  287. package/dist/plugins/vcs/GitPlugin.js +295 -0
  288. package/dist/plugins/vcs/VCSPlugin.d.ts +133 -0
  289. package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -0
  290. package/dist/plugins/vcs/VCSPlugin.js +82 -0
  291. package/dist/plugins/vcs/index.d.ts +10 -0
  292. package/dist/plugins/vcs/index.d.ts.map +1 -0
  293. package/dist/plugins/vcs/index.js +18 -0
  294. package/dist/storage/backends/RFDBServerBackend.d.ts +258 -0
  295. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -0
  296. package/dist/storage/backends/RFDBServerBackend.js +565 -0
  297. package/dist/storage/backends/typeValidation.d.ts +47 -0
  298. package/dist/storage/backends/typeValidation.d.ts.map +1 -0
  299. package/dist/storage/backends/typeValidation.js +137 -0
  300. package/dist/validation/PathValidator.d.ts +81 -0
  301. package/dist/validation/PathValidator.d.ts.map +1 -0
  302. package/dist/validation/PathValidator.js +251 -0
  303. package/package.json +57 -0
  304. package/src/.rfguard/current-session.txt +1 -0
  305. package/src/Orchestrator.ts +673 -0
  306. package/src/api/GraphAPI.ts +305 -0
  307. package/src/api/GuaranteeAPI.ts +401 -0
  308. package/src/core/ASTWorker.ts +567 -0
  309. package/src/core/ASTWorkerPool.ts +299 -0
  310. package/src/core/AnalysisQueue.ts +447 -0
  311. package/src/core/AnalysisWorker.ts +410 -0
  312. package/src/core/GraphBackend.ts +265 -0
  313. package/src/core/GuaranteeManager.ts +581 -0
  314. package/src/core/ManifestStore.ts +196 -0
  315. package/src/core/NodeFactory.ts +274 -0
  316. package/src/core/NodeId.ts +257 -0
  317. package/src/core/ParallelAnalyzer.ts +476 -0
  318. package/src/core/PriorityQueue.ts +227 -0
  319. package/src/core/Profiler.ts +188 -0
  320. package/src/core/QueueWorker.ts +780 -0
  321. package/src/core/Task.ts +107 -0
  322. package/src/core/TaskTypes.ts +40 -0
  323. package/src/core/VersionManager.ts +404 -0
  324. package/src/core/WorkerPool.ts +180 -0
  325. package/src/core/nodes/CallSiteNode.ts +72 -0
  326. package/src/core/nodes/ClassNode.ts +69 -0
  327. package/src/core/nodes/ConstantNode.ts +63 -0
  328. package/src/core/nodes/DatabaseQueryNode.ts +60 -0
  329. package/src/core/nodes/EntrypointNode.ts +164 -0
  330. package/src/core/nodes/EventListenerNode.ts +64 -0
  331. package/src/core/nodes/ExportNode.ts +71 -0
  332. package/src/core/nodes/ExternalStdioNode.ts +36 -0
  333. package/src/core/nodes/FunctionNode.ts +78 -0
  334. package/src/core/nodes/GuaranteeNode.ts +162 -0
  335. package/src/core/nodes/HttpRequestNode.ts +63 -0
  336. package/src/core/nodes/ImportNode.ts +75 -0
  337. package/src/core/nodes/LiteralNode.ts +67 -0
  338. package/src/core/nodes/MethodCallNode.ts +79 -0
  339. package/src/core/nodes/MethodNode.ts +78 -0
  340. package/src/core/nodes/ModuleNode.ts +74 -0
  341. package/src/core/nodes/NodeKind.ts +171 -0
  342. package/src/core/nodes/ParameterNode.ts +73 -0
  343. package/src/core/nodes/ScopeNode.ts +80 -0
  344. package/src/core/nodes/ServiceNode.ts +86 -0
  345. package/src/core/nodes/VariableDeclarationNode.ts +60 -0
  346. package/src/core/nodes/index.ts +49 -0
  347. package/src/index.ts +93 -0
  348. package/src/plugins/Plugin.ts +74 -0
  349. package/src/plugins/analysis/DatabaseAnalyzer.ts +322 -0
  350. package/src/plugins/analysis/ExpressAnalyzer.ts +401 -0
  351. package/src/plugins/analysis/ExpressRouteAnalyzer.ts +414 -0
  352. package/src/plugins/analysis/FetchAnalyzer.ts +441 -0
  353. package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +686 -0
  354. package/src/plugins/analysis/JSASTAnalyzer.ts +1680 -0
  355. package/src/plugins/analysis/ReactAnalyzer.ts +1368 -0
  356. package/src/plugins/analysis/RustAnalyzer.ts +438 -0
  357. package/src/plugins/analysis/SQLiteAnalyzer.ts +388 -0
  358. package/src/plugins/analysis/ServiceLayerAnalyzer.ts +429 -0
  359. package/src/plugins/analysis/SocketIOAnalyzer.ts +395 -0
  360. package/src/plugins/analysis/SystemDbAnalyzer.ts +284 -0
  361. package/src/plugins/analysis/ast/ConditionParser.ts +333 -0
  362. package/src/plugins/analysis/ast/ExpressionEvaluator.ts +117 -0
  363. package/src/plugins/analysis/ast/GraphBuilder.ts +1371 -0
  364. package/src/plugins/analysis/ast/OxcAdapter.ts +63 -0
  365. package/src/plugins/analysis/ast/types.ts +400 -0
  366. package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +137 -0
  367. package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +528 -0
  368. package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +339 -0
  369. package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +273 -0
  370. package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +259 -0
  371. package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +235 -0
  372. package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +268 -0
  373. package/src/plugins/analysis/ast/visitors/index.ts +36 -0
  374. package/src/plugins/discovery/DiscoveryPlugin.ts +50 -0
  375. package/src/plugins/discovery/MonorepoServiceDiscovery.ts +117 -0
  376. package/src/plugins/discovery/SimpleProjectDiscovery.ts +102 -0
  377. package/src/plugins/enrichment/AliasTracker.ts +399 -0
  378. package/src/plugins/enrichment/HTTPConnectionEnricher.ts +192 -0
  379. package/src/plugins/enrichment/ImportExportLinker.ts +221 -0
  380. package/src/plugins/enrichment/InstanceOfResolver.ts +165 -0
  381. package/src/plugins/enrichment/MethodCallResolver.ts +333 -0
  382. package/src/plugins/enrichment/MountPointResolver.ts +264 -0
  383. package/src/plugins/enrichment/PrefixEvaluator.ts +527 -0
  384. package/src/plugins/enrichment/RustFFIEnricher.ts +218 -0
  385. package/src/plugins/enrichment/ValueDomainAnalyzer.ts +682 -0
  386. package/src/plugins/indexing/IncrementalModuleIndexer.ts +287 -0
  387. package/src/plugins/indexing/JSModuleIndexer.ts +374 -0
  388. package/src/plugins/indexing/RustModuleIndexer.ts +160 -0
  389. package/src/plugins/indexing/ServiceDetector.ts +230 -0
  390. package/src/plugins/validation/CallResolverValidator.ts +170 -0
  391. package/src/plugins/validation/DataFlowValidator.ts +233 -0
  392. package/src/plugins/validation/EvalBanValidator.ts +175 -0
  393. package/src/plugins/validation/GraphConnectivityValidator.ts +201 -0
  394. package/src/plugins/validation/SQLInjectionValidator.ts +363 -0
  395. package/src/plugins/validation/ShadowingDetector.ts +173 -0
  396. package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +203 -0
  397. package/src/plugins/vcs/GitPlugin.ts +344 -0
  398. package/src/plugins/vcs/VCSPlugin.ts +190 -0
  399. package/src/plugins/vcs/index.ts +32 -0
  400. package/src/storage/backends/RFDBServerBackend.ts +687 -0
  401. package/src/storage/backends/typeValidation.ts +151 -0
  402. package/src/validation/PathValidator.ts +342 -0
@@ -0,0 +1,71 @@
1
+ /**
2
+ * ExportNode - contract for EXPORT node
3
+ */
4
+
5
+ import type { BaseNodeRecord } from '@grafema/types';
6
+
7
+ type ExportKind = 'value' | 'type';
8
+
9
+ interface ExportNodeRecord extends BaseNodeRecord {
10
+ type: 'EXPORT';
11
+ column: number;
12
+ exportKind: ExportKind;
13
+ local: string;
14
+ default: boolean;
15
+ }
16
+
17
+ interface ExportNodeOptions {
18
+ exportKind?: ExportKind;
19
+ local?: string;
20
+ default?: boolean;
21
+ }
22
+
23
+ export class ExportNode {
24
+ static readonly TYPE = 'EXPORT' as const;
25
+
26
+ static readonly REQUIRED = ['name', 'file', 'line'] as const;
27
+ static readonly OPTIONAL = ['column', 'exportKind', 'local', 'default'] as const;
28
+
29
+ static create(
30
+ name: string,
31
+ file: string,
32
+ line: number,
33
+ column: number,
34
+ options: ExportNodeOptions = {}
35
+ ): ExportNodeRecord {
36
+ if (!name) throw new Error('ExportNode.create: name is required');
37
+ if (!file) throw new Error('ExportNode.create: file is required');
38
+ if (!line) throw new Error('ExportNode.create: line is required');
39
+
40
+ return {
41
+ id: `${file}:EXPORT:${name}:${line}`,
42
+ type: this.TYPE,
43
+ name,
44
+ file,
45
+ line,
46
+ column: column || 0,
47
+ exportKind: options.exportKind || 'value',
48
+ local: options.local || name,
49
+ default: options.default || false
50
+ };
51
+ }
52
+
53
+ static validate(node: ExportNodeRecord): string[] {
54
+ const errors: string[] = [];
55
+
56
+ if (node.type !== this.TYPE) {
57
+ errors.push(`Expected type ${this.TYPE}, got ${node.type}`);
58
+ }
59
+
60
+ const nodeRecord = node as unknown as Record<string, unknown>;
61
+ for (const field of this.REQUIRED) {
62
+ if (!nodeRecord[field]) {
63
+ errors.push(`Missing required field: ${field}`);
64
+ }
65
+ }
66
+
67
+ return errors;
68
+ }
69
+ }
70
+
71
+ export type { ExportNodeRecord, ExportKind };
@@ -0,0 +1,36 @@
1
+ /**
2
+ * ExternalStdioNode - contract for EXTERNAL_STDIO node (singleton)
3
+ */
4
+
5
+ import type { BaseNodeRecord } from '@grafema/types';
6
+
7
+ interface ExternalStdioNodeRecord extends BaseNodeRecord {
8
+ type: 'EXTERNAL_STDIO';
9
+ }
10
+
11
+ export class ExternalStdioNode {
12
+ static readonly TYPE = 'EXTERNAL_STDIO' as const;
13
+ static readonly SINGLETON_ID = 'EXTERNAL_STDIO:__stdio__';
14
+
15
+ static readonly REQUIRED = ['name', 'file'] as const;
16
+ static readonly OPTIONAL = [] as const;
17
+
18
+ static create(): ExternalStdioNodeRecord {
19
+ return {
20
+ id: this.SINGLETON_ID,
21
+ type: this.TYPE,
22
+ name: '__stdio__',
23
+ file: '__builtin__',
24
+ line: 0
25
+ };
26
+ }
27
+
28
+ static validate(node: ExternalStdioNodeRecord): string[] {
29
+ const errors: string[] = [];
30
+ if (node.type !== this.TYPE) errors.push(`Expected type ${this.TYPE}`);
31
+ if (node.id !== this.SINGLETON_ID) errors.push(`Invalid singleton ID`);
32
+ return errors;
33
+ }
34
+ }
35
+
36
+ export type { ExternalStdioNodeRecord };
@@ -0,0 +1,78 @@
1
+ /**
2
+ * FunctionNode - contract for FUNCTION node
3
+ */
4
+
5
+ import type { FunctionNodeRecord } from '@grafema/types';
6
+
7
+ interface FunctionNodeOptions {
8
+ async?: boolean;
9
+ generator?: boolean;
10
+ exported?: boolean;
11
+ arrowFunction?: boolean;
12
+ parentScopeId?: string;
13
+ isClassMethod?: boolean;
14
+ className?: string;
15
+ params?: string[];
16
+ counter?: number;
17
+ }
18
+
19
+ export class FunctionNode {
20
+ static readonly TYPE = 'FUNCTION' as const;
21
+
22
+ static readonly REQUIRED = ['name', 'file', 'line', 'column'] as const;
23
+ static readonly OPTIONAL = ['async', 'generator', 'exported', 'arrowFunction', 'parentScopeId', 'isClassMethod', 'className', 'params'] as const;
24
+
25
+ /**
26
+ * Create FUNCTION node
27
+ */
28
+ static create(
29
+ name: string,
30
+ file: string,
31
+ line: number,
32
+ column: number,
33
+ options: FunctionNodeOptions = {}
34
+ ): FunctionNodeRecord {
35
+ if (!name) throw new Error('FunctionNode.create: name is required');
36
+ if (!file) throw new Error('FunctionNode.create: file is required');
37
+ if (line === undefined) throw new Error('FunctionNode.create: line is required');
38
+ if (column === undefined) throw new Error('FunctionNode.create: column is required');
39
+
40
+ const counter = options.counter !== undefined ? `:${options.counter}` : '';
41
+ const id = `${file}:FUNCTION:${name}:${line}:${column}${counter}`;
42
+
43
+ return {
44
+ id,
45
+ stableId: id,
46
+ type: this.TYPE,
47
+ name,
48
+ file,
49
+ line,
50
+ column,
51
+ async: options.async || false,
52
+ generator: options.generator || false,
53
+ exported: options.exported || false,
54
+ arrowFunction: options.arrowFunction || false,
55
+ parentScopeId: options.parentScopeId,
56
+ isClassMethod: options.isClassMethod || false,
57
+ className: options.className,
58
+ params: options.params || []
59
+ };
60
+ }
61
+
62
+ static validate(node: FunctionNodeRecord): string[] {
63
+ const errors: string[] = [];
64
+
65
+ if (node.type !== this.TYPE) {
66
+ errors.push(`Expected type ${this.TYPE}, got ${node.type}`);
67
+ }
68
+
69
+ const nodeRecord = node as unknown as Record<string, unknown>;
70
+ for (const field of this.REQUIRED) {
71
+ if (nodeRecord[field] === undefined || nodeRecord[field] === null) {
72
+ errors.push(`Missing required field: ${field}`);
73
+ }
74
+ }
75
+
76
+ return errors;
77
+ }
78
+ }
@@ -0,0 +1,162 @@
1
+ /**
2
+ * GuaranteeNode - contract for contract-based guarantee nodes
3
+ *
4
+ * Types: guarantee:queue, guarantee:api, guarantee:permission
5
+ * ID format: guarantee:queue#orders, guarantee:api#rate-limit
6
+ *
7
+ * Unlike Datalog-based GUARANTEE nodes (handled by GuaranteeManager),
8
+ * these nodes use JSON schema validation for contract verification.
9
+ */
10
+
11
+ import type { BaseNodeRecord } from '@grafema/types';
12
+ import { NAMESPACED_TYPE, isGuaranteeType } from './NodeKind.js';
13
+
14
+ // Re-export types from nodes.ts for convenience
15
+ export type GuaranteePriority = 'critical' | 'important' | 'observed' | 'tracked';
16
+ export type GuaranteeStatus = 'discovered' | 'reviewed' | 'active' | 'changing' | 'deprecated';
17
+ export type GuaranteeType = 'guarantee:queue' | 'guarantee:api' | 'guarantee:permission';
18
+
19
+ export interface GuaranteeNodeRecord extends BaseNodeRecord {
20
+ type: GuaranteeType;
21
+ priority: GuaranteePriority;
22
+ status: GuaranteeStatus;
23
+ owner?: string;
24
+ schema?: Record<string, unknown>;
25
+ condition?: string;
26
+ description?: string;
27
+ createdAt?: number;
28
+ updatedAt?: number;
29
+ }
30
+
31
+ export interface GuaranteeNodeOptions {
32
+ priority?: GuaranteePriority;
33
+ status?: GuaranteeStatus;
34
+ owner?: string;
35
+ schema?: Record<string, unknown>;
36
+ condition?: string;
37
+ description?: string;
38
+ }
39
+
40
+ // Valid guarantee namespaces
41
+ const GUARANTEE_NAMESPACES = ['queue', 'api', 'permission'] as const;
42
+ type GuaranteeNamespace = typeof GUARANTEE_NAMESPACES[number];
43
+
44
+ export class GuaranteeNode {
45
+ static readonly TYPE_QUEUE = NAMESPACED_TYPE.GUARANTEE_QUEUE;
46
+ static readonly TYPE_API = NAMESPACED_TYPE.GUARANTEE_API;
47
+ static readonly TYPE_PERMISSION = NAMESPACED_TYPE.GUARANTEE_PERMISSION;
48
+
49
+ static readonly REQUIRED = ['name', 'file', 'priority', 'status'] as const;
50
+ static readonly OPTIONAL = ['owner', 'schema', 'condition', 'description', 'createdAt', 'updatedAt'] as const;
51
+
52
+ /**
53
+ * Create guarantee node
54
+ * @param namespace - guarantee namespace (queue, api, permission)
55
+ * @param name - guarantee name (e.g., 'orders', 'rate-limit')
56
+ * @param options - optional fields
57
+ */
58
+ static create(
59
+ namespace: GuaranteeNamespace,
60
+ name: string,
61
+ options: GuaranteeNodeOptions = {}
62
+ ): GuaranteeNodeRecord {
63
+ if (!namespace) throw new Error('GuaranteeNode.create: namespace is required');
64
+ if (!name) throw new Error('GuaranteeNode.create: name is required');
65
+ if (!GUARANTEE_NAMESPACES.includes(namespace)) {
66
+ throw new Error(`GuaranteeNode.create: invalid namespace "${namespace}". Valid: ${GUARANTEE_NAMESPACES.join(', ')}`);
67
+ }
68
+
69
+ const type = `guarantee:${namespace}` as GuaranteeType;
70
+ const id = `${type}#${name}`;
71
+ const now = Date.now();
72
+
73
+ return {
74
+ id,
75
+ type,
76
+ name,
77
+ file: '', // Guarantees don't have a source file
78
+ line: undefined,
79
+ priority: options.priority || 'observed',
80
+ status: options.status || 'discovered',
81
+ owner: options.owner,
82
+ schema: options.schema,
83
+ condition: options.condition,
84
+ description: options.description,
85
+ createdAt: now,
86
+ updatedAt: now,
87
+ };
88
+ }
89
+
90
+ /**
91
+ * Validate guarantee node
92
+ * @returns array of error messages, empty if valid
93
+ */
94
+ static validate(node: GuaranteeNodeRecord): string[] {
95
+ const errors: string[] = [];
96
+
97
+ if (!isGuaranteeType(node.type)) {
98
+ errors.push(`Expected guarantee:* type, got ${node.type}`);
99
+ }
100
+
101
+ if (!node.name) {
102
+ errors.push('Missing required field: name');
103
+ }
104
+
105
+ if (!node.priority) {
106
+ errors.push('Missing required field: priority');
107
+ } else if (!['critical', 'important', 'observed', 'tracked'].includes(node.priority)) {
108
+ errors.push(`Invalid priority: ${node.priority}. Valid: critical, important, observed, tracked`);
109
+ }
110
+
111
+ if (!node.status) {
112
+ errors.push('Missing required field: status');
113
+ } else if (!['discovered', 'reviewed', 'active', 'changing', 'deprecated'].includes(node.status)) {
114
+ errors.push(`Invalid status: ${node.status}. Valid: discovered, reviewed, active, changing, deprecated`);
115
+ }
116
+
117
+ return errors;
118
+ }
119
+
120
+ /**
121
+ * Parse guarantee ID into components
122
+ * @param id - full ID (e.g., 'guarantee:queue#orders')
123
+ * @returns { namespace, name } or null if invalid
124
+ */
125
+ static parseId(id: string): { namespace: GuaranteeNamespace; name: string } | null {
126
+ if (!id) return null;
127
+
128
+ // Format: guarantee:namespace#name
129
+ const match = id.match(/^guarantee:(queue|api|permission)#(.+)$/);
130
+ if (!match) return null;
131
+
132
+ return {
133
+ namespace: match[1] as GuaranteeNamespace,
134
+ name: match[2],
135
+ };
136
+ }
137
+
138
+ /**
139
+ * Build ID from components
140
+ */
141
+ static buildId(namespace: GuaranteeNamespace, name: string): string {
142
+ return `guarantee:${namespace}#${name}`;
143
+ }
144
+
145
+ /**
146
+ * Check if node type is a guarantee type
147
+ */
148
+ static isGuaranteeType(type: string): boolean {
149
+ return isGuaranteeType(type);
150
+ }
151
+
152
+ /**
153
+ * Get all valid guarantee types
154
+ */
155
+ static getTypes(): GuaranteeType[] {
156
+ return [
157
+ NAMESPACED_TYPE.GUARANTEE_QUEUE,
158
+ NAMESPACED_TYPE.GUARANTEE_API,
159
+ NAMESPACED_TYPE.GUARANTEE_PERMISSION,
160
+ ];
161
+ }
162
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * HttpRequestNode - contract for HTTP_REQUEST node
3
+ */
4
+
5
+ import type { BaseNodeRecord } from '@grafema/types';
6
+
7
+ interface HttpRequestNodeRecord extends BaseNodeRecord {
8
+ type: 'HTTP_REQUEST';
9
+ url?: string;
10
+ method: string;
11
+ parentScopeId?: string;
12
+ }
13
+
14
+ interface HttpRequestNodeOptions {
15
+ column?: number;
16
+ parentScopeId?: string;
17
+ counter?: number;
18
+ }
19
+
20
+ export class HttpRequestNode {
21
+ static readonly TYPE = 'HTTP_REQUEST' as const;
22
+
23
+ static readonly REQUIRED = ['name', 'file', 'line'] as const;
24
+ static readonly OPTIONAL = ['url', 'method', 'column', 'parentScopeId'] as const;
25
+
26
+ static create(
27
+ url: string | undefined,
28
+ method: string | undefined,
29
+ file: string,
30
+ line: number,
31
+ options: HttpRequestNodeOptions = {}
32
+ ): HttpRequestNodeRecord {
33
+ if (!file) throw new Error('HttpRequestNode.create: file is required');
34
+ if (line === undefined) throw new Error('HttpRequestNode.create: line is required');
35
+
36
+ const httpMethod = method || 'GET';
37
+ const counter = options.counter !== undefined ? `:${options.counter}` : '';
38
+ const id = `${file}:HTTP_REQUEST:${httpMethod}:${line}:${options.column || 0}${counter}`;
39
+
40
+ return {
41
+ id,
42
+ type: this.TYPE,
43
+ name: `${httpMethod} ${url || 'dynamic'}`,
44
+ url,
45
+ method: httpMethod,
46
+ file,
47
+ line,
48
+ parentScopeId: options.parentScopeId
49
+ };
50
+ }
51
+
52
+ static validate(node: HttpRequestNodeRecord): string[] {
53
+ const errors: string[] = [];
54
+ if (node.type !== this.TYPE) errors.push(`Expected type ${this.TYPE}`);
55
+ const nodeRecord = node as unknown as Record<string, unknown>;
56
+ for (const field of this.REQUIRED) {
57
+ if (nodeRecord[field] === undefined) errors.push(`Missing: ${field}`);
58
+ }
59
+ return errors;
60
+ }
61
+ }
62
+
63
+ export type { HttpRequestNodeRecord };
@@ -0,0 +1,75 @@
1
+ /**
2
+ * ImportNode - contract for IMPORT node
3
+ */
4
+
5
+ import type { BaseNodeRecord } from '@grafema/types';
6
+
7
+ type ImportKind = 'value' | 'type' | 'typeof';
8
+
9
+ interface ImportNodeRecord extends BaseNodeRecord {
10
+ type: 'IMPORT';
11
+ column: number;
12
+ source: string;
13
+ importKind: ImportKind;
14
+ imported: string;
15
+ local: string;
16
+ }
17
+
18
+ interface ImportNodeOptions {
19
+ importKind?: ImportKind;
20
+ imported?: string;
21
+ local?: string;
22
+ }
23
+
24
+ export class ImportNode {
25
+ static readonly TYPE = 'IMPORT' as const;
26
+
27
+ static readonly REQUIRED = ['name', 'file', 'line', 'source'] as const;
28
+ static readonly OPTIONAL = ['column', 'importKind', 'imported', 'local'] as const;
29
+
30
+ static create(
31
+ name: string,
32
+ file: string,
33
+ line: number,
34
+ column: number,
35
+ source: string,
36
+ options: ImportNodeOptions = {}
37
+ ): ImportNodeRecord {
38
+ if (!name) throw new Error('ImportNode.create: name is required');
39
+ if (!file) throw new Error('ImportNode.create: file is required');
40
+ if (!line) throw new Error('ImportNode.create: line is required');
41
+ if (!source) throw new Error('ImportNode.create: source is required');
42
+
43
+ return {
44
+ id: `${file}:IMPORT:${name}:${line}`,
45
+ type: this.TYPE,
46
+ name,
47
+ file,
48
+ line,
49
+ column: column || 0,
50
+ source,
51
+ importKind: options.importKind || 'value',
52
+ imported: options.imported || name,
53
+ local: options.local || name
54
+ };
55
+ }
56
+
57
+ static validate(node: ImportNodeRecord): string[] {
58
+ const errors: string[] = [];
59
+
60
+ if (node.type !== this.TYPE) {
61
+ errors.push(`Expected type ${this.TYPE}, got ${node.type}`);
62
+ }
63
+
64
+ const nodeRecord = node as unknown as Record<string, unknown>;
65
+ for (const field of this.REQUIRED) {
66
+ if (!nodeRecord[field]) {
67
+ errors.push(`Missing required field: ${field}`);
68
+ }
69
+ }
70
+
71
+ return errors;
72
+ }
73
+ }
74
+
75
+ export type { ImportNodeRecord, ImportKind };
@@ -0,0 +1,67 @@
1
+ /**
2
+ * LiteralNode - contract for LITERAL node
3
+ */
4
+
5
+ import type { BaseNodeRecord } from '@grafema/types';
6
+
7
+ interface LiteralNodeRecord extends BaseNodeRecord {
8
+ type: 'LITERAL';
9
+ value: unknown;
10
+ valueType: string;
11
+ column: number;
12
+ parentCallId?: string;
13
+ argIndex?: number;
14
+ }
15
+
16
+ interface LiteralNodeOptions {
17
+ parentCallId?: string;
18
+ argIndex?: number;
19
+ counter?: number;
20
+ }
21
+
22
+ export class LiteralNode {
23
+ static readonly TYPE = 'LITERAL' as const;
24
+
25
+ static readonly REQUIRED = ['file', 'line'] as const;
26
+ static readonly OPTIONAL = ['value', 'valueType', 'column', 'parentCallId', 'argIndex'] as const;
27
+
28
+ static create(
29
+ value: unknown,
30
+ file: string,
31
+ line: number,
32
+ column: number,
33
+ options: LiteralNodeOptions = {}
34
+ ): LiteralNodeRecord {
35
+ if (!file) throw new Error('LiteralNode.create: file is required');
36
+ if (line === undefined) throw new Error('LiteralNode.create: line is required');
37
+
38
+ const counter = options.counter !== undefined ? `:${options.counter}` : '';
39
+ const argIndex = options.argIndex !== undefined ? `arg${options.argIndex}` : 'value';
40
+ const id = `${file}:LITERAL:${argIndex}:${line}:${column || 0}${counter}`;
41
+
42
+ return {
43
+ id,
44
+ type: this.TYPE,
45
+ name: file,
46
+ value,
47
+ valueType: typeof value,
48
+ file,
49
+ line,
50
+ column: column || 0,
51
+ parentCallId: options.parentCallId,
52
+ argIndex: options.argIndex
53
+ };
54
+ }
55
+
56
+ static validate(node: LiteralNodeRecord): string[] {
57
+ const errors: string[] = [];
58
+ if (node.type !== this.TYPE) errors.push(`Expected type ${this.TYPE}`);
59
+ const nodeRecord = node as unknown as Record<string, unknown>;
60
+ for (const field of this.REQUIRED) {
61
+ if (nodeRecord[field] === undefined) errors.push(`Missing: ${field}`);
62
+ }
63
+ return errors;
64
+ }
65
+ }
66
+
67
+ export type { LiteralNodeRecord };
@@ -0,0 +1,79 @@
1
+ /**
2
+ * MethodCallNode - contract for METHOD_CALL node
3
+ */
4
+
5
+ import type { BaseNodeRecord } from '@grafema/types';
6
+
7
+ interface MethodCallNodeRecord extends BaseNodeRecord {
8
+ type: 'METHOD_CALL';
9
+ object?: string;
10
+ method: string;
11
+ column: number;
12
+ parentScopeId?: string;
13
+ args: unknown[];
14
+ }
15
+
16
+ interface MethodCallNodeOptions {
17
+ parentScopeId?: string;
18
+ args?: unknown[];
19
+ counter?: number;
20
+ }
21
+
22
+ export class MethodCallNode {
23
+ static readonly TYPE = 'METHOD_CALL' as const;
24
+
25
+ static readonly REQUIRED = ['name', 'file', 'line', 'args'] as const;
26
+ static readonly OPTIONAL = ['object', 'method', 'column', 'parentScopeId'] as const;
27
+
28
+ /**
29
+ * Create METHOD_CALL node
30
+ */
31
+ static create(
32
+ objectName: string | undefined,
33
+ methodName: string,
34
+ file: string,
35
+ line: number,
36
+ column: number,
37
+ options: MethodCallNodeOptions = {}
38
+ ): MethodCallNodeRecord {
39
+ if (!methodName) throw new Error('MethodCallNode.create: methodName is required');
40
+ if (!file) throw new Error('MethodCallNode.create: file is required');
41
+ if (line === undefined) throw new Error('MethodCallNode.create: line is required');
42
+
43
+ const fullName = objectName ? `${objectName}.${methodName}` : methodName;
44
+ const counter = options.counter !== undefined ? `:${options.counter}` : '';
45
+ const id = `${file}:METHOD_CALL:${fullName}:${line}:${column || 0}${counter}`;
46
+
47
+ return {
48
+ id,
49
+ type: this.TYPE,
50
+ name: fullName,
51
+ object: objectName,
52
+ method: methodName,
53
+ file,
54
+ line,
55
+ column: column || 0,
56
+ parentScopeId: options.parentScopeId,
57
+ args: options.args || []
58
+ };
59
+ }
60
+
61
+ static validate(node: MethodCallNodeRecord): string[] {
62
+ const errors: string[] = [];
63
+
64
+ if (node.type !== this.TYPE) {
65
+ errors.push(`Expected type ${this.TYPE}, got ${node.type}`);
66
+ }
67
+
68
+ const nodeRecord = node as unknown as Record<string, unknown>;
69
+ for (const field of this.REQUIRED) {
70
+ if (nodeRecord[field] === undefined || nodeRecord[field] === null) {
71
+ errors.push(`Missing required field: ${field}`);
72
+ }
73
+ }
74
+
75
+ return errors;
76
+ }
77
+ }
78
+
79
+ export type { MethodCallNodeRecord };