@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,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 };
|