@grafema/core 0.1.1-alpha → 0.2.1-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 (319) hide show
  1. package/dist/Orchestrator.d.ts +7 -0
  2. package/dist/Orchestrator.d.ts.map +1 -1
  3. package/dist/Orchestrator.js +25 -3
  4. package/dist/config/ConfigLoader.d.ts +18 -0
  5. package/dist/config/ConfigLoader.d.ts.map +1 -1
  6. package/dist/config/ConfigLoader.js +65 -3
  7. package/dist/core/FileExplainer.d.ts +101 -0
  8. package/dist/core/FileExplainer.d.ts.map +1 -0
  9. package/dist/core/FileExplainer.js +139 -0
  10. package/dist/core/NodeFactory.d.ts +44 -5
  11. package/dist/core/NodeFactory.d.ts.map +1 -1
  12. package/dist/core/NodeFactory.js +52 -7
  13. package/dist/core/nodes/ArrayLiteralNode.d.ts.map +1 -1
  14. package/dist/core/nodes/ArrayLiteralNode.js +4 -2
  15. package/dist/core/nodes/BranchNode.d.ts +41 -0
  16. package/dist/core/nodes/BranchNode.d.ts.map +1 -0
  17. package/dist/core/nodes/BranchNode.js +82 -0
  18. package/dist/core/nodes/CallSiteNode.d.ts +2 -2
  19. package/dist/core/nodes/CallSiteNode.d.ts.map +1 -1
  20. package/dist/core/nodes/CallSiteNode.js +9 -5
  21. package/dist/core/nodes/CaseNode.d.ts +43 -0
  22. package/dist/core/nodes/CaseNode.d.ts.map +1 -0
  23. package/dist/core/nodes/CaseNode.js +81 -0
  24. package/dist/core/nodes/ClassNode.d.ts +2 -2
  25. package/dist/core/nodes/ClassNode.d.ts.map +1 -1
  26. package/dist/core/nodes/ClassNode.js +8 -4
  27. package/dist/core/nodes/ConstantNode.d.ts +2 -2
  28. package/dist/core/nodes/ConstantNode.d.ts.map +1 -1
  29. package/dist/core/nodes/ConstantNode.js +6 -4
  30. package/dist/core/nodes/ConstructorCallNode.d.ts +51 -0
  31. package/dist/core/nodes/ConstructorCallNode.d.ts.map +1 -0
  32. package/dist/core/nodes/ConstructorCallNode.js +171 -0
  33. package/dist/core/nodes/DatabaseQueryNode.d.ts +3 -2
  34. package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -1
  35. package/dist/core/nodes/DatabaseQueryNode.js +5 -2
  36. package/dist/core/nodes/DecoratorNode.d.ts +2 -2
  37. package/dist/core/nodes/DecoratorNode.d.ts.map +1 -1
  38. package/dist/core/nodes/DecoratorNode.js +5 -3
  39. package/dist/core/nodes/EnumNode.d.ts +2 -2
  40. package/dist/core/nodes/EnumNode.d.ts.map +1 -1
  41. package/dist/core/nodes/EnumNode.js +5 -3
  42. package/dist/core/nodes/EventListenerNode.d.ts +4 -4
  43. package/dist/core/nodes/EventListenerNode.d.ts.map +1 -1
  44. package/dist/core/nodes/EventListenerNode.js +7 -4
  45. package/dist/core/nodes/ExportNode.d.ts +2 -2
  46. package/dist/core/nodes/ExportNode.d.ts.map +1 -1
  47. package/dist/core/nodes/ExportNode.js +8 -4
  48. package/dist/core/nodes/ExpressionNode.d.ts +2 -2
  49. package/dist/core/nodes/ExpressionNode.d.ts.map +1 -1
  50. package/dist/core/nodes/ExpressionNode.js +6 -4
  51. package/dist/core/nodes/ExternalModuleNode.d.ts +4 -0
  52. package/dist/core/nodes/ExternalModuleNode.d.ts.map +1 -1
  53. package/dist/core/nodes/ExternalModuleNode.js +10 -2
  54. package/dist/core/nodes/HttpRequestNode.d.ts +4 -4
  55. package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -1
  56. package/dist/core/nodes/HttpRequestNode.js +7 -4
  57. package/dist/core/nodes/ImportNode.d.ts +10 -2
  58. package/dist/core/nodes/ImportNode.d.ts.map +1 -1
  59. package/dist/core/nodes/ImportNode.js +21 -4
  60. package/dist/core/nodes/InterfaceNode.d.ts +2 -2
  61. package/dist/core/nodes/InterfaceNode.d.ts.map +1 -1
  62. package/dist/core/nodes/InterfaceNode.js +5 -3
  63. package/dist/core/nodes/LiteralNode.d.ts +2 -2
  64. package/dist/core/nodes/LiteralNode.d.ts.map +1 -1
  65. package/dist/core/nodes/LiteralNode.js +6 -4
  66. package/dist/core/nodes/MethodCallNode.d.ts +2 -2
  67. package/dist/core/nodes/MethodCallNode.d.ts.map +1 -1
  68. package/dist/core/nodes/MethodCallNode.js +9 -5
  69. package/dist/core/nodes/MethodNode.d.ts +2 -2
  70. package/dist/core/nodes/MethodNode.d.ts.map +1 -1
  71. package/dist/core/nodes/MethodNode.js +8 -4
  72. package/dist/core/nodes/ObjectLiteralNode.d.ts.map +1 -1
  73. package/dist/core/nodes/ObjectLiteralNode.js +4 -2
  74. package/dist/core/nodes/ParameterNode.d.ts +2 -2
  75. package/dist/core/nodes/ParameterNode.d.ts.map +1 -1
  76. package/dist/core/nodes/ParameterNode.js +5 -3
  77. package/dist/core/nodes/TypeNode.d.ts +2 -2
  78. package/dist/core/nodes/TypeNode.d.ts.map +1 -1
  79. package/dist/core/nodes/TypeNode.js +5 -3
  80. package/dist/core/nodes/VariableDeclarationNode.d.ts +2 -2
  81. package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -1
  82. package/dist/core/nodes/VariableDeclarationNode.js +9 -5
  83. package/dist/core/nodes/index.d.ts +3 -0
  84. package/dist/core/nodes/index.d.ts.map +1 -1
  85. package/dist/core/nodes/index.js +3 -0
  86. package/dist/data/builtins/BuiltinRegistry.d.ts +78 -0
  87. package/dist/data/builtins/BuiltinRegistry.d.ts.map +1 -0
  88. package/dist/data/builtins/BuiltinRegistry.js +110 -0
  89. package/dist/data/builtins/definitions.d.ts +28 -0
  90. package/dist/data/builtins/definitions.d.ts.map +1 -0
  91. package/dist/data/builtins/definitions.js +250 -0
  92. package/dist/data/builtins/index.d.ts +10 -0
  93. package/dist/data/builtins/index.d.ts.map +1 -0
  94. package/dist/data/builtins/index.js +8 -0
  95. package/dist/data/builtins/jsGlobals.d.ts +18 -0
  96. package/dist/data/builtins/jsGlobals.d.ts.map +1 -0
  97. package/dist/data/builtins/jsGlobals.js +26 -0
  98. package/dist/data/builtins/types.d.ts +34 -0
  99. package/dist/data/builtins/types.d.ts.map +1 -0
  100. package/dist/data/builtins/types.js +7 -0
  101. package/dist/data/globals/definitions.d.ts +27 -0
  102. package/dist/data/globals/definitions.d.ts.map +1 -0
  103. package/dist/data/globals/definitions.js +117 -0
  104. package/dist/data/globals/index.d.ts +36 -0
  105. package/dist/data/globals/index.d.ts.map +1 -0
  106. package/dist/data/globals/index.js +52 -0
  107. package/dist/diagnostics/DiagnosticReporter.d.ts +23 -0
  108. package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -1
  109. package/dist/diagnostics/DiagnosticReporter.js +88 -0
  110. package/dist/diagnostics/index.d.ts +1 -1
  111. package/dist/diagnostics/index.d.ts.map +1 -1
  112. package/dist/errors/GrafemaError.d.ts +43 -0
  113. package/dist/errors/GrafemaError.d.ts.map +1 -1
  114. package/dist/errors/GrafemaError.js +50 -0
  115. package/dist/index.d.ts +17 -1
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +17 -1
  118. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -1
  119. package/dist/plugins/analysis/DatabaseAnalyzer.js +3 -2
  120. package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -1
  121. package/dist/plugins/analysis/ExpressAnalyzer.js +3 -1
  122. package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts +148 -0
  123. package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts.map +1 -0
  124. package/dist/plugins/analysis/ExpressResponseAnalyzer.js +495 -0
  125. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -1
  126. package/dist/plugins/analysis/ExpressRouteAnalyzer.js +53 -18
  127. package/dist/plugins/analysis/FetchAnalyzer.d.ts +40 -0
  128. package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -1
  129. package/dist/plugins/analysis/FetchAnalyzer.js +163 -15
  130. package/dist/plugins/analysis/JSASTAnalyzer.d.ts +157 -26
  131. package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -1
  132. package/dist/plugins/analysis/JSASTAnalyzer.js +2418 -191
  133. package/dist/plugins/analysis/RustAnalyzer.js +4 -4
  134. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -1
  135. package/dist/plugins/analysis/SQLiteAnalyzer.js +4 -2
  136. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +9 -0
  137. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -1
  138. package/dist/plugins/analysis/SocketIOAnalyzer.js +91 -7
  139. package/dist/plugins/analysis/ast/GraphBuilder.d.ts +173 -0
  140. package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -1
  141. package/dist/plugins/analysis/ast/GraphBuilder.js +1256 -65
  142. package/dist/plugins/analysis/ast/types.d.ts +294 -0
  143. package/dist/plugins/analysis/ast/types.d.ts.map +1 -1
  144. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +5 -1
  145. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -1
  146. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +1 -0
  147. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -1
  148. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +12 -1
  149. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +10 -0
  150. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -1
  151. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +62 -0
  152. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +4 -0
  153. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -1
  154. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +101 -0
  155. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +16 -1
  156. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -1
  157. package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +233 -39
  158. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts.map +1 -1
  159. package/dist/plugins/discovery/WorkspaceDiscovery.js +9 -4
  160. package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -1
  161. package/dist/plugins/enrichment/AliasTracker.js +16 -1
  162. package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts +32 -0
  163. package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts.map +1 -0
  164. package/dist/plugins/enrichment/ArgumentParameterLinker.js +175 -0
  165. package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts +51 -0
  166. package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts.map +1 -0
  167. package/dist/plugins/enrichment/ClosureCaptureEnricher.js +205 -0
  168. package/dist/plugins/enrichment/ExternalCallResolver.d.ts +42 -0
  169. package/dist/plugins/enrichment/ExternalCallResolver.d.ts.map +1 -0
  170. package/dist/plugins/enrichment/ExternalCallResolver.js +213 -0
  171. package/dist/plugins/enrichment/FunctionCallResolver.d.ts +58 -0
  172. package/dist/plugins/enrichment/FunctionCallResolver.d.ts.map +1 -0
  173. package/dist/plugins/enrichment/FunctionCallResolver.js +340 -0
  174. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +16 -3
  175. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -1
  176. package/dist/plugins/enrichment/HTTPConnectionEnricher.js +64 -20
  177. package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -1
  178. package/dist/plugins/enrichment/MethodCallResolver.js +15 -1
  179. package/dist/plugins/enrichment/MountPointResolver.d.ts +14 -12
  180. package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -1
  181. package/dist/plugins/enrichment/MountPointResolver.js +172 -151
  182. package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts +44 -0
  183. package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts.map +1 -0
  184. package/dist/plugins/enrichment/NodejsBuiltinsResolver.js +271 -0
  185. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +5 -27
  186. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -1
  187. package/dist/plugins/enrichment/ValueDomainAnalyzer.js +62 -139
  188. package/dist/plugins/indexing/JSModuleIndexer.d.ts +15 -0
  189. package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -1
  190. package/dist/plugins/indexing/JSModuleIndexer.js +58 -0
  191. package/dist/plugins/indexing/RustModuleIndexer.d.ts +1 -1
  192. package/dist/plugins/indexing/RustModuleIndexer.js +4 -4
  193. package/dist/plugins/validation/BrokenImportValidator.d.ts +31 -0
  194. package/dist/plugins/validation/BrokenImportValidator.d.ts.map +1 -0
  195. package/dist/plugins/validation/BrokenImportValidator.js +249 -0
  196. package/dist/plugins/validation/CallResolverValidator.d.ts +21 -10
  197. package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -1
  198. package/dist/plugins/validation/CallResolverValidator.js +101 -76
  199. package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -1
  200. package/dist/plugins/validation/DataFlowValidator.js +49 -41
  201. package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -1
  202. package/dist/plugins/validation/GraphConnectivityValidator.js +25 -1
  203. package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -1
  204. package/dist/plugins/validation/SQLInjectionValidator.js +2 -3
  205. package/dist/queries/findCallsInFunction.d.ts +52 -0
  206. package/dist/queries/findCallsInFunction.d.ts.map +1 -0
  207. package/dist/queries/findCallsInFunction.js +135 -0
  208. package/dist/queries/findContainingFunction.d.ts +45 -0
  209. package/dist/queries/findContainingFunction.d.ts.map +1 -0
  210. package/dist/queries/findContainingFunction.js +54 -0
  211. package/dist/queries/index.d.ts +14 -0
  212. package/dist/queries/index.d.ts.map +1 -0
  213. package/dist/queries/index.js +11 -0
  214. package/dist/queries/traceValues.d.ts +70 -0
  215. package/dist/queries/traceValues.d.ts.map +1 -0
  216. package/dist/queries/traceValues.js +299 -0
  217. package/dist/queries/types.d.ts +163 -0
  218. package/dist/queries/types.d.ts.map +1 -0
  219. package/dist/queries/types.js +9 -0
  220. package/dist/schema/GraphSchemaExtractor.d.ts +53 -0
  221. package/dist/schema/GraphSchemaExtractor.d.ts.map +1 -0
  222. package/dist/schema/GraphSchemaExtractor.js +124 -0
  223. package/dist/schema/InterfaceSchemaExtractor.d.ts +73 -0
  224. package/dist/schema/InterfaceSchemaExtractor.d.ts.map +1 -0
  225. package/dist/schema/InterfaceSchemaExtractor.js +112 -0
  226. package/dist/schema/index.d.ts +5 -0
  227. package/dist/schema/index.d.ts.map +1 -0
  228. package/dist/schema/index.js +2 -0
  229. package/dist/storage/backends/RFDBServerBackend.d.ts +13 -18
  230. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -1
  231. package/dist/storage/backends/RFDBServerBackend.js +47 -51
  232. package/dist/storage/backends/typeValidation.d.ts.map +1 -1
  233. package/dist/storage/backends/typeValidation.js +1 -0
  234. package/package.json +3 -3
  235. package/src/Orchestrator.ts +35 -3
  236. package/src/config/ConfigLoader.ts +94 -3
  237. package/src/core/FileExplainer.ts +179 -0
  238. package/src/core/NodeFactory.ts +72 -8
  239. package/src/core/nodes/ArrayLiteralNode.ts +3 -2
  240. package/src/core/nodes/BranchNode.ts +113 -0
  241. package/src/core/nodes/CallSiteNode.ts +7 -5
  242. package/src/core/nodes/CaseNode.ts +123 -0
  243. package/src/core/nodes/ClassNode.ts +6 -4
  244. package/src/core/nodes/ConstantNode.ts +5 -4
  245. package/src/core/nodes/ConstructorCallNode.ts +217 -0
  246. package/src/core/nodes/DatabaseQueryNode.ts +5 -1
  247. package/src/core/nodes/DecoratorNode.ts +4 -3
  248. package/src/core/nodes/EnumNode.ts +4 -3
  249. package/src/core/nodes/EventListenerNode.ts +7 -4
  250. package/src/core/nodes/ExportNode.ts +6 -4
  251. package/src/core/nodes/ExpressionNode.ts +5 -4
  252. package/src/core/nodes/ExternalModuleNode.ts +11 -2
  253. package/src/core/nodes/HttpRequestNode.ts +7 -4
  254. package/src/core/nodes/ImportNode.ts +31 -4
  255. package/src/core/nodes/InterfaceNode.ts +4 -3
  256. package/src/core/nodes/LiteralNode.ts +5 -4
  257. package/src/core/nodes/MethodCallNode.ts +7 -5
  258. package/src/core/nodes/MethodNode.ts +6 -4
  259. package/src/core/nodes/ObjectLiteralNode.ts +3 -2
  260. package/src/core/nodes/ParameterNode.ts +4 -3
  261. package/src/core/nodes/TypeNode.ts +4 -3
  262. package/src/core/nodes/VariableDeclarationNode.ts +7 -5
  263. package/src/core/nodes/index.ts +3 -0
  264. package/src/data/builtins/BuiltinRegistry.ts +124 -0
  265. package/src/data/builtins/definitions.ts +267 -0
  266. package/src/data/builtins/index.ts +10 -0
  267. package/src/data/builtins/jsGlobals.ts +28 -0
  268. package/src/data/builtins/types.ts +36 -0
  269. package/src/data/globals/definitions.ts +156 -0
  270. package/src/data/globals/index.ts +66 -0
  271. package/src/diagnostics/DiagnosticReporter.ts +120 -0
  272. package/src/diagnostics/index.ts +1 -1
  273. package/src/errors/GrafemaError.ts +65 -0
  274. package/src/index.ts +45 -0
  275. package/src/plugins/analysis/DatabaseAnalyzer.ts +4 -2
  276. package/src/plugins/analysis/ExpressAnalyzer.ts +5 -1
  277. package/src/plugins/analysis/ExpressResponseAnalyzer.ts +636 -0
  278. package/src/plugins/analysis/ExpressRouteAnalyzer.ts +57 -18
  279. package/src/plugins/analysis/FetchAnalyzer.ts +204 -16
  280. package/src/plugins/analysis/JSASTAnalyzer.ts +2958 -260
  281. package/src/plugins/analysis/RustAnalyzer.ts +4 -4
  282. package/src/plugins/analysis/SQLiteAnalyzer.ts +5 -2
  283. package/src/plugins/analysis/SocketIOAnalyzer.ts +121 -7
  284. package/src/plugins/analysis/ast/GraphBuilder.ts +1578 -70
  285. package/src/plugins/analysis/ast/types.ts +387 -0
  286. package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +8 -0
  287. package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +16 -1
  288. package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +77 -2
  289. package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +112 -1
  290. package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +272 -47
  291. package/src/plugins/discovery/WorkspaceDiscovery.ts +11 -4
  292. package/src/plugins/enrichment/AliasTracker.ts +22 -1
  293. package/src/plugins/enrichment/ArgumentParameterLinker.ts +240 -0
  294. package/src/plugins/enrichment/ClosureCaptureEnricher.ts +267 -0
  295. package/src/plugins/enrichment/ExternalCallResolver.ts +262 -0
  296. package/src/plugins/enrichment/FunctionCallResolver.ts +456 -0
  297. package/src/plugins/enrichment/HTTPConnectionEnricher.ts +70 -20
  298. package/src/plugins/enrichment/MethodCallResolver.ts +21 -1
  299. package/src/plugins/enrichment/MountPointResolver.ts +206 -198
  300. package/src/plugins/enrichment/NodejsBuiltinsResolver.ts +365 -0
  301. package/src/plugins/enrichment/ValueDomainAnalyzer.ts +67 -184
  302. package/src/plugins/indexing/JSModuleIndexer.ts +66 -0
  303. package/src/plugins/indexing/RustModuleIndexer.ts +4 -4
  304. package/src/plugins/validation/BrokenImportValidator.ts +325 -0
  305. package/src/plugins/validation/CallResolverValidator.ts +129 -109
  306. package/src/plugins/validation/DataFlowValidator.ts +75 -58
  307. package/src/plugins/validation/GraphConnectivityValidator.ts +39 -1
  308. package/src/plugins/validation/SQLInjectionValidator.ts +2 -5
  309. package/src/queries/README.md +46 -0
  310. package/src/queries/findCallsInFunction.ts +206 -0
  311. package/src/queries/findContainingFunction.ts +83 -0
  312. package/src/queries/index.ts +23 -0
  313. package/src/queries/traceValues.ts +398 -0
  314. package/src/queries/types.ts +187 -0
  315. package/src/schema/GraphSchemaExtractor.ts +177 -0
  316. package/src/schema/InterfaceSchemaExtractor.ts +173 -0
  317. package/src/schema/index.ts +5 -0
  318. package/src/storage/backends/RFDBServerBackend.ts +64 -68
  319. package/src/storage/backends/typeValidation.ts +1 -0
