@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.
- package/LICENSE +190 -0
- package/README.md +76 -0
- package/dist/Orchestrator.d.ts +142 -0
- package/dist/Orchestrator.d.ts.map +1 -0
- package/dist/Orchestrator.js +481 -0
- package/dist/api/GraphAPI.d.ts +87 -0
- package/dist/api/GraphAPI.d.ts.map +1 -0
- package/dist/api/GraphAPI.js +210 -0
- package/dist/api/GuaranteeAPI.d.ts +147 -0
- package/dist/api/GuaranteeAPI.d.ts.map +1 -0
- package/dist/api/GuaranteeAPI.js +288 -0
- package/dist/core/ASTWorker.d.ts +133 -0
- package/dist/core/ASTWorker.d.ts.map +1 -0
- package/dist/core/ASTWorker.js +352 -0
- package/dist/core/ASTWorkerPool.d.ts +85 -0
- package/dist/core/ASTWorkerPool.d.ts.map +1 -0
- package/dist/core/ASTWorkerPool.js +207 -0
- package/dist/core/AnalysisQueue.d.ts +104 -0
- package/dist/core/AnalysisQueue.d.ts.map +1 -0
- package/dist/core/AnalysisQueue.js +299 -0
- package/dist/core/AnalysisWorker.d.ts +14 -0
- package/dist/core/AnalysisWorker.d.ts.map +1 -0
- package/dist/core/AnalysisWorker.js +307 -0
- package/dist/core/GraphBackend.d.ts +156 -0
- package/dist/core/GraphBackend.d.ts.map +1 -0
- package/dist/core/GraphBackend.js +85 -0
- package/dist/core/GuaranteeManager.d.ts +230 -0
- package/dist/core/GuaranteeManager.d.ts.map +1 -0
- package/dist/core/GuaranteeManager.js +352 -0
- package/dist/core/ManifestStore.d.ts +71 -0
- package/dist/core/ManifestStore.d.ts.map +1 -0
- package/dist/core/ManifestStore.js +146 -0
- package/dist/core/NodeFactory.d.ts +160 -0
- package/dist/core/NodeFactory.d.ts.map +1 -0
- package/dist/core/NodeFactory.js +137 -0
- package/dist/core/NodeId.d.ts +88 -0
- package/dist/core/NodeId.d.ts.map +1 -0
- package/dist/core/NodeId.js +170 -0
- package/dist/core/ParallelAnalyzer.d.ts +120 -0
- package/dist/core/ParallelAnalyzer.d.ts.map +1 -0
- package/dist/core/ParallelAnalyzer.js +331 -0
- package/dist/core/PriorityQueue.d.ts +106 -0
- package/dist/core/PriorityQueue.d.ts.map +1 -0
- package/dist/core/PriorityQueue.js +168 -0
- package/dist/core/Profiler.d.ts +75 -0
- package/dist/core/Profiler.d.ts.map +1 -0
- package/dist/core/Profiler.js +149 -0
- package/dist/core/QueueWorker.d.ts +12 -0
- package/dist/core/QueueWorker.d.ts.map +1 -0
- package/dist/core/QueueWorker.js +567 -0
- package/dist/core/RFDBClient.d.ts +179 -0
- package/dist/core/RFDBClient.d.ts.map +1 -0
- package/dist/core/RFDBClient.js +429 -0
- package/dist/core/Task.d.ts +56 -0
- package/dist/core/Task.d.ts.map +1 -0
- package/dist/core/Task.js +85 -0
- package/dist/core/TaskTypes.d.ts +20 -0
- package/dist/core/TaskTypes.d.ts.map +1 -0
- package/dist/core/TaskTypes.js +10 -0
- package/dist/core/VersionManager.d.ts +166 -0
- package/dist/core/VersionManager.d.ts.map +1 -0
- package/dist/core/VersionManager.js +237 -0
- package/dist/core/WorkerPool.d.ts +82 -0
- package/dist/core/WorkerPool.d.ts.map +1 -0
- package/dist/core/WorkerPool.js +109 -0
- package/dist/core/nodes/CallSiteNode.d.ts +26 -0
- package/dist/core/nodes/CallSiteNode.d.ts.map +1 -0
- package/dist/core/nodes/CallSiteNode.js +44 -0
- package/dist/core/nodes/ClassNode.d.ts +25 -0
- package/dist/core/nodes/ClassNode.d.ts.map +1 -0
- package/dist/core/nodes/ClassNode.js +40 -0
- package/dist/core/nodes/ConstantNode.d.ts +24 -0
- package/dist/core/nodes/ConstantNode.d.ts.map +1 -0
- package/dist/core/nodes/ConstantNode.js +39 -0
- package/dist/core/nodes/DatabaseQueryNode.d.ts +22 -0
- package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -0
- package/dist/core/nodes/DatabaseQueryNode.js +37 -0
- package/dist/core/nodes/EntrypointNode.d.ts +102 -0
- package/dist/core/nodes/EntrypointNode.d.ts.map +1 -0
- package/dist/core/nodes/EntrypointNode.js +119 -0
- package/dist/core/nodes/EventListenerNode.d.ts +25 -0
- package/dist/core/nodes/EventListenerNode.d.ts.map +1 -0
- package/dist/core/nodes/EventListenerNode.js +39 -0
- package/dist/core/nodes/ExportNode.d.ts +26 -0
- package/dist/core/nodes/ExportNode.d.ts.map +1 -0
- package/dist/core/nodes/ExportNode.js +40 -0
- package/dist/core/nodes/ExternalStdioNode.d.ts +17 -0
- package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -0
- package/dist/core/nodes/ExternalStdioNode.js +26 -0
- package/dist/core/nodes/FunctionNode.d.ts +27 -0
- package/dist/core/nodes/FunctionNode.d.ts.map +1 -0
- package/dist/core/nodes/FunctionNode.js +53 -0
- package/dist/core/nodes/GuaranteeNode.d.ts +76 -0
- package/dist/core/nodes/GuaranteeNode.d.ts.map +1 -0
- package/dist/core/nodes/GuaranteeNode.js +117 -0
- package/dist/core/nodes/HttpRequestNode.d.ts +24 -0
- package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -0
- package/dist/core/nodes/HttpRequestNode.js +38 -0
- package/dist/core/nodes/ImportNode.d.ts +27 -0
- package/dist/core/nodes/ImportNode.d.ts.map +1 -0
- package/dist/core/nodes/ImportNode.js +43 -0
- package/dist/core/nodes/LiteralNode.d.ts +26 -0
- package/dist/core/nodes/LiteralNode.d.ts.map +1 -0
- package/dist/core/nodes/LiteralNode.js +40 -0
- package/dist/core/nodes/MethodCallNode.d.ts +29 -0
- package/dist/core/nodes/MethodCallNode.d.ts.map +1 -0
- package/dist/core/nodes/MethodCallNode.js +47 -0
- package/dist/core/nodes/MethodNode.d.ts +29 -0
- package/dist/core/nodes/MethodNode.d.ts.map +1 -0
- package/dist/core/nodes/MethodNode.js +44 -0
- package/dist/core/nodes/ModuleNode.d.ts +29 -0
- package/dist/core/nodes/ModuleNode.d.ts.map +1 -0
- package/dist/core/nodes/ModuleNode.js +49 -0
- package/dist/core/nodes/NodeKind.d.ts +91 -0
- package/dist/core/nodes/NodeKind.d.ts.map +1 -0
- package/dist/core/nodes/NodeKind.js +146 -0
- package/dist/core/nodes/ParameterNode.d.ts +26 -0
- package/dist/core/nodes/ParameterNode.d.ts.map +1 -0
- package/dist/core/nodes/ParameterNode.js +43 -0
- package/dist/core/nodes/ScopeNode.d.ts +32 -0
- package/dist/core/nodes/ScopeNode.d.ts.map +1 -0
- package/dist/core/nodes/ScopeNode.js +47 -0
- package/dist/core/nodes/ServiceNode.d.ts +44 -0
- package/dist/core/nodes/ServiceNode.d.ts.map +1 -0
- package/dist/core/nodes/ServiceNode.js +49 -0
- package/dist/core/nodes/VariableDeclarationNode.d.ts +22 -0
- package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -0
- package/dist/core/nodes/VariableDeclarationNode.js +38 -0
- package/dist/core/nodes/index.d.ts +25 -0
- package/dist/core/nodes/index.d.ts.map +1 -0
- package/dist/core/nodes/index.js +30 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/plugins/Plugin.d.ts +44 -0
- package/dist/plugins/Plugin.d.ts.map +1 -0
- package/dist/plugins/Plugin.js +46 -0
- package/dist/plugins/analysis/DatabaseAnalyzer.d.ts +23 -0
- package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/DatabaseAnalyzer.js +260 -0
- package/dist/plugins/analysis/ExpressAnalyzer.d.ts +19 -0
- package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/ExpressAnalyzer.js +306 -0
- package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts +17 -0
- package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/ExpressRouteAnalyzer.js +308 -0
- package/dist/plugins/analysis/FetchAnalyzer.d.ts +38 -0
- package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/FetchAnalyzer.js +344 -0
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +65 -0
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -0
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +472 -0
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts +84 -0
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/JSASTAnalyzer.js +1378 -0
- package/dist/plugins/analysis/ReactAnalyzer.d.ts +90 -0
- package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/ReactAnalyzer.js +1153 -0
- package/dist/plugins/analysis/RustAnalyzer.d.ts +13 -0
- package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/RustAnalyzer.js +259 -0
- package/dist/plugins/analysis/SQLiteAnalyzer.d.ts +21 -0
- package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/SQLiteAnalyzer.js +317 -0
- package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts +35 -0
- package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/ServiceLayerAnalyzer.js +303 -0
- package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +33 -0
- package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/SocketIOAnalyzer.js +283 -0
- package/dist/plugins/analysis/SystemDbAnalyzer.d.ts +27 -0
- package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/SystemDbAnalyzer.js +211 -0
- package/dist/plugins/analysis/ast/ConditionParser.d.ts +85 -0
- package/dist/plugins/analysis/ast/ConditionParser.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/ConditionParser.js +277 -0
- package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts +15 -0
- package/dist/plugins/analysis/ast/ExpressionEvaluator.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/ExpressionEvaluator.js +91 -0
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts +77 -0
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/GraphBuilder.js +1077 -0
- package/dist/plugins/analysis/ast/OxcAdapter.d.ts +41 -0
- package/dist/plugins/analysis/ast/OxcAdapter.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/OxcAdapter.js +40 -0
- package/dist/plugins/analysis/ast/types.d.ts +346 -0
- package/dist/plugins/analysis/ast/types.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/types.js +4 -0
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +93 -0
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +24 -0
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +77 -0
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +377 -0
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +27 -0
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +232 -0
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +25 -0
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +172 -0
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +29 -0
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +180 -0
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +14 -0
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +200 -0
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +45 -0
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +150 -0
- package/dist/plugins/analysis/ast/visitors/index.d.ts +17 -0
- package/dist/plugins/analysis/ast/visitors/index.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/visitors/index.js +13 -0
- package/dist/plugins/discovery/DiscoveryPlugin.d.ts +34 -0
- package/dist/plugins/discovery/DiscoveryPlugin.d.ts.map +1 -0
- package/dist/plugins/discovery/DiscoveryPlugin.js +26 -0
- package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts +26 -0
- package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -0
- package/dist/plugins/discovery/MonorepoServiceDiscovery.js +79 -0
- package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts +14 -0
- package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -0
- package/dist/plugins/discovery/SimpleProjectDiscovery.js +65 -0
- package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +19 -0
- package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +1 -0
- package/dist/plugins/discovery/ZonServiceDiscovery.js +204 -0
- package/dist/plugins/enrichment/AliasTracker.d.ts +40 -0
- package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -0
- package/dist/plugins/enrichment/AliasTracker.js +290 -0
- package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +30 -0
- package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -0
- package/dist/plugins/enrichment/HTTPConnectionEnricher.js +135 -0
- package/dist/plugins/enrichment/ImportExportLinker.d.ts +30 -0
- package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -0
- package/dist/plugins/enrichment/ImportExportLinker.js +176 -0
- package/dist/plugins/enrichment/InstanceOfResolver.d.ts +21 -0
- package/dist/plugins/enrichment/InstanceOfResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/InstanceOfResolver.js +117 -0
- package/dist/plugins/enrichment/MethodCallResolver.d.ts +41 -0
- package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/MethodCallResolver.js +252 -0
- package/dist/plugins/enrichment/MountPointResolver.d.ts +26 -0
- package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/MountPointResolver.js +189 -0
- package/dist/plugins/enrichment/PrefixEvaluator.d.ts +89 -0
- package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -0
- package/dist/plugins/enrichment/PrefixEvaluator.js +415 -0
- package/dist/plugins/enrichment/RustFFIEnricher.d.ts +25 -0
- package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -0
- package/dist/plugins/enrichment/RustFFIEnricher.js +170 -0
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +114 -0
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -0
- package/dist/plugins/enrichment/ValueDomainAnalyzer.js +464 -0
- package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts +27 -0
- package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -0
- package/dist/plugins/indexing/IncrementalModuleIndexer.js +238 -0
- package/dist/plugins/indexing/JSModuleIndexer.d.ts +33 -0
- package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -0
- package/dist/plugins/indexing/JSModuleIndexer.js +299 -0
- package/dist/plugins/indexing/RustModuleIndexer.d.ts +28 -0
- package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -0
- package/dist/plugins/indexing/RustModuleIndexer.js +140 -0
- package/dist/plugins/indexing/ServiceDetector.d.ts +46 -0
- package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -0
- package/dist/plugins/indexing/ServiceDetector.js +164 -0
- package/dist/plugins/validation/CallResolverValidator.d.ts +23 -0
- package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -0
- package/dist/plugins/validation/CallResolverValidator.js +108 -0
- package/dist/plugins/validation/DataFlowValidator.d.ts +24 -0
- package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -0
- package/dist/plugins/validation/DataFlowValidator.js +148 -0
- package/dist/plugins/validation/EvalBanValidator.d.ts +25 -0
- package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -0
- package/dist/plugins/validation/EvalBanValidator.js +123 -0
- package/dist/plugins/validation/GraphConnectivityValidator.d.ts +11 -0
- package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -0
- package/dist/plugins/validation/GraphConnectivityValidator.js +135 -0
- package/dist/plugins/validation/SQLInjectionValidator.d.ts +43 -0
- package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -0
- package/dist/plugins/validation/SQLInjectionValidator.js +251 -0
- package/dist/plugins/validation/ShadowingDetector.d.ts +26 -0
- package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -0
- package/dist/plugins/validation/ShadowingDetector.js +119 -0
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts +21 -0
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -0
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +151 -0
- package/dist/plugins/vcs/GitPlugin.d.ts +84 -0
- package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -0
- package/dist/plugins/vcs/GitPlugin.js +295 -0
- package/dist/plugins/vcs/VCSPlugin.d.ts +133 -0
- package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -0
- package/dist/plugins/vcs/VCSPlugin.js +82 -0
- package/dist/plugins/vcs/index.d.ts +10 -0
- package/dist/plugins/vcs/index.d.ts.map +1 -0
- package/dist/plugins/vcs/index.js +18 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts +258 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -0
- package/dist/storage/backends/RFDBServerBackend.js +565 -0
- package/dist/storage/backends/typeValidation.d.ts +47 -0
- package/dist/storage/backends/typeValidation.d.ts.map +1 -0
- package/dist/storage/backends/typeValidation.js +137 -0
- package/dist/validation/PathValidator.d.ts +81 -0
- package/dist/validation/PathValidator.d.ts.map +1 -0
- package/dist/validation/PathValidator.js +251 -0
- package/package.json +57 -0
- package/src/.rfguard/current-session.txt +1 -0
- package/src/Orchestrator.ts +673 -0
- package/src/api/GraphAPI.ts +305 -0
- package/src/api/GuaranteeAPI.ts +401 -0
- package/src/core/ASTWorker.ts +567 -0
- package/src/core/ASTWorkerPool.ts +299 -0
- package/src/core/AnalysisQueue.ts +447 -0
- package/src/core/AnalysisWorker.ts +410 -0
- package/src/core/GraphBackend.ts +265 -0
- package/src/core/GuaranteeManager.ts +581 -0
- package/src/core/ManifestStore.ts +196 -0
- package/src/core/NodeFactory.ts +274 -0
- package/src/core/NodeId.ts +257 -0
- package/src/core/ParallelAnalyzer.ts +476 -0
- package/src/core/PriorityQueue.ts +227 -0
- package/src/core/Profiler.ts +188 -0
- package/src/core/QueueWorker.ts +780 -0
- package/src/core/Task.ts +107 -0
- package/src/core/TaskTypes.ts +40 -0
- package/src/core/VersionManager.ts +404 -0
- package/src/core/WorkerPool.ts +180 -0
- package/src/core/nodes/CallSiteNode.ts +72 -0
- package/src/core/nodes/ClassNode.ts +69 -0
- package/src/core/nodes/ConstantNode.ts +63 -0
- package/src/core/nodes/DatabaseQueryNode.ts +60 -0
- package/src/core/nodes/EntrypointNode.ts +164 -0
- package/src/core/nodes/EventListenerNode.ts +64 -0
- package/src/core/nodes/ExportNode.ts +71 -0
- package/src/core/nodes/ExternalStdioNode.ts +36 -0
- package/src/core/nodes/FunctionNode.ts +78 -0
- package/src/core/nodes/GuaranteeNode.ts +162 -0
- package/src/core/nodes/HttpRequestNode.ts +63 -0
- package/src/core/nodes/ImportNode.ts +75 -0
- package/src/core/nodes/LiteralNode.ts +67 -0
- package/src/core/nodes/MethodCallNode.ts +79 -0
- package/src/core/nodes/MethodNode.ts +78 -0
- package/src/core/nodes/ModuleNode.ts +74 -0
- package/src/core/nodes/NodeKind.ts +171 -0
- package/src/core/nodes/ParameterNode.ts +73 -0
- package/src/core/nodes/ScopeNode.ts +80 -0
- package/src/core/nodes/ServiceNode.ts +86 -0
- package/src/core/nodes/VariableDeclarationNode.ts +60 -0
- package/src/core/nodes/index.ts +49 -0
- package/src/index.ts +93 -0
- package/src/plugins/Plugin.ts +74 -0
- package/src/plugins/analysis/DatabaseAnalyzer.ts +322 -0
- package/src/plugins/analysis/ExpressAnalyzer.ts +401 -0
- package/src/plugins/analysis/ExpressRouteAnalyzer.ts +414 -0
- package/src/plugins/analysis/FetchAnalyzer.ts +441 -0
- package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +686 -0
- package/src/plugins/analysis/JSASTAnalyzer.ts +1680 -0
- package/src/plugins/analysis/ReactAnalyzer.ts +1368 -0
- package/src/plugins/analysis/RustAnalyzer.ts +438 -0
- package/src/plugins/analysis/SQLiteAnalyzer.ts +388 -0
- package/src/plugins/analysis/ServiceLayerAnalyzer.ts +429 -0
- package/src/plugins/analysis/SocketIOAnalyzer.ts +395 -0
- package/src/plugins/analysis/SystemDbAnalyzer.ts +284 -0
- package/src/plugins/analysis/ast/ConditionParser.ts +333 -0
- package/src/plugins/analysis/ast/ExpressionEvaluator.ts +117 -0
- package/src/plugins/analysis/ast/GraphBuilder.ts +1371 -0
- package/src/plugins/analysis/ast/OxcAdapter.ts +63 -0
- package/src/plugins/analysis/ast/types.ts +400 -0
- package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +137 -0
- package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +528 -0
- package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +339 -0
- package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +273 -0
- package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +259 -0
- package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +235 -0
- package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +268 -0
- package/src/plugins/analysis/ast/visitors/index.ts +36 -0
- package/src/plugins/discovery/DiscoveryPlugin.ts +50 -0
- package/src/plugins/discovery/MonorepoServiceDiscovery.ts +117 -0
- package/src/plugins/discovery/SimpleProjectDiscovery.ts +102 -0
- package/src/plugins/enrichment/AliasTracker.ts +399 -0
- package/src/plugins/enrichment/HTTPConnectionEnricher.ts +192 -0
- package/src/plugins/enrichment/ImportExportLinker.ts +221 -0
- package/src/plugins/enrichment/InstanceOfResolver.ts +165 -0
- package/src/plugins/enrichment/MethodCallResolver.ts +333 -0
- package/src/plugins/enrichment/MountPointResolver.ts +264 -0
- package/src/plugins/enrichment/PrefixEvaluator.ts +527 -0
- package/src/plugins/enrichment/RustFFIEnricher.ts +218 -0
- package/src/plugins/enrichment/ValueDomainAnalyzer.ts +682 -0
- package/src/plugins/indexing/IncrementalModuleIndexer.ts +287 -0
- package/src/plugins/indexing/JSModuleIndexer.ts +374 -0
- package/src/plugins/indexing/RustModuleIndexer.ts +160 -0
- package/src/plugins/indexing/ServiceDetector.ts +230 -0
- package/src/plugins/validation/CallResolverValidator.ts +170 -0
- package/src/plugins/validation/DataFlowValidator.ts +233 -0
- package/src/plugins/validation/EvalBanValidator.ts +175 -0
- package/src/plugins/validation/GraphConnectivityValidator.ts +201 -0
- package/src/plugins/validation/SQLInjectionValidator.ts +363 -0
- package/src/plugins/validation/ShadowingDetector.ts +173 -0
- package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +203 -0
- package/src/plugins/vcs/GitPlugin.ts +344 -0
- package/src/plugins/vcs/VCSPlugin.ts +190 -0
- package/src/plugins/vcs/index.ts +32 -0
- package/src/storage/backends/RFDBServerBackend.ts +687 -0
- package/src/storage/backends/typeValidation.ts +151 -0
- package/src/validation/PathValidator.ts +342 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ManifestStore - simple persistent processing state storage
|
|
3
|
+
*
|
|
4
|
+
* Format: StableID|Phase|Status|Timestamp
|
|
5
|
+
* Operations: grep for search, sed for update
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { existsSync, readFileSync, writeFileSync, appendFileSync } from 'fs';
|
|
9
|
+
import { execSync } from 'child_process';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Processing status type
|
|
13
|
+
*/
|
|
14
|
+
export type ProcessingStatus = 'done' | 'in_progress' | 'pending' | 'crashed';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Phase statistics
|
|
18
|
+
*/
|
|
19
|
+
export interface PhaseStats {
|
|
20
|
+
done: number;
|
|
21
|
+
in_progress: number;
|
|
22
|
+
pending: number;
|
|
23
|
+
crashed?: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* All phases statistics
|
|
28
|
+
*/
|
|
29
|
+
export interface ManifestStats {
|
|
30
|
+
[phase: string]: PhaseStats;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export class ManifestStore {
|
|
34
|
+
private filePath: string;
|
|
35
|
+
|
|
36
|
+
constructor(filePath: string) {
|
|
37
|
+
this.filePath = filePath;
|
|
38
|
+
|
|
39
|
+
// Create file if doesn't exist
|
|
40
|
+
if (!existsSync(filePath)) {
|
|
41
|
+
writeFileSync(filePath, '# StableID|Phase|Status|Timestamp\n', 'utf-8');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Check if file is processed in phase
|
|
47
|
+
* @param key - Full key like "PHASE|Plugin|Hash" or stableId
|
|
48
|
+
* @param phase - For backward compat, ignored if key contains |
|
|
49
|
+
*/
|
|
50
|
+
isDone(key: string, phase?: string): boolean {
|
|
51
|
+
try {
|
|
52
|
+
// If key already contains pipe, use as-is, else build pattern
|
|
53
|
+
const searchKey = key.includes('|') ? key : `${key}|${phase}`;
|
|
54
|
+
const pattern = `^${searchKey}\\|done`;
|
|
55
|
+
execSync(`grep -q "${pattern}" "${this.filePath}"`, { encoding: 'utf-8' });
|
|
56
|
+
return true;
|
|
57
|
+
} catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Mark file as processed in phase
|
|
64
|
+
* @param key - Full key like "PHASE|Plugin|Hash" or stableId
|
|
65
|
+
* @param phase - For backward compat, ignored if key contains |
|
|
66
|
+
*/
|
|
67
|
+
markDone(key: string, phase?: string): void {
|
|
68
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
69
|
+
const fullKey = key.includes('|') ? key : `${key}|${phase}`;
|
|
70
|
+
const line = `${fullKey}|done|${timestamp}\n`;
|
|
71
|
+
|
|
72
|
+
// Atomic append
|
|
73
|
+
appendFileSync(this.filePath, line, 'utf-8');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Mark file as in progress
|
|
78
|
+
* @param key - Full key like "PHASE|Plugin|Hash" or stableId
|
|
79
|
+
* @param phase - For backward compat, ignored if key contains |
|
|
80
|
+
*/
|
|
81
|
+
markInProgress(key: string, phase?: string): void {
|
|
82
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
83
|
+
const fullKey = key.includes('|') ? key : `${key}|${phase}`;
|
|
84
|
+
const line = `${fullKey}|in_progress|${timestamp}\n`;
|
|
85
|
+
|
|
86
|
+
appendFileSync(this.filePath, line, 'utf-8');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Get status of file in phase
|
|
91
|
+
* @param key - Full key like "PHASE|Plugin|Hash" or stableId
|
|
92
|
+
* @param phase - For backward compat, ignored if key contains |
|
|
93
|
+
*/
|
|
94
|
+
getStatus(key: string, phase?: string): ProcessingStatus {
|
|
95
|
+
try {
|
|
96
|
+
const searchKey = key.includes('|') ? key : `${key}|${phase}`;
|
|
97
|
+
const pattern = `^${searchKey}\\|`;
|
|
98
|
+
const result = execSync(
|
|
99
|
+
`grep "${pattern}" "${this.filePath}" | tail -1`,
|
|
100
|
+
{ encoding: 'utf-8' }
|
|
101
|
+
).trim();
|
|
102
|
+
|
|
103
|
+
if (!result) return 'pending';
|
|
104
|
+
|
|
105
|
+
const parts = result.split('|');
|
|
106
|
+
// Status is after the key parts
|
|
107
|
+
const statusIndex = key.includes('|') ? key.split('|').length : 2;
|
|
108
|
+
return parts[statusIndex] as ProcessingStatus;
|
|
109
|
+
} catch {
|
|
110
|
+
return 'pending';
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Get all files for phase with specific status
|
|
116
|
+
*/
|
|
117
|
+
getByStatus(phase: string, status: ProcessingStatus): string[] {
|
|
118
|
+
try {
|
|
119
|
+
const pattern = `\\|${phase}\\|${status}\\|`;
|
|
120
|
+
const result = execSync(
|
|
121
|
+
`grep "${pattern}" "${this.filePath}" | cut -d'|' -f1`,
|
|
122
|
+
{ encoding: 'utf-8' }
|
|
123
|
+
).trim();
|
|
124
|
+
|
|
125
|
+
return result ? result.split('\n') : [];
|
|
126
|
+
} catch {
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Get statistics by phases
|
|
133
|
+
*/
|
|
134
|
+
getStats(): ManifestStats {
|
|
135
|
+
const content = readFileSync(this.filePath, 'utf-8');
|
|
136
|
+
const lines = content.split('\n').filter(l => l && !l.startsWith('#'));
|
|
137
|
+
|
|
138
|
+
const stats: ManifestStats = {};
|
|
139
|
+
|
|
140
|
+
for (const line of lines) {
|
|
141
|
+
const parts = line.split('|');
|
|
142
|
+
const phase = parts[1];
|
|
143
|
+
const status = parts[2] as ProcessingStatus;
|
|
144
|
+
|
|
145
|
+
if (!phase || !status) continue;
|
|
146
|
+
|
|
147
|
+
if (!stats[phase]) {
|
|
148
|
+
stats[phase] = { done: 0, in_progress: 0, pending: 0 };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (status in stats[phase]) {
|
|
152
|
+
(stats[phase] as unknown as Record<string, number>)[status]++;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return stats;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Clean up stale in_progress (crashed processes)
|
|
161
|
+
* @param olderThanSeconds - older than N seconds considered dead
|
|
162
|
+
*/
|
|
163
|
+
cleanupStaleProgress(olderThanSeconds: number = 300): void {
|
|
164
|
+
const now = Math.floor(Date.now() / 1000);
|
|
165
|
+
const content = readFileSync(this.filePath, 'utf-8');
|
|
166
|
+
const lines = content.split('\n');
|
|
167
|
+
|
|
168
|
+
const cleaned = lines.map(line => {
|
|
169
|
+
if (!line || line.startsWith('#')) return line;
|
|
170
|
+
|
|
171
|
+
const parts = line.split('|');
|
|
172
|
+
const status = parts[2];
|
|
173
|
+
const timestamp = parts[3];
|
|
174
|
+
|
|
175
|
+
if (status === 'in_progress' && timestamp) {
|
|
176
|
+
const age = now - parseInt(timestamp);
|
|
177
|
+
if (age > olderThanSeconds) {
|
|
178
|
+
// Mark as crashed (process died)
|
|
179
|
+
parts[2] = 'crashed';
|
|
180
|
+
return parts.join('|');
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return line;
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
writeFileSync(this.filePath, cleaned.join('\n'), 'utf-8');
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Clear entire manifest (for testing)
|
|
192
|
+
*/
|
|
193
|
+
clear(): void {
|
|
194
|
+
writeFileSync(this.filePath, '# StableID|Phase|Status|Timestamp\n', 'utf-8');
|
|
195
|
+
}
|
|
196
|
+
}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NodeFactory - centralized graph node creation
|
|
3
|
+
*
|
|
4
|
+
* Single point for creating all node types with:
|
|
5
|
+
* - Required field validation
|
|
6
|
+
* - Standard field set for each type
|
|
7
|
+
* - Automatic ID generation
|
|
8
|
+
*
|
|
9
|
+
* Delegates creation to node contracts from ./nodes/
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { createHash } from 'crypto';
|
|
13
|
+
import { basename, relative } from 'path';
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
ServiceNode,
|
|
17
|
+
EntrypointNode,
|
|
18
|
+
ModuleNode,
|
|
19
|
+
FunctionNode,
|
|
20
|
+
ScopeNode,
|
|
21
|
+
CallSiteNode,
|
|
22
|
+
MethodCallNode,
|
|
23
|
+
VariableDeclarationNode,
|
|
24
|
+
ConstantNode,
|
|
25
|
+
LiteralNode,
|
|
26
|
+
ExternalStdioNode,
|
|
27
|
+
EventListenerNode,
|
|
28
|
+
HttpRequestNode,
|
|
29
|
+
DatabaseQueryNode,
|
|
30
|
+
type EntrypointType,
|
|
31
|
+
type EntrypointTrigger,
|
|
32
|
+
} from './nodes/index.js';
|
|
33
|
+
|
|
34
|
+
import type { BaseNodeRecord } from '@grafema/types';
|
|
35
|
+
|
|
36
|
+
interface ServiceOptions {
|
|
37
|
+
version?: string;
|
|
38
|
+
entrypoint?: string;
|
|
39
|
+
discoveryMethod?: string;
|
|
40
|
+
description?: string;
|
|
41
|
+
dependencies?: string[];
|
|
42
|
+
serviceType?: string;
|
|
43
|
+
testFiles?: string[];
|
|
44
|
+
metadata?: {
|
|
45
|
+
type?: string;
|
|
46
|
+
testFiles?: string[];
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface EntrypointOptions {
|
|
51
|
+
id?: string;
|
|
52
|
+
name?: string;
|
|
53
|
+
trigger?: EntrypointTrigger;
|
|
54
|
+
source?: string;
|
|
55
|
+
serviceId?: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
interface ModuleOptions {
|
|
59
|
+
contentHash?: string;
|
|
60
|
+
isTest?: boolean;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
interface FunctionOptions {
|
|
64
|
+
async?: boolean;
|
|
65
|
+
generator?: boolean;
|
|
66
|
+
exported?: boolean;
|
|
67
|
+
arrowFunction?: boolean;
|
|
68
|
+
parentScopeId?: string;
|
|
69
|
+
isClassMethod?: boolean;
|
|
70
|
+
className?: string;
|
|
71
|
+
params?: string[];
|
|
72
|
+
counter?: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
interface ScopeOptions {
|
|
76
|
+
name?: string;
|
|
77
|
+
conditional?: boolean;
|
|
78
|
+
parentScopeId?: string;
|
|
79
|
+
parentFunctionId?: string;
|
|
80
|
+
capturesFrom?: string[];
|
|
81
|
+
counter?: number;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
interface CallSiteOptions {
|
|
85
|
+
parentScopeId?: string;
|
|
86
|
+
counter?: number;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
interface MethodCallOptions {
|
|
90
|
+
parentScopeId?: string;
|
|
91
|
+
args?: unknown[];
|
|
92
|
+
counter?: number;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
interface VariableOptions {
|
|
96
|
+
parentScopeId?: string;
|
|
97
|
+
counter?: number;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
interface ConstantOptions {
|
|
101
|
+
value?: unknown;
|
|
102
|
+
parentScopeId?: string;
|
|
103
|
+
counter?: number;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
interface LiteralOptions {
|
|
107
|
+
parentCallId?: string;
|
|
108
|
+
argIndex?: number;
|
|
109
|
+
counter?: number;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
interface EventListenerOptions {
|
|
113
|
+
column?: number;
|
|
114
|
+
parentScopeId?: string;
|
|
115
|
+
callbackArg?: string;
|
|
116
|
+
counter?: number;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
interface HttpRequestOptions {
|
|
120
|
+
column?: number;
|
|
121
|
+
parentScopeId?: string;
|
|
122
|
+
counter?: number;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
interface DatabaseQueryOptions {
|
|
126
|
+
parentScopeId?: string;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Validator type for node classes
|
|
130
|
+
interface NodeValidator {
|
|
131
|
+
validate(node: BaseNodeRecord): string[];
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export class NodeFactory {
|
|
135
|
+
/**
|
|
136
|
+
* Create SERVICE node
|
|
137
|
+
*/
|
|
138
|
+
static createService(name: string, projectPath: string, options: ServiceOptions = {}) {
|
|
139
|
+
return ServiceNode.create(name, projectPath, options);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Create ENTRYPOINT node
|
|
144
|
+
*/
|
|
145
|
+
static createEntrypoint(file: string, entrypointType: EntrypointType, options: EntrypointOptions = {}) {
|
|
146
|
+
return EntrypointNode.create(file, entrypointType, options);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Create MODULE node
|
|
151
|
+
*/
|
|
152
|
+
static createModule(filePath: string, projectPath: string, options: ModuleOptions = {}) {
|
|
153
|
+
if (!filePath) throw new Error('NodeFactory.createModule: filePath is required');
|
|
154
|
+
if (!projectPath) throw new Error('NodeFactory.createModule: projectPath is required');
|
|
155
|
+
|
|
156
|
+
const contentHash = options.contentHash || this._hashFile(filePath);
|
|
157
|
+
const relativePath = relative(projectPath, filePath) || basename(filePath);
|
|
158
|
+
|
|
159
|
+
return ModuleNode.create(filePath, relativePath, contentHash, options);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Create FUNCTION node
|
|
164
|
+
*/
|
|
165
|
+
static createFunction(name: string, file: string, line: number, column: number, options: FunctionOptions = {}) {
|
|
166
|
+
return FunctionNode.create(name, file, line, column, options);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Create SCOPE node
|
|
171
|
+
*/
|
|
172
|
+
static createScope(scopeType: string, file: string, line: number, options: ScopeOptions = {}) {
|
|
173
|
+
return ScopeNode.create(scopeType, file, line, options);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Create CALL_SITE node
|
|
178
|
+
*/
|
|
179
|
+
static createCallSite(targetName: string, file: string, line: number, column: number, options: CallSiteOptions = {}) {
|
|
180
|
+
return CallSiteNode.create(targetName, file, line, column, options);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Create METHOD_CALL node
|
|
185
|
+
*/
|
|
186
|
+
static createMethodCall(objectName: string | undefined, methodName: string, file: string, line: number, column: number, options: MethodCallOptions = {}) {
|
|
187
|
+
return MethodCallNode.create(objectName, methodName, file, line, column, options);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Create VARIABLE_DECLARATION node
|
|
192
|
+
*/
|
|
193
|
+
static createVariableDeclaration(name: string, file: string, line: number, column: number, options: VariableOptions = {}) {
|
|
194
|
+
return VariableDeclarationNode.create(name, file, line, column, options);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Create CONSTANT node
|
|
199
|
+
*/
|
|
200
|
+
static createConstant(name: string, file: string, line: number, column: number, options: ConstantOptions = {}) {
|
|
201
|
+
return ConstantNode.create(name, file, line, column, options);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* Create LITERAL node
|
|
206
|
+
*/
|
|
207
|
+
static createLiteral(value: unknown, file: string, line: number, column: number, options: LiteralOptions = {}) {
|
|
208
|
+
return LiteralNode.create(value, file, line, column, options);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Create EXTERNAL_STDIO node (singleton)
|
|
213
|
+
*/
|
|
214
|
+
static createExternalStdio() {
|
|
215
|
+
return ExternalStdioNode.create();
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Create EVENT_LISTENER node
|
|
220
|
+
*/
|
|
221
|
+
static createEventListener(eventName: string, objectName: string | undefined, file: string, line: number, options: EventListenerOptions = {}) {
|
|
222
|
+
return EventListenerNode.create(eventName, objectName, file, line, options);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Create HTTP_REQUEST node
|
|
227
|
+
*/
|
|
228
|
+
static createHttpRequest(url: string | undefined, method: string | undefined, file: string, line: number, options: HttpRequestOptions = {}) {
|
|
229
|
+
return HttpRequestNode.create(url, method, file, line, options);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Create DATABASE_QUERY node
|
|
234
|
+
*/
|
|
235
|
+
static createDatabaseQuery(query: string | undefined, operation: string | undefined, file: string, line: number, options: DatabaseQueryOptions = {}) {
|
|
236
|
+
return DatabaseQueryNode.create(query, operation, file, line, options);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Validate node by its type
|
|
241
|
+
*/
|
|
242
|
+
static validate(node: BaseNodeRecord): string[] {
|
|
243
|
+
const validators: Record<string, NodeValidator> = {
|
|
244
|
+
'SERVICE': ServiceNode,
|
|
245
|
+
'ENTRYPOINT': EntrypointNode,
|
|
246
|
+
'MODULE': ModuleNode,
|
|
247
|
+
'FUNCTION': FunctionNode,
|
|
248
|
+
'SCOPE': ScopeNode,
|
|
249
|
+
'CALL_SITE': CallSiteNode,
|
|
250
|
+
'METHOD_CALL': MethodCallNode,
|
|
251
|
+
'VARIABLE_DECLARATION': VariableDeclarationNode,
|
|
252
|
+
'CONSTANT': ConstantNode,
|
|
253
|
+
'LITERAL': LiteralNode,
|
|
254
|
+
'EXTERNAL_STDIO': ExternalStdioNode,
|
|
255
|
+
'EVENT_LISTENER': EventListenerNode,
|
|
256
|
+
'HTTP_REQUEST': HttpRequestNode,
|
|
257
|
+
'DATABASE_QUERY': DatabaseQueryNode
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
const validator = validators[node.type];
|
|
261
|
+
if (!validator) {
|
|
262
|
+
return [`Unknown node type: ${node.type}`];
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return validator.validate(node);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Helper: hash file path for stable ID
|
|
270
|
+
*/
|
|
271
|
+
static _hashFile(filePath: string): string {
|
|
272
|
+
return createHash('md5').update(filePath).digest('hex').substring(0, 12);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic Node ID generation scheme for the graph
|
|
3
|
+
*
|
|
4
|
+
* Format: TYPE|SCOPE|FILE|IDENTIFIER|LINE:COL
|
|
5
|
+
*
|
|
6
|
+
* Components:
|
|
7
|
+
* - TYPE: node type (MODULE, FUNCTION, CLASS, METHOD, VARIABLE, etc.)
|
|
8
|
+
* - SCOPE: context/scope (path to parent or project)
|
|
9
|
+
* - FILE: relative file path from project root
|
|
10
|
+
* - IDENTIFIER: entity name (for MODULE can be empty)
|
|
11
|
+
* - LINE:COL: position in file (for uniqueness of anonymous functions)
|
|
12
|
+
*
|
|
13
|
+
* Examples:
|
|
14
|
+
* MODULE|/project|src/index.js||0:0
|
|
15
|
+
* FUNCTION|/project|src/index.js|handleRequest|42:5
|
|
16
|
+
* CLASS|/project|src/User.js|User|10:0
|
|
17
|
+
* METHOD|User|src/User.js|login|25:2
|
|
18
|
+
* VARIABLE|handleRequest|src/index.js|userId|45:10
|
|
19
|
+
* EXTERNAL_MODULE|/project||express|0:0
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { createHash } from 'crypto';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Parameters for computing Node ID
|
|
26
|
+
*/
|
|
27
|
+
export interface NodeIdParams {
|
|
28
|
+
type: string;
|
|
29
|
+
scope?: string;
|
|
30
|
+
file?: string;
|
|
31
|
+
identifier?: string;
|
|
32
|
+
line?: number;
|
|
33
|
+
column?: number;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Parsed Node ID components
|
|
38
|
+
*/
|
|
39
|
+
export interface ParsedNodeId {
|
|
40
|
+
type: string;
|
|
41
|
+
scope: string;
|
|
42
|
+
file: string;
|
|
43
|
+
identifier: string;
|
|
44
|
+
line: number;
|
|
45
|
+
column: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Compute deterministic Node ID
|
|
50
|
+
*/
|
|
51
|
+
export function computeNodeId({
|
|
52
|
+
type,
|
|
53
|
+
scope = '',
|
|
54
|
+
file = '',
|
|
55
|
+
identifier = '',
|
|
56
|
+
line = 0,
|
|
57
|
+
column = 0
|
|
58
|
+
}: NodeIdParams): string {
|
|
59
|
+
// Normalize: remove empty values
|
|
60
|
+
const parts = [
|
|
61
|
+
type,
|
|
62
|
+
scope || '',
|
|
63
|
+
file || '',
|
|
64
|
+
identifier || '',
|
|
65
|
+
`${line}:${column}`
|
|
66
|
+
];
|
|
67
|
+
|
|
68
|
+
return parts.join('|');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Compute u128 numeric ID from string (for Rust backend)
|
|
73
|
+
* Uses SHA-256 hash and takes first 16 bytes
|
|
74
|
+
*/
|
|
75
|
+
export function computeNumericId(stringId: string): bigint {
|
|
76
|
+
const hash = createHash('sha256').update(stringId).digest();
|
|
77
|
+
|
|
78
|
+
// Take first 16 bytes (128 bits) and convert to BigInt
|
|
79
|
+
let numericId = 0n;
|
|
80
|
+
for (let i = 0; i < 16; i++) {
|
|
81
|
+
numericId = (numericId << 8n) | BigInt(hash[i]);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return numericId;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Parse Node ID back into components
|
|
89
|
+
*/
|
|
90
|
+
export function parseNodeId(nodeId: string): ParsedNodeId {
|
|
91
|
+
const parts = nodeId.split('|');
|
|
92
|
+
|
|
93
|
+
if (parts.length !== 5) {
|
|
94
|
+
throw new Error(`Invalid Node ID format: ${nodeId}`);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const [lineStr, columnStr] = parts[4].split(':');
|
|
98
|
+
|
|
99
|
+
return {
|
|
100
|
+
type: parts[0],
|
|
101
|
+
scope: parts[1],
|
|
102
|
+
file: parts[2],
|
|
103
|
+
identifier: parts[3],
|
|
104
|
+
line: Number(lineStr),
|
|
105
|
+
column: Number(columnStr)
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Helper for creating MODULE ID
|
|
111
|
+
*/
|
|
112
|
+
export function createModuleId(filePath: string, projectPath: string = '/project'): string {
|
|
113
|
+
return computeNodeId({
|
|
114
|
+
type: 'MODULE',
|
|
115
|
+
scope: projectPath,
|
|
116
|
+
file: filePath,
|
|
117
|
+
identifier: '',
|
|
118
|
+
line: 0,
|
|
119
|
+
column: 0
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Helper for creating FUNCTION ID
|
|
125
|
+
*/
|
|
126
|
+
export function createFunctionId(
|
|
127
|
+
filePath: string,
|
|
128
|
+
functionName: string,
|
|
129
|
+
line: number,
|
|
130
|
+
column: number,
|
|
131
|
+
scope: string = '/project'
|
|
132
|
+
): string {
|
|
133
|
+
return computeNodeId({
|
|
134
|
+
type: 'FUNCTION',
|
|
135
|
+
scope,
|
|
136
|
+
file: filePath,
|
|
137
|
+
identifier: functionName,
|
|
138
|
+
line,
|
|
139
|
+
column
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Helper for creating CLASS ID
|
|
145
|
+
*/
|
|
146
|
+
export function createClassId(
|
|
147
|
+
filePath: string,
|
|
148
|
+
className: string,
|
|
149
|
+
line: number,
|
|
150
|
+
column: number,
|
|
151
|
+
scope: string = '/project'
|
|
152
|
+
): string {
|
|
153
|
+
return computeNodeId({
|
|
154
|
+
type: 'CLASS',
|
|
155
|
+
scope,
|
|
156
|
+
file: filePath,
|
|
157
|
+
identifier: className,
|
|
158
|
+
line,
|
|
159
|
+
column
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Helper for creating METHOD ID
|
|
165
|
+
*/
|
|
166
|
+
export function createMethodId(
|
|
167
|
+
filePath: string,
|
|
168
|
+
className: string,
|
|
169
|
+
methodName: string,
|
|
170
|
+
line: number,
|
|
171
|
+
column: number
|
|
172
|
+
): string {
|
|
173
|
+
return computeNodeId({
|
|
174
|
+
type: 'METHOD',
|
|
175
|
+
scope: className, // Scope = parent class
|
|
176
|
+
file: filePath,
|
|
177
|
+
identifier: methodName,
|
|
178
|
+
line,
|
|
179
|
+
column
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Helper for creating VARIABLE ID
|
|
185
|
+
*/
|
|
186
|
+
export function createVariableId(
|
|
187
|
+
filePath: string,
|
|
188
|
+
varName: string,
|
|
189
|
+
line: number,
|
|
190
|
+
column: number,
|
|
191
|
+
scope: string
|
|
192
|
+
): string {
|
|
193
|
+
return computeNodeId({
|
|
194
|
+
type: 'VARIABLE',
|
|
195
|
+
scope, // Scope = containing function/class
|
|
196
|
+
file: filePath,
|
|
197
|
+
identifier: varName,
|
|
198
|
+
line,
|
|
199
|
+
column
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Helper for creating EXTERNAL_MODULE ID
|
|
205
|
+
*/
|
|
206
|
+
export function createExternalModuleId(
|
|
207
|
+
moduleName: string,
|
|
208
|
+
projectPath: string = '/project'
|
|
209
|
+
): string {
|
|
210
|
+
return computeNodeId({
|
|
211
|
+
type: 'EXTERNAL_MODULE',
|
|
212
|
+
scope: projectPath,
|
|
213
|
+
file: '',
|
|
214
|
+
identifier: moduleName,
|
|
215
|
+
line: 0,
|
|
216
|
+
column: 0
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Helper for creating IMPORT ID
|
|
222
|
+
*/
|
|
223
|
+
export function createImportId(
|
|
224
|
+
filePath: string,
|
|
225
|
+
source: string,
|
|
226
|
+
localName: string,
|
|
227
|
+
line: number,
|
|
228
|
+
scope: string = '/project'
|
|
229
|
+
): string {
|
|
230
|
+
return computeNodeId({
|
|
231
|
+
type: 'IMPORT',
|
|
232
|
+
scope,
|
|
233
|
+
file: filePath,
|
|
234
|
+
identifier: `${source}:${localName}`,
|
|
235
|
+
line,
|
|
236
|
+
column: 0
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Helper for creating EXPORT ID
|
|
242
|
+
*/
|
|
243
|
+
export function createExportId(
|
|
244
|
+
filePath: string,
|
|
245
|
+
exportName: string,
|
|
246
|
+
line: number,
|
|
247
|
+
scope: string = '/project'
|
|
248
|
+
): string {
|
|
249
|
+
return computeNodeId({
|
|
250
|
+
type: 'EXPORT',
|
|
251
|
+
scope,
|
|
252
|
+
file: filePath,
|
|
253
|
+
identifier: exportName,
|
|
254
|
+
line,
|
|
255
|
+
column: 0
|
|
256
|
+
});
|
|
257
|
+
}
|