@@ -6,6 +6,7 @@
6
6
  import { readFileSync, existsSync } from 'fs';
7
7
  import { join, resolve, dirname, relative, basename } from 'path';
8
8
  import { createHash } from 'crypto';
9
+ import { minimatch } from 'minimatch';
9
10
  import { Plugin, createErrorResult } from '../Plugin.js';
10
11
  import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
11
12
  // @ts-expect-error - no type declarations for node-source-walk
@@ -76,6 +77,10 @@ export class JSModuleIndexer extends Plugin {
76
77
  private cache: Map<string, string[] | Error>;
77
78
  private testPatterns: RegExp[];
78
79
  private markTestFiles: boolean;
80
+ // Include/exclude pattern filtering (REG-185)
81
+ private includePatterns?: string[];
82
+ private excludePatterns?: string[];
83
+ private projectPath: string = '';
79
84
 
80
85
  constructor() {
81
86
  super();
@@ -95,6 +100,43 @@ export class JSModuleIndexer extends Plugin {
95
100
  return this.testPatterns.some(pattern => pattern.test(filePath));
96
101
  }
97
102
 
103
+ /**
104
+ * Check if a file should be skipped based on include/exclude patterns.
105
+ *
106
+ * Logic:
107
+ * 1. If file matches any exclude pattern -> SKIP
108
+ * 2. If include patterns specified AND file doesn't match any -> SKIP
109
+ * 3. Otherwise -> PROCESS
110
+ *
111
+ * @param absolutePath - Absolute path to the file
112
+ * @returns true if file should be skipped, false if it should be processed
113
+ */
114
+ private shouldSkipFile(absolutePath: string): boolean {
115
+ // Normalize to relative path for pattern matching
116
+ const relativePath = relative(this.projectPath, absolutePath).replace(/\\/g, '/');
117
+
118
+ // Check exclude patterns first (if any match, skip)
119
+ if (this.excludePatterns && this.excludePatterns.length > 0) {
120
+ for (const pattern of this.excludePatterns) {
121
+ if (minimatch(relativePath, pattern, { dot: true })) {
122
+ return true; // Excluded
123
+ }
124
+ }
125
+ }
126
+
127
+ // Check include patterns (if specified, file must match at least one)
128
+ if (this.includePatterns && this.includePatterns.length > 0) {
129
+ for (const pattern of this.includePatterns) {
130
+ if (minimatch(relativePath, pattern, { dot: true })) {
131
+ return false; // Included
132
+ }
133
+ }
134
+ return true; // Include specified but file didn't match any
135
+ }
136
+
137
+ return false; // No filtering, process file
138
+ }
139
+
98
140
  get metadata(): PluginMetadata {
99
141
  return {
100
142
  name: 'JSModuleIndexer',
@@ -225,6 +267,22 @@ export class JSModuleIndexer extends Plugin {
225
267
  // Collect parse errors to report (REG-147)
226
268
  const parseErrors: Error[] = [];
227
269
 
270
+ // Store projectPath for shouldSkipFile()
271
+ this.projectPath = projectPath;
272
+
273
+ // Read include/exclude patterns from config (REG-185)
274
+ const orchConfig = config as { include?: string[]; exclude?: string[] } | undefined;
275
+ this.includePatterns = orchConfig?.include;
276
+ this.excludePatterns = orchConfig?.exclude;
277
+
278
+ // Log if patterns are configured
279
+ if (this.includePatterns || this.excludePatterns) {
280
+ logger.info('File filtering enabled', {
281
+ include: this.includePatterns?.length ?? 0,
282
+ exclude: this.excludePatterns?.length ?? 0,
283
+ });
284
+ }
285
+
228
286
  // Check config for test file marking
229
287
  if ((config as { analysis?: { tests?: { markTestFiles?: boolean } } })?.analysis?.tests?.markTestFiles === false) {
230
288
  this.markTestFiles = false;
@@ -260,6 +318,14 @@ export class JSModuleIndexer extends Plugin {
260
318
  while (stack.length > 0 && visited.size < MAX_MODULES) {
261
319
  const { file: currentFile, depth } = stack.pop()!;
262
320
 
321
+ // Check if file should be skipped based on include/exclude patterns (REG-185)
322
+ if (this.shouldSkipFile(currentFile)) {
323
+ logger.debug('Skipping file (filtered by patterns)', {
324
+ file: currentFile.replace(projectPath, '')
325
+ });
326
+ continue; // Don't process, don't follow imports
327
+ }
328
+
263
329
  // Report progress every PROGRESS_INTERVAL files
264
330
  if (onProgress && visited.size - lastProgressReport >= PROGRESS_INTERVAL) {
265
331
  onProgress({
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * RustModuleIndexer - plugin for indexing Rust modules
3
- * Discovers .rs files in rust-engine/src/ directory
3
+ * Discovers .rs files in packages/rfdb-server/src/ directory
4
4
  */
5
5
 
6
6
  import { readFileSync, existsSync, readdirSync, statSync } from 'fs';
@@ -99,11 +99,11 @@ export class RustModuleIndexer extends Plugin {
99
99
  const typedManifest = manifest as { projectPath: string } | undefined;
100
100
  const { projectPath } = typedManifest!;
101
101
 
102
- // Find rust-engine/src directory
103
- const rustRoot = resolve(projectPath, 'rust-engine/src');
102
+ // Find packages/rfdb-server/src directory
103
+ const rustRoot = resolve(projectPath, 'packages/rfdb-server/src');
104
104
 
105
105
  if (!existsSync(rustRoot)) {
106
- logger.info('rust-engine/src not found, skipping');
106
+ logger.info('packages/rfdb-server/src not found, skipping');
107
107
  return createSuccessResult({ nodes: 0, edges: 0 }, { skipped: true });
108
108
  }
109
109
 
@@ -0,0 +1,325 @@
1
+ /**
2
+ * BrokenImportValidator - detects broken imports and undefined symbols (REG-261)
3
+ *
4
+ * This VALIDATION plugin queries the graph (built by ANALYSIS and ENRICHMENT phases)
5
+ * to detect:
6
+ *
7
+ * 1. ERR_BROKEN_IMPORT: Named/default import references non-existent export
8
+ * - IMPORT node with relative source but no IMPORTS_FROM edge
9
+ * - Skips: external (npm) imports, namespace imports, type-only imports
10
+ *
11
+ * 2. ERR_UNDEFINED_SYMBOL: Symbol used but not defined, imported, or global
12
+ * - CALL node without CALLS edge
13
+ * - Not a method call (no `object` property)
14
+ * - Not a local definition (FUNCTION/CLASS/VARIABLE in same file)
15
+ * - Not an import (IMPORT with matching local name)
16
+ * - Not a known global (console, setTimeout, etc.)
17
+ *
18
+ * Architecture follows existing validator patterns:
19
+ * - Phase: VALIDATION
20
+ * - Priority: 85 (after enrichment, before general validators)
21
+ * - Returns: ValidationError[] collected via DiagnosticCollector
22
+ */
23
+
24
+ import { Plugin, createSuccessResult } from '../Plugin.js';
25
+ import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
26
+ import type { BaseNodeRecord } from '@grafema/types';
27
+ import { ValidationError } from '../../errors/GrafemaError.js';
28
+ import { GlobalsRegistry } from '../../data/globals/index.js';
29
+
30
+ // === INTERFACES ===
31
+
32
+ interface ImportNode extends BaseNodeRecord {
33
+ source?: string;
34
+ importType?: string; // 'default' | 'named' | 'namespace'
35
+ imported?: string; // Original name in source module
36
+ local?: string; // Local binding name in this file
37
+ importBinding?: string; // 'value' | 'type' (TypeScript)
38
+ }
39
+
40
+ interface CallNode extends BaseNodeRecord {
41
+ object?: string; // If present, this is a method call
42
+ }
43
+
44
+ // === CONSTANTS ===
45
+
46
+ const ERROR_CODES = {
47
+ BROKEN_IMPORT: 'ERR_BROKEN_IMPORT',
48
+ UNDEFINED_SYMBOL: 'ERR_UNDEFINED_SYMBOL',
49
+ } as const;
50
+
51
+ // Types that represent local definitions
52
+ const DEFINITION_TYPES = new Set([
53
+ 'FUNCTION',
54
+ 'CLASS',
55
+ 'VARIABLE_DECLARATION',
56
+ 'CONSTANT',
57
+ 'PARAMETER',
58
+ ]);
59
+
60
+ // === PLUGIN CLASS ===
61
+
62
+ export class BrokenImportValidator extends Plugin {
63
+ private globalsRegistry: GlobalsRegistry;
64
+
65
+ constructor(config: Record<string, unknown> = {}) {
66
+ super(config);
67
+ this.globalsRegistry = new GlobalsRegistry();
68
+
69
+ // Allow custom globals from config
70
+ const customGlobals = config.customGlobals as string[] | undefined;
71
+ if (customGlobals) {
72
+ this.globalsRegistry.addCustomGlobals(customGlobals);
73
+ }
74
+ }
75
+
76
+ get metadata(): PluginMetadata {
77
+ return {
78
+ name: 'BrokenImportValidator',
79
+ phase: 'VALIDATION',
80
+ priority: 85, // After enrichment plugins, before general validators
81
+ creates: {
82
+ nodes: [],
83
+ edges: []
84
+ },
85
+ dependencies: ['ImportExportLinker', 'FunctionCallResolver']
86
+ };
87
+ }
88
+
89
+ async execute(context: PluginContext): Promise<PluginResult> {
90
+ const { graph, onProgress } = context;
91
+ const logger = this.log(context);
92
+
93
+ logger.info('Starting broken import validation');
94
+ const startTime = Date.now();
95
+
96
+ const errors: ValidationError[] = [];
97
+ const stats = {
98
+ importsChecked: 0,
99
+ brokenImports: 0,
100
+ callsChecked: 0,
101
+ undefinedSymbols: 0,
102
+ skipped: {
103
+ externalImports: 0,
104
+ namespaceImports: 0,
105
+ typeOnlyImports: 0,
106
+ methodCalls: 0,
107
+ alreadyResolved: 0,
108
+ localDefinitions: 0,
109
+ imports: 0,
110
+ globals: 0,
111
+ },
112
+ };
113
+
114
+ // === Step 1: Build indexes ===
115
+
116
+ // Index: file -> Set<name> for local definitions
117
+ const definitionsByFile = new Map<string, Set<string>>();
118
+ for await (const node of graph.queryNodes({})) {
119
+ if (!DEFINITION_TYPES.has(node.type)) continue;
120
+ if (!node.file || !node.name) continue;
121
+
122
+ if (!definitionsByFile.has(node.file)) {
123
+ definitionsByFile.set(node.file, new Set());
124
+ }
125
+ definitionsByFile.get(node.file)!.add(node.name);
126
+ }
127
+ logger.debug('Indexed definitions', { files: definitionsByFile.size });
128
+
129
+ // Index: file:local -> ImportNode
130
+ const importsByFile = new Map<string, Map<string, ImportNode>>();
131
+ const allImports: ImportNode[] = [];
132
+
133
+ for await (const node of graph.queryNodes({ nodeType: 'IMPORT' })) {
134
+ const imp = node as ImportNode;
135
+ if (!imp.file) continue;
136
+
137
+ allImports.push(imp);
138
+
139
+ // Index by local name for undefined symbol checking
140
+ const localName = imp.local || imp.name;
141
+ if (localName) {
142
+ if (!importsByFile.has(imp.file)) {
143
+ importsByFile.set(imp.file, new Map());
144
+ }
145
+ importsByFile.get(imp.file)!.set(localName, imp);
146
+ }
147
+ }
148
+ logger.debug('Indexed imports', { count: allImports.length });
149
+
150
+ // === Step 2: Check for broken imports ===
151
+
152
+ for (const imp of allImports) {
153
+ stats.importsChecked++;
154
+
155
+ // Progress reporting
156
+ if (onProgress && stats.importsChecked % 100 === 0) {
157
+ onProgress({
158
+ phase: 'validation',
159
+ currentPlugin: 'BrokenImportValidator',
160
+ message: `Checking imports ${stats.importsChecked}/${allImports.length}`,
161
+ totalFiles: allImports.length,
162
+ processedFiles: stats.importsChecked
163
+ });
164
+ }
165
+
166
+ // Skip external (npm) imports - only check relative imports
167
+ const isRelative = imp.source &&
168
+ (imp.source.startsWith('./') || imp.source.startsWith('../'));
169
+ if (!isRelative) {
170
+ stats.skipped.externalImports++;
171
+ continue;
172
+ }
173
+
174
+ // Skip namespace imports - they link to MODULE, not EXPORT
175
+ if (imp.importType === 'namespace') {
176
+ stats.skipped.namespaceImports++;
177
+ continue;
178
+ }
179
+
180
+ // Skip type-only imports (TypeScript) - erased at compile time
181
+ if (imp.importBinding === 'type') {
182
+ stats.skipped.typeOnlyImports++;
183
+ continue;
184
+ }
185
+
186
+ // Check for IMPORTS_FROM edge
187
+ const importsFromEdges = await graph.getOutgoingEdges(imp.id, ['IMPORTS_FROM']);
188
+
189
+ if (importsFromEdges.length === 0) {
190
+ // No IMPORTS_FROM edge = broken import
191
+ const importedName = imp.imported || imp.local || imp.name;
192
+
193
+ errors.push(new ValidationError(
194
+ `Import "${importedName}" from "${imp.source}" - export doesn't exist`,
195
+ ERROR_CODES.BROKEN_IMPORT,
196
+ {
197
+ filePath: imp.file,
198
+ lineNumber: imp.line as number | undefined,
199
+ phase: 'VALIDATION',
200
+ plugin: 'BrokenImportValidator',
201
+ importedName,
202
+ source: imp.source,
203
+ importType: imp.importType,
204
+ },
205
+ `Check if "${importedName}" is exported from "${imp.source}"`,
206
+ 'error'
207
+ ));
208
+
209
+ stats.brokenImports++;
210
+ }
211
+ }
212
+
213
+ logger.debug('Broken imports found', { count: stats.brokenImports });
214
+
215
+ // === Step 3: Check for undefined symbols ===
216
+
217
+ const callsToCheck: CallNode[] = [];
218
+ for await (const node of graph.queryNodes({ nodeType: 'CALL' })) {
219
+ const call = node as CallNode;
220
+
221
+ // Skip method calls (have object attribute)
222
+ if (call.object) {
223
+ stats.skipped.methodCalls++;
224
+ continue;
225
+ }
226
+
227
+ // Skip if already has CALLS edge (resolved)
228
+ const callsEdges = await graph.getOutgoingEdges(call.id, ['CALLS']);
229
+ if (callsEdges.length > 0) {
230
+ stats.skipped.alreadyResolved++;
231
+ continue;
232
+ }
233
+
234
+ callsToCheck.push(call);
235
+ }
236
+
237
+ logger.debug('Unresolved calls to check', { count: callsToCheck.length });
238
+
239
+ for (const call of callsToCheck) {
240
+ stats.callsChecked++;
241
+
242
+ const calledName = call.name;
243
+ const file = call.file;
244
+
245
+ if (!calledName || !file) continue;
246
+
247
+ // Check 1: Is it a local definition?
248
+ const fileDefinitions = definitionsByFile.get(file);
249
+ if (fileDefinitions?.has(calledName)) {
250
+ stats.skipped.localDefinitions++;
251
+ continue;
252
+ }
253
+
254
+ // Check 2: Is it imported? (even if broken, that's a different error)
255
+ const fileImports = importsByFile.get(file);
256
+ if (fileImports?.has(calledName)) {
257
+ stats.skipped.imports++;
258
+ continue;
259
+ }
260
+
261
+ // Check 3: Is it a global?
262
+ if (this.globalsRegistry.isGlobal(calledName)) {
263
+ stats.skipped.globals++;
264
+ continue;
265
+ }
266
+
267
+ // Symbol is undefined
268
+ errors.push(new ValidationError(
269
+ `"${calledName}" is used but not defined or imported`,
270
+ ERROR_CODES.UNDEFINED_SYMBOL,
271
+ {
272
+ filePath: file,
273
+ lineNumber: call.line as number | undefined,
274
+ phase: 'VALIDATION',
275
+ plugin: 'BrokenImportValidator',
276
+ symbol: calledName,
277
+ },
278
+ `Add an import for "${calledName}" or define it locally`,
279
+ 'warning' // Warning severity - might be a false positive
280
+ ));
281
+
282
+ stats.undefinedSymbols++;
283
+ }
284
+
285
+ // === Step 4: Summary ===
286
+
287
+ const totalTime = ((Date.now() - startTime) / 1000).toFixed(2);
288
+ const summary = {
289
+ importsChecked: stats.importsChecked,
290
+ brokenImports: stats.brokenImports,
291
+ callsChecked: stats.callsChecked,
292
+ undefinedSymbols: stats.undefinedSymbols,
293
+ skipped: stats.skipped,
294
+ totalIssues: stats.brokenImports + stats.undefinedSymbols,
295
+ time: `${totalTime}s`,
296
+ };
297
+
298
+ logger.info('Validation complete', summary);
299
+
300
+ if (errors.length > 0) {
301
+ logger.warn('Issues found', {
302
+ brokenImports: stats.brokenImports,
303
+ undefinedSymbols: stats.undefinedSymbols,
304
+ });
305
+
306
+ // Log first few errors for visibility
307
+ for (const error of errors.slice(0, 5)) {
308
+ if (error.code === ERROR_CODES.BROKEN_IMPORT) {
309
+ logger.error(`[${error.code}] ${error.message}`);
310
+ } else {
311
+ logger.warn(`[${error.code}] ${error.message}`);
312
+ }
313
+ }
314
+ if (errors.length > 5) {
315
+ logger.debug(`... and ${errors.length - 5} more issues`);
316
+ }
317
+ }
318
+
319
+ return createSuccessResult(
320
+ { nodes: 0, edges: 0 },
321
+ { summary },
322
+ errors
323
+ );
324
+ }
325
+ }