@grafema/core 0.1.0-alpha.5 → 0.2.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- package/dist/Orchestrator.d.ts +31 -2
- package/dist/Orchestrator.d.ts.map +1 -1
- package/dist/Orchestrator.js +222 -27
- package/dist/config/ConfigLoader.d.ts +90 -0
- package/dist/config/ConfigLoader.d.ts.map +1 -0
- package/dist/config/ConfigLoader.js +249 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +4 -0
- package/dist/core/ASTWorker.d.ts +11 -36
- package/dist/core/ASTWorker.d.ts.map +1 -1
- package/dist/core/ASTWorker.js +93 -99
- package/dist/core/CoverageAnalyzer.d.ts +65 -0
- package/dist/core/CoverageAnalyzer.d.ts.map +1 -0
- package/dist/core/CoverageAnalyzer.js +198 -0
- package/dist/core/FileExplainer.d.ts +101 -0
- package/dist/core/FileExplainer.d.ts.map +1 -0
- package/dist/core/FileExplainer.js +139 -0
- package/dist/core/FileNodeManager.d.ts +40 -0
- package/dist/core/FileNodeManager.d.ts.map +1 -0
- package/dist/core/FileNodeManager.js +84 -0
- package/dist/core/GraphFreshnessChecker.d.ts +33 -0
- package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
- package/dist/core/GraphFreshnessChecker.js +101 -0
- package/dist/core/HashUtils.d.ts +24 -0
- package/dist/core/HashUtils.d.ts.map +1 -0
- package/dist/core/HashUtils.js +45 -0
- package/dist/core/IncrementalReanalyzer.d.ts +36 -0
- package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
- package/dist/core/IncrementalReanalyzer.js +132 -0
- package/dist/core/NodeFactory.d.ts +266 -19
- package/dist/core/NodeFactory.d.ts.map +1 -1
- package/dist/core/NodeFactory.js +256 -21
- package/dist/core/ScopeTracker.d.ts +84 -0
- package/dist/core/ScopeTracker.d.ts.map +1 -0
- package/dist/core/ScopeTracker.js +116 -0
- package/dist/core/SemanticId.d.ts +90 -0
- package/dist/core/SemanticId.d.ts.map +1 -0
- package/dist/core/SemanticId.js +115 -0
- package/dist/core/VersionManager.d.ts.map +1 -1
- package/dist/core/VersionManager.js +3 -2
- package/dist/core/nodes/ArgumentExpressionNode.d.ts +43 -0
- package/dist/core/nodes/ArgumentExpressionNode.d.ts.map +1 -0
- package/dist/core/nodes/ArgumentExpressionNode.js +60 -0
- package/dist/core/nodes/ArrayLiteralNode.d.ts +27 -0
- package/dist/core/nodes/ArrayLiteralNode.d.ts.map +1 -0
- package/dist/core/nodes/ArrayLiteralNode.js +43 -0
- package/dist/core/nodes/BranchNode.d.ts +41 -0
- package/dist/core/nodes/BranchNode.d.ts.map +1 -0
- package/dist/core/nodes/BranchNode.js +82 -0
- package/dist/core/nodes/CallSiteNode.d.ts +30 -2
- package/dist/core/nodes/CallSiteNode.d.ts.map +1 -1
- package/dist/core/nodes/CallSiteNode.js +54 -4
- package/dist/core/nodes/CaseNode.d.ts +43 -0
- package/dist/core/nodes/CaseNode.d.ts.map +1 -0
- package/dist/core/nodes/CaseNode.js +81 -0
- package/dist/core/nodes/ClassNode.d.ts +34 -2
- package/dist/core/nodes/ClassNode.d.ts.map +1 -1
- package/dist/core/nodes/ClassNode.js +52 -4
- package/dist/core/nodes/ConstantNode.d.ts +2 -2
- package/dist/core/nodes/ConstantNode.d.ts.map +1 -1
- package/dist/core/nodes/ConstantNode.js +6 -4
- package/dist/core/nodes/ConstructorCallNode.d.ts +51 -0
- package/dist/core/nodes/ConstructorCallNode.d.ts.map +1 -0
- package/dist/core/nodes/ConstructorCallNode.js +171 -0
- package/dist/core/nodes/DatabaseQueryNode.d.ts +3 -2
- package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -1
- package/dist/core/nodes/DatabaseQueryNode.js +5 -2
- package/dist/core/nodes/DecoratorNode.d.ts +42 -0
- package/dist/core/nodes/DecoratorNode.d.ts.map +1 -0
- package/dist/core/nodes/DecoratorNode.js +64 -0
- package/dist/core/nodes/EnumNode.d.ts +42 -0
- package/dist/core/nodes/EnumNode.d.ts.map +1 -0
- package/dist/core/nodes/EnumNode.js +56 -0
- package/dist/core/nodes/EventListenerNode.d.ts +4 -4
- package/dist/core/nodes/EventListenerNode.d.ts.map +1 -1
- package/dist/core/nodes/EventListenerNode.js +7 -4
- package/dist/core/nodes/ExportNode.d.ts +38 -2
- package/dist/core/nodes/ExportNode.d.ts.map +1 -1
- package/dist/core/nodes/ExportNode.js +54 -4
- package/dist/core/nodes/ExpressionNode.d.ts +97 -0
- package/dist/core/nodes/ExpressionNode.d.ts.map +1 -0
- package/dist/core/nodes/ExpressionNode.js +180 -0
- package/dist/core/nodes/ExternalModuleNode.d.ts +32 -0
- package/dist/core/nodes/ExternalModuleNode.d.ts.map +1 -0
- package/dist/core/nodes/ExternalModuleNode.js +49 -0
- package/dist/core/nodes/ExternalStdioNode.d.ts +13 -6
- package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -1
- package/dist/core/nodes/ExternalStdioNode.js +15 -8
- package/dist/core/nodes/FunctionNode.d.ts +36 -0
- package/dist/core/nodes/FunctionNode.d.ts.map +1 -1
- package/dist/core/nodes/FunctionNode.js +80 -1
- package/dist/core/nodes/HttpRequestNode.d.ts +4 -4
- package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -1
- package/dist/core/nodes/HttpRequestNode.js +7 -4
- package/dist/core/nodes/ImportNode.d.ts +28 -6
- package/dist/core/nodes/ImportNode.d.ts.map +1 -1
- package/dist/core/nodes/ImportNode.js +43 -8
- package/dist/core/nodes/InterfaceNode.d.ts +46 -0
- package/dist/core/nodes/InterfaceNode.d.ts.map +1 -0
- package/dist/core/nodes/InterfaceNode.js +57 -0
- package/dist/core/nodes/IssueNode.d.ts +73 -0
- package/dist/core/nodes/IssueNode.d.ts.map +1 -0
- package/dist/core/nodes/IssueNode.js +129 -0
- package/dist/core/nodes/LiteralNode.d.ts +2 -2
- package/dist/core/nodes/LiteralNode.d.ts.map +1 -1
- package/dist/core/nodes/LiteralNode.js +6 -4
- package/dist/core/nodes/MethodCallNode.d.ts +32 -2
- package/dist/core/nodes/MethodCallNode.d.ts.map +1 -1
- package/dist/core/nodes/MethodCallNode.js +57 -4
- package/dist/core/nodes/MethodNode.d.ts +34 -2
- package/dist/core/nodes/MethodNode.d.ts.map +1 -1
- package/dist/core/nodes/MethodNode.js +55 -3
- package/dist/core/nodes/ModuleNode.d.ts +31 -0
- package/dist/core/nodes/ModuleNode.d.ts.map +1 -1
- package/dist/core/nodes/ModuleNode.js +37 -0
- package/dist/core/nodes/NetworkRequestNode.d.ts +54 -0
- package/dist/core/nodes/NetworkRequestNode.d.ts.map +1 -0
- package/dist/core/nodes/NetworkRequestNode.js +65 -0
- package/dist/core/nodes/ObjectLiteralNode.d.ts +27 -0
- package/dist/core/nodes/ObjectLiteralNode.d.ts.map +1 -0
- package/dist/core/nodes/ObjectLiteralNode.js +43 -0
- package/dist/core/nodes/ParameterNode.d.ts +2 -2
- package/dist/core/nodes/ParameterNode.d.ts.map +1 -1
- package/dist/core/nodes/ParameterNode.js +5 -3
- package/dist/core/nodes/ScopeNode.d.ts +31 -0
- package/dist/core/nodes/ScopeNode.d.ts.map +1 -1
- package/dist/core/nodes/ScopeNode.js +49 -0
- package/dist/core/nodes/TypeNode.d.ts +36 -0
- package/dist/core/nodes/TypeNode.d.ts.map +1 -0
- package/dist/core/nodes/TypeNode.js +55 -0
- package/dist/core/nodes/VariableDeclarationNode.d.ts +29 -2
- package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -1
- package/dist/core/nodes/VariableDeclarationNode.js +48 -4
- package/dist/core/nodes/index.d.ts +15 -1
- package/dist/core/nodes/index.d.ts.map +1 -1
- package/dist/core/nodes/index.js +17 -0
- package/dist/data/builtins/BuiltinRegistry.d.ts +78 -0
- package/dist/data/builtins/BuiltinRegistry.d.ts.map +1 -0
- package/dist/data/builtins/BuiltinRegistry.js +110 -0
- package/dist/data/builtins/definitions.d.ts +28 -0
- package/dist/data/builtins/definitions.d.ts.map +1 -0
- package/dist/data/builtins/definitions.js +250 -0
- package/dist/data/builtins/index.d.ts +10 -0
- package/dist/data/builtins/index.d.ts.map +1 -0
- package/dist/data/builtins/index.js +8 -0
- package/dist/data/builtins/jsGlobals.d.ts +18 -0
- package/dist/data/builtins/jsGlobals.d.ts.map +1 -0
- package/dist/data/builtins/jsGlobals.js +26 -0
- package/dist/data/builtins/types.d.ts +34 -0
- package/dist/data/builtins/types.d.ts.map +1 -0
- package/dist/data/builtins/types.js +7 -0
- package/dist/data/globals/definitions.d.ts +27 -0
- package/dist/data/globals/definitions.d.ts.map +1 -0
- package/dist/data/globals/definitions.js +117 -0
- package/dist/data/globals/index.d.ts +36 -0
- package/dist/data/globals/index.d.ts.map +1 -0
- package/dist/data/globals/index.js +52 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts +98 -0
- package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticCollector.js +129 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts +100 -0
- package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticReporter.js +247 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
- package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
- package/dist/diagnostics/DiagnosticWriter.js +43 -0
- package/dist/diagnostics/index.d.ts +14 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +11 -0
- package/dist/errors/GrafemaError.d.ts +161 -0
- package/dist/errors/GrafemaError.d.ts.map +1 -0
- package/dist/errors/GrafemaError.js +181 -0
- package/dist/index.d.ts +73 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -1
- package/dist/logging/Logger.d.ts +48 -0
- package/dist/logging/Logger.d.ts.map +1 -0
- package/dist/logging/Logger.js +134 -0
- package/dist/plugins/Plugin.d.ts +5 -1
- package/dist/plugins/Plugin.d.ts.map +1 -1
- package/dist/plugins/Plugin.js +33 -0
- package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/DatabaseAnalyzer.js +14 -6
- package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ExpressAnalyzer.js +29 -19
- package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts +148 -0
- package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts.map +1 -0
- package/dist/plugins/analysis/ExpressResponseAnalyzer.js +495 -0
- package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ExpressRouteAnalyzer.js +71 -29
- package/dist/plugins/analysis/FetchAnalyzer.d.ts +41 -0
- package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/FetchAnalyzer.js +187 -19
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +6 -3
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -1
- package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +76 -80
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts +313 -19
- package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/JSASTAnalyzer.js +3430 -503
- package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ReactAnalyzer.js +56 -57
- package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/RustAnalyzer.js +16 -11
- package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/SQLiteAnalyzer.js +11 -7
- package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/ServiceLayerAnalyzer.js +21 -9
- package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +9 -0
- package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/SocketIOAnalyzer.js +117 -21
- package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -1
- package/dist/plugins/analysis/SystemDbAnalyzer.js +15 -5
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts +207 -4
- package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/GraphBuilder.js +1527 -316
- package/dist/plugins/analysis/ast/IdGenerator.d.ts +105 -0
- package/dist/plugins/analysis/ast/IdGenerator.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/IdGenerator.js +116 -0
- package/dist/plugins/analysis/ast/types.d.ts +470 -5
- package/dist/plugins/analysis/ast/types.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts +33 -0
- package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/utils/createParameterNodes.js +89 -0
- package/dist/plugins/analysis/ast/utils/index.d.ts +6 -0
- package/dist/plugins/analysis/ast/utils/index.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/utils/index.js +5 -0
- package/dist/plugins/analysis/ast/utils/location.d.ts +87 -0
- package/dist/plugins/analysis/ast/utils/location.d.ts.map +1 -0
- package/dist/plugins/analysis/ast/utils/location.js +78 -0
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +14 -5
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +6 -5
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +100 -9
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +674 -125
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +4 -1
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +72 -32
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +14 -1
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +190 -63
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +4 -0
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +112 -8
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +12 -1
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +36 -14
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +20 -2
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -1
- package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +243 -45
- package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -1
- package/dist/plugins/discovery/MonorepoServiceDiscovery.js +3 -2
- package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -1
- package/dist/plugins/discovery/SimpleProjectDiscovery.js +5 -1
- package/dist/plugins/discovery/WorkspaceDiscovery.d.ts +22 -0
- package/dist/plugins/discovery/WorkspaceDiscovery.d.ts.map +1 -0
- package/dist/plugins/discovery/WorkspaceDiscovery.js +141 -0
- package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts +46 -0
- package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts.map +1 -0
- package/dist/plugins/discovery/resolveSourceEntrypoint.js +86 -0
- package/dist/plugins/discovery/workspaces/detector.d.ts +21 -0
- package/dist/plugins/discovery/workspaces/detector.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/detector.js +49 -0
- package/dist/plugins/discovery/workspaces/globResolver.d.ts +35 -0
- package/dist/plugins/discovery/workspaces/globResolver.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/globResolver.js +184 -0
- package/dist/plugins/discovery/workspaces/index.d.ts +9 -0
- package/dist/plugins/discovery/workspaces/index.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/index.js +8 -0
- package/dist/plugins/discovery/workspaces/parsers.d.ts +38 -0
- package/dist/plugins/discovery/workspaces/parsers.d.ts.map +1 -0
- package/dist/plugins/discovery/workspaces/parsers.js +80 -0
- package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -1
- package/dist/plugins/enrichment/AliasTracker.js +29 -8
- package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts +32 -0
- package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts.map +1 -0
- package/dist/plugins/enrichment/ArgumentParameterLinker.js +175 -0
- package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts +51 -0
- package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts.map +1 -0
- package/dist/plugins/enrichment/ClosureCaptureEnricher.js +205 -0
- package/dist/plugins/enrichment/ExternalCallResolver.d.ts +42 -0
- package/dist/plugins/enrichment/ExternalCallResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/ExternalCallResolver.js +213 -0
- package/dist/plugins/enrichment/FunctionCallResolver.d.ts +58 -0
- package/dist/plugins/enrichment/FunctionCallResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/FunctionCallResolver.js +340 -0
- package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +16 -3
- package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -1
- package/dist/plugins/enrichment/HTTPConnectionEnricher.js +78 -27
- package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -1
- package/dist/plugins/enrichment/ImportExportLinker.js +23 -6
- package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -1
- package/dist/plugins/enrichment/MethodCallResolver.js +33 -13
- package/dist/plugins/enrichment/MountPointResolver.d.ts +14 -12
- package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -1
- package/dist/plugins/enrichment/MountPointResolver.js +173 -147
- package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts +44 -0
- package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts.map +1 -0
- package/dist/plugins/enrichment/NodejsBuiltinsResolver.js +271 -0
- package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -1
- package/dist/plugins/enrichment/PrefixEvaluator.js +16 -7
- package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -1
- package/dist/plugins/enrichment/RustFFIEnricher.js +6 -5
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +22 -27
- package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -1
- package/dist/plugins/enrichment/ValueDomainAnalyzer.js +185 -143
- package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -1
- package/dist/plugins/indexing/IncrementalModuleIndexer.js +23 -14
- package/dist/plugins/indexing/JSModuleIndexer.d.ts +15 -0
- package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -1
- package/dist/plugins/indexing/JSModuleIndexer.js +121 -31
- package/dist/plugins/indexing/RustModuleIndexer.d.ts +1 -1
- package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -1
- package/dist/plugins/indexing/RustModuleIndexer.js +8 -7
- package/dist/plugins/indexing/ServiceDetector.d.ts +10 -0
- package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -1
- package/dist/plugins/indexing/ServiceDetector.js +28 -15
- package/dist/plugins/validation/BrokenImportValidator.d.ts +31 -0
- package/dist/plugins/validation/BrokenImportValidator.d.ts.map +1 -0
- package/dist/plugins/validation/BrokenImportValidator.js +249 -0
- package/dist/plugins/validation/CallResolverValidator.d.ts +21 -10
- package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -1
- package/dist/plugins/validation/CallResolverValidator.js +103 -77
- package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -1
- package/dist/plugins/validation/DataFlowValidator.js +62 -49
- package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -1
- package/dist/plugins/validation/EvalBanValidator.js +17 -16
- package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -1
- package/dist/plugins/validation/GraphConnectivityValidator.js +44 -24
- package/dist/plugins/validation/NodeCreationValidator.d.ts +85 -0
- package/dist/plugins/validation/NodeCreationValidator.d.ts.map +1 -0
- package/dist/plugins/validation/NodeCreationValidator.js +415 -0
- package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -1
- package/dist/plugins/validation/SQLInjectionValidator.js +61 -19
- package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -1
- package/dist/plugins/validation/ShadowingDetector.js +6 -5
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -1
- package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +12 -11
- package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -1
- package/dist/plugins/vcs/GitPlugin.js +10 -12
- package/dist/plugins/vcs/VCSPlugin.d.ts +3 -2
- package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -1
- package/dist/plugins/vcs/VCSPlugin.js +5 -5
- package/dist/queries/findCallsInFunction.d.ts +52 -0
- package/dist/queries/findCallsInFunction.d.ts.map +1 -0
- package/dist/queries/findCallsInFunction.js +135 -0
- package/dist/queries/findContainingFunction.d.ts +45 -0
- package/dist/queries/findContainingFunction.d.ts.map +1 -0
- package/dist/queries/findContainingFunction.js +54 -0
- package/dist/queries/index.d.ts +14 -0
- package/dist/queries/index.d.ts.map +1 -0
- package/dist/queries/index.js +11 -0
- package/dist/queries/traceValues.d.ts +70 -0
- package/dist/queries/traceValues.d.ts.map +1 -0
- package/dist/queries/traceValues.js +299 -0
- package/dist/queries/types.d.ts +163 -0
- package/dist/queries/types.d.ts.map +1 -0
- package/dist/queries/types.js +9 -0
- package/dist/schema/GraphSchemaExtractor.d.ts +53 -0
- package/dist/schema/GraphSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/GraphSchemaExtractor.js +124 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts +73 -0
- package/dist/schema/InterfaceSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/InterfaceSchemaExtractor.js +112 -0
- package/dist/schema/index.d.ts +5 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +2 -0
- package/dist/storage/backends/RFDBServerBackend.d.ts +21 -34
- package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -1
- package/dist/storage/backends/RFDBServerBackend.js +72 -62
- package/dist/storage/backends/typeValidation.d.ts.map +1 -1
- package/dist/storage/backends/typeValidation.js +1 -0
- package/dist/validation/PathValidator.d.ts +1 -2
- package/dist/validation/PathValidator.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/Orchestrator.ts +272 -27
- package/src/config/ConfigLoader.ts +354 -0
- package/src/config/index.ts +5 -0
- package/src/core/ASTWorker.ts +143 -139
- package/src/core/CoverageAnalyzer.ts +243 -0
- package/src/core/FileExplainer.ts +179 -0
- package/src/core/FileNodeManager.ts +100 -0
- package/src/core/GraphFreshnessChecker.ts +143 -0
- package/src/core/HashUtils.ts +48 -0
- package/src/core/IncrementalReanalyzer.ts +192 -0
- package/src/core/NodeFactory.ts +470 -23
- package/src/core/ScopeTracker.ts +154 -0
- package/src/core/SemanticId.ts +192 -0
- package/src/core/VersionManager.ts +3 -2
- package/src/core/nodes/ArgumentExpressionNode.ts +89 -0
- package/src/core/nodes/ArrayLiteralNode.ts +66 -0
- package/src/core/nodes/BranchNode.ts +113 -0
- package/src/core/nodes/CallSiteNode.ts +64 -4
- package/src/core/nodes/CaseNode.ts +123 -0
- package/src/core/nodes/ClassNode.ts +67 -4
- package/src/core/nodes/ConstantNode.ts +5 -4
- package/src/core/nodes/ConstructorCallNode.ts +217 -0
- package/src/core/nodes/DatabaseQueryNode.ts +5 -1
- package/src/core/nodes/DecoratorNode.ts +92 -0
- package/src/core/nodes/EnumNode.ts +87 -0
- package/src/core/nodes/EventListenerNode.ts +7 -4
- package/src/core/nodes/ExportNode.ts +74 -4
- package/src/core/nodes/ExpressionNode.ts +232 -0
- package/src/core/nodes/ExternalModuleNode.ts +65 -0
- package/src/core/nodes/ExternalStdioNode.ts +17 -9
- package/src/core/nodes/FunctionNode.ts +101 -1
- package/src/core/nodes/HttpRequestNode.ts +7 -4
- package/src/core/nodes/ImportNode.ts +62 -13
- package/src/core/nodes/InterfaceNode.ts +92 -0
- package/src/core/nodes/IssueNode.ts +177 -0
- package/src/core/nodes/LiteralNode.ts +5 -4
- package/src/core/nodes/MethodCallNode.ts +70 -4
- package/src/core/nodes/MethodNode.ts +68 -3
- package/src/core/nodes/ModuleNode.ts +50 -0
- package/src/core/nodes/NetworkRequestNode.ts +77 -0
- package/src/core/nodes/ObjectLiteralNode.ts +66 -0
- package/src/core/nodes/ParameterNode.ts +4 -3
- package/src/core/nodes/ScopeNode.ts +65 -0
- package/src/core/nodes/TypeNode.ts +79 -0
- package/src/core/nodes/VariableDeclarationNode.ts +58 -4
- package/src/core/nodes/index.ts +21 -1
- package/src/data/builtins/BuiltinRegistry.ts +124 -0
- package/src/data/builtins/definitions.ts +267 -0
- package/src/data/builtins/index.ts +10 -0
- package/src/data/builtins/jsGlobals.ts +28 -0
- package/src/data/builtins/types.ts +36 -0
- package/src/data/globals/definitions.ts +156 -0
- package/src/data/globals/index.ts +66 -0
- package/src/diagnostics/DiagnosticCollector.ts +163 -0
- package/src/diagnostics/DiagnosticReporter.ts +324 -0
- package/src/diagnostics/DiagnosticWriter.ts +50 -0
- package/src/diagnostics/index.ts +16 -0
- package/src/errors/GrafemaError.ts +239 -0
- package/src/index.ts +193 -1
- package/src/logging/Logger.ts +152 -0
- package/src/plugins/Plugin.ts +42 -0
- package/src/plugins/analysis/DatabaseAnalyzer.ts +16 -8
- package/src/plugins/analysis/ExpressAnalyzer.ts +33 -19
- package/src/plugins/analysis/ExpressResponseAnalyzer.ts +636 -0
- package/src/plugins/analysis/ExpressRouteAnalyzer.ts +76 -36
- package/src/plugins/analysis/FetchAnalyzer.ts +232 -21
- package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +84 -101
- package/src/plugins/analysis/JSASTAnalyzer.ts +4265 -587
- package/src/plugins/analysis/ReactAnalyzer.ts +57 -57
- package/src/plugins/analysis/RustAnalyzer.ts +16 -11
- package/src/plugins/analysis/SQLiteAnalyzer.ts +13 -7
- package/src/plugins/analysis/ServiceLayerAnalyzer.ts +22 -16
- package/src/plugins/analysis/SocketIOAnalyzer.ts +151 -28
- package/src/plugins/analysis/SystemDbAnalyzer.ts +16 -11
- package/src/plugins/analysis/ast/GraphBuilder.ts +1947 -327
- package/src/plugins/analysis/ast/IdGenerator.ts +177 -0
- package/src/plugins/analysis/ast/types.ts +596 -6
- package/src/plugins/analysis/ast/utils/createParameterNodes.ts +104 -0
- package/src/plugins/analysis/ast/utils/index.ts +12 -0
- package/src/plugins/analysis/ast/utils/location.ts +103 -0
- package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +19 -8
- package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +924 -83
- package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +97 -44
- package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +234 -93
- package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +124 -9
- package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +41 -14
- package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +294 -49
- package/src/plugins/discovery/MonorepoServiceDiscovery.ts +3 -2
- package/src/plugins/discovery/SimpleProjectDiscovery.ts +6 -1
- package/src/plugins/discovery/WorkspaceDiscovery.ts +184 -0
- package/src/plugins/discovery/resolveSourceEntrypoint.ts +103 -0
- package/src/plugins/discovery/workspaces/detector.ts +63 -0
- package/src/plugins/discovery/workspaces/globResolver.ts +229 -0
- package/src/plugins/discovery/workspaces/index.ts +23 -0
- package/src/plugins/discovery/workspaces/parsers.ts +99 -0
- package/src/plugins/enrichment/AliasTracker.ts +35 -8
- package/src/plugins/enrichment/ArgumentParameterLinker.ts +240 -0
- package/src/plugins/enrichment/ClosureCaptureEnricher.ts +267 -0
- package/src/plugins/enrichment/ExternalCallResolver.ts +262 -0
- package/src/plugins/enrichment/FunctionCallResolver.ts +456 -0
- package/src/plugins/enrichment/HTTPConnectionEnricher.ts +84 -27
- package/src/plugins/enrichment/ImportExportLinker.ts +24 -6
- package/src/plugins/enrichment/MethodCallResolver.ts +39 -13
- package/src/plugins/enrichment/MountPointResolver.ts +208 -195
- package/src/plugins/enrichment/NodejsBuiltinsResolver.ts +365 -0
- package/src/plugins/enrichment/PrefixEvaluator.ts +16 -7
- package/src/plugins/enrichment/RustFFIEnricher.ts +6 -5
- package/src/plugins/enrichment/ValueDomainAnalyzer.ts +209 -189
- package/src/plugins/indexing/IncrementalModuleIndexer.ts +23 -14
- package/src/plugins/indexing/JSModuleIndexer.ts +140 -34
- package/src/plugins/indexing/RustModuleIndexer.ts +8 -7
- package/src/plugins/validation/BrokenImportValidator.ts +325 -0
- package/src/plugins/validation/CallResolverValidator.ts +131 -110
- package/src/plugins/validation/DataFlowValidator.ts +88 -67
- package/src/plugins/validation/EvalBanValidator.ts +17 -16
- package/src/plugins/validation/GraphConnectivityValidator.ts +58 -24
- package/src/plugins/validation/NodeCreationValidator.ts +554 -0
- package/src/plugins/validation/SQLInjectionValidator.ts +63 -20
- package/src/plugins/validation/ShadowingDetector.ts +6 -5
- package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +12 -11
- package/src/plugins/vcs/GitPlugin.ts +40 -12
- package/src/plugins/vcs/VCSPlugin.ts +7 -5
- package/src/queries/README.md +46 -0
- package/src/queries/findCallsInFunction.ts +206 -0
- package/src/queries/findContainingFunction.ts +83 -0
- package/src/queries/index.ts +23 -0
- package/src/queries/traceValues.ts +398 -0
- package/src/queries/types.ts +187 -0
- package/src/schema/GraphSchemaExtractor.ts +177 -0
- package/src/schema/InterfaceSchemaExtractor.ts +173 -0
- package/src/schema/index.ts +5 -0
- package/src/storage/backends/RFDBServerBackend.ts +100 -98
- package/src/storage/backends/typeValidation.ts +1 -0
- package/src/validation/PathValidator.ts +1 -1
- package/dist/core/AnalysisWorker.d.ts +0 -14
- package/dist/core/AnalysisWorker.d.ts.map +0 -1
- package/dist/core/AnalysisWorker.js +0 -307
- package/dist/core/ParallelAnalyzer.d.ts +0 -120
- package/dist/core/ParallelAnalyzer.d.ts.map +0 -1
- package/dist/core/ParallelAnalyzer.js +0 -331
- package/dist/core/QueueWorker.d.ts +0 -12
- package/dist/core/QueueWorker.d.ts.map +0 -1
- package/dist/core/QueueWorker.js +0 -567
- package/dist/core/RFDBClient.d.ts +0 -179
- package/dist/core/RFDBClient.d.ts.map +0 -1
- package/dist/core/RFDBClient.js +0 -429
- package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +0 -19
- package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +0 -1
- package/dist/plugins/discovery/ZonServiceDiscovery.js +0 -204
- package/src/core/AnalysisWorker.ts +0 -410
- package/src/core/ParallelAnalyzer.ts +0 -476
- package/src/core/QueueWorker.ts +0 -780
- package/src/plugins/indexing/ServiceDetector.ts +0 -230
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkspaceDiscovery - Discovery plugin for npm/pnpm/yarn/lerna workspaces
|
|
3
|
+
*
|
|
4
|
+
* Detects workspace configuration and creates SERVICE nodes for each package.
|
|
5
|
+
* Priority: 110 (higher than MonorepoServiceDiscovery at 100)
|
|
6
|
+
*
|
|
7
|
+
* Supports:
|
|
8
|
+
* - pnpm-workspace.yaml
|
|
9
|
+
* - package.json workspaces (npm/yarn)
|
|
10
|
+
* - lerna.json
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { join } from 'path';
|
|
14
|
+
|
|
15
|
+
import { DiscoveryPlugin } from './DiscoveryPlugin.js';
|
|
16
|
+
import { createSuccessResult, createErrorResult } from '../Plugin.js';
|
|
17
|
+
import type { PluginContext, PluginResult, PluginMetadata } from '../Plugin.js';
|
|
18
|
+
import { detectWorkspaceType } from './workspaces/detector.js';
|
|
19
|
+
import { parsePnpmWorkspace, parseNpmWorkspace, parseLernaConfig } from './workspaces/parsers.js';
|
|
20
|
+
import { resolveWorkspacePackages, type WorkspacePackage } from './workspaces/globResolver.js';
|
|
21
|
+
import { NodeFactory } from '../../core/NodeFactory.js';
|
|
22
|
+
import { resolveSourceEntrypoint } from './resolveSourceEntrypoint.js';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Service info returned in result metadata
|
|
26
|
+
*/
|
|
27
|
+
interface ServiceInfo {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
path: string;
|
|
31
|
+
type: string;
|
|
32
|
+
metadata: {
|
|
33
|
+
workspaceType: string;
|
|
34
|
+
relativePath: string;
|
|
35
|
+
entrypoint: string | null;
|
|
36
|
+
packageJson: Record<string, unknown>;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export class WorkspaceDiscovery extends DiscoveryPlugin {
|
|
41
|
+
get metadata(): PluginMetadata {
|
|
42
|
+
return {
|
|
43
|
+
name: 'WorkspaceDiscovery',
|
|
44
|
+
phase: 'DISCOVERY',
|
|
45
|
+
priority: 110, // Higher than MonorepoServiceDiscovery (100)
|
|
46
|
+
creates: {
|
|
47
|
+
nodes: ['SERVICE'],
|
|
48
|
+
edges: []
|
|
49
|
+
},
|
|
50
|
+
dependencies: []
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async execute(context: PluginContext): Promise<PluginResult> {
|
|
55
|
+
const logger = this.log(context);
|
|
56
|
+
const { projectPath, graph } = context;
|
|
57
|
+
|
|
58
|
+
// Validate projectPath
|
|
59
|
+
if (!projectPath) {
|
|
60
|
+
return createErrorResult(new Error('projectPath is required'));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
logger.debug('Detecting workspace type', { projectPath });
|
|
64
|
+
|
|
65
|
+
// Step 1: Detect workspace type
|
|
66
|
+
const detection = detectWorkspaceType(projectPath);
|
|
67
|
+
|
|
68
|
+
if (!detection.type) {
|
|
69
|
+
logger.debug('Not a workspace project, skipping');
|
|
70
|
+
return createSuccessResult({ nodes: 0, edges: 0 }, {
|
|
71
|
+
services: [],
|
|
72
|
+
skipped: true,
|
|
73
|
+
reason: 'No workspace configuration found'
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
logger.info('Workspace detected', {
|
|
78
|
+
type: detection.type,
|
|
79
|
+
configPath: detection.configPath
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// Step 2: Parse workspace configuration
|
|
83
|
+
let config;
|
|
84
|
+
try {
|
|
85
|
+
switch (detection.type) {
|
|
86
|
+
case 'pnpm':
|
|
87
|
+
config = parsePnpmWorkspace(detection.configPath!);
|
|
88
|
+
break;
|
|
89
|
+
case 'npm':
|
|
90
|
+
case 'yarn':
|
|
91
|
+
config = parseNpmWorkspace(detection.configPath!);
|
|
92
|
+
break;
|
|
93
|
+
case 'lerna':
|
|
94
|
+
config = parseLernaConfig(detection.configPath!);
|
|
95
|
+
break;
|
|
96
|
+
default:
|
|
97
|
+
throw new Error(`Unknown workspace type: ${detection.type}`);
|
|
98
|
+
}
|
|
99
|
+
} catch (error) {
|
|
100
|
+
return createErrorResult(error as Error);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
logger.debug('Workspace config parsed', {
|
|
104
|
+
patterns: config.patterns,
|
|
105
|
+
negativePatterns: config.negativePatterns
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
// Step 3: Resolve patterns to packages
|
|
109
|
+
const packages = resolveWorkspacePackages(projectPath, config);
|
|
110
|
+
|
|
111
|
+
logger.info('Workspace packages resolved', { count: packages.length });
|
|
112
|
+
|
|
113
|
+
// Step 4: Create SERVICE nodes
|
|
114
|
+
const services: ServiceInfo[] = [];
|
|
115
|
+
|
|
116
|
+
for (const pkg of packages) {
|
|
117
|
+
const serviceNode = this.createServiceNode(pkg, detection.type!, projectPath);
|
|
118
|
+
|
|
119
|
+
await graph.addNode(serviceNode);
|
|
120
|
+
|
|
121
|
+
services.push({
|
|
122
|
+
id: serviceNode.id,
|
|
123
|
+
name: pkg.name,
|
|
124
|
+
path: pkg.path,
|
|
125
|
+
type: 'workspace-package',
|
|
126
|
+
metadata: {
|
|
127
|
+
workspaceType: detection.type!,
|
|
128
|
+
relativePath: pkg.relativePath,
|
|
129
|
+
entrypoint: (serviceNode.metadata?.entrypoint as string | null) ?? null,
|
|
130
|
+
packageJson: pkg.packageJson as Record<string, unknown>
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
logger.info('Services created from workspace', {
|
|
136
|
+
count: services.length,
|
|
137
|
+
workspaceType: detection.type
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
return createSuccessResult(
|
|
141
|
+
{ nodes: services.length, edges: 0 },
|
|
142
|
+
{ services, workspaceType: detection.type }
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Create SERVICE node from workspace package.
|
|
148
|
+
*/
|
|
149
|
+
private createServiceNode(pkg: WorkspacePackage, workspaceType: string, _projectPath: string) {
|
|
150
|
+
// Resolve entrypoint (prefer TypeScript source)
|
|
151
|
+
const relativeEntrypoint = resolveSourceEntrypoint(pkg.path, pkg.packageJson)
|
|
152
|
+
?? (pkg.packageJson.main as string | undefined)
|
|
153
|
+
?? null;
|
|
154
|
+
|
|
155
|
+
// Convert to absolute path (REG-247: JSModuleIndexer expects absolute paths)
|
|
156
|
+
const absoluteEntrypoint = relativeEntrypoint
|
|
157
|
+
? join(pkg.path, relativeEntrypoint)
|
|
158
|
+
: null;
|
|
159
|
+
|
|
160
|
+
const serviceNode = NodeFactory.createService(pkg.name, pkg.path, {
|
|
161
|
+
discoveryMethod: 'workspace',
|
|
162
|
+
entrypoint: absoluteEntrypoint ?? undefined,
|
|
163
|
+
version: pkg.packageJson.version as string | undefined,
|
|
164
|
+
description: pkg.packageJson.description as string | undefined,
|
|
165
|
+
dependencies: Object.keys(pkg.packageJson.dependencies || {})
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// Add metadata for workspace-specific information
|
|
169
|
+
// BaseNodeRecord supports optional metadata field
|
|
170
|
+
const nodeWithMetadata = serviceNode as typeof serviceNode & { metadata: Record<string, unknown> };
|
|
171
|
+
nodeWithMetadata.metadata = {
|
|
172
|
+
workspaceType,
|
|
173
|
+
discoveryMethod: 'workspace',
|
|
174
|
+
relativePath: pkg.relativePath,
|
|
175
|
+
version: pkg.packageJson.version as string | undefined,
|
|
176
|
+
description: pkg.packageJson.description as string | undefined,
|
|
177
|
+
private: pkg.packageJson.private as boolean | undefined,
|
|
178
|
+
dependencies: Object.keys(pkg.packageJson.dependencies || {}),
|
|
179
|
+
entrypoint: absoluteEntrypoint
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
return nodeWithMetadata;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves TypeScript source entrypoints for projects.
|
|
3
|
+
*
|
|
4
|
+
* This utility prefers TypeScript source files (src/index.ts) over compiled
|
|
5
|
+
* output (dist/index.js) when analyzing TypeScript projects.
|
|
6
|
+
*
|
|
7
|
+
* Resolution order:
|
|
8
|
+
* 1. If no tsconfig.json exists -> return null (not a TypeScript project)
|
|
9
|
+
* 2. Check package.json "source" field (explicit source declaration)
|
|
10
|
+
* 3. Try standard TypeScript source candidates
|
|
11
|
+
* 4. Return null if no source found (caller should fallback to main)
|
|
12
|
+
*
|
|
13
|
+
* @module resolveSourceEntrypoint
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { existsSync } from 'fs';
|
|
17
|
+
import { join } from 'path';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Package.json fields relevant for source resolution
|
|
21
|
+
*/
|
|
22
|
+
export interface PackageJsonForResolution {
|
|
23
|
+
main?: string;
|
|
24
|
+
source?: string; // Used by bundlers like Parcel
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Standard TypeScript source candidates in priority order.
|
|
29
|
+
*
|
|
30
|
+
* Order rationale:
|
|
31
|
+
* - src/ is the most common convention
|
|
32
|
+
* - lib/ is used by some projects
|
|
33
|
+
* - root-level is fallback
|
|
34
|
+
* - index is more common than main
|
|
35
|
+
* - .ts preferred over .tsx over .mts
|
|
36
|
+
*/
|
|
37
|
+
const TS_SOURCE_CANDIDATES = [
|
|
38
|
+
'src/index.ts',
|
|
39
|
+
'src/index.tsx',
|
|
40
|
+
'src/index.mts',
|
|
41
|
+
'src/main.ts',
|
|
42
|
+
'src/main.tsx',
|
|
43
|
+
'lib/index.ts',
|
|
44
|
+
'lib/index.tsx',
|
|
45
|
+
'index.ts',
|
|
46
|
+
'index.tsx',
|
|
47
|
+
'index.mts',
|
|
48
|
+
'main.ts',
|
|
49
|
+
'main.tsx',
|
|
50
|
+
] as const;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Resolves the source entrypoint for a project, preferring TypeScript source
|
|
54
|
+
* over compiled output.
|
|
55
|
+
*
|
|
56
|
+
* @param projectPath - Absolute path to the project/service directory
|
|
57
|
+
* @param packageJson - Parsed package.json content (only relevant fields needed)
|
|
58
|
+
* @returns Source entrypoint relative to projectPath, or null if not found
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* // TypeScript project with src/index.ts
|
|
62
|
+
* resolveSourceEntrypoint('/path/to/project', { main: 'dist/index.js' })
|
|
63
|
+
* // Returns: 'src/index.ts'
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* // JavaScript project (no tsconfig.json)
|
|
67
|
+
* resolveSourceEntrypoint('/path/to/project', { main: 'index.js' })
|
|
68
|
+
* // Returns: null
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* // TypeScript project with explicit source field
|
|
72
|
+
* resolveSourceEntrypoint('/path/to/project', { main: 'dist/index.js', source: 'lib/entry.ts' })
|
|
73
|
+
* // Returns: 'lib/entry.ts' (if file exists)
|
|
74
|
+
*/
|
|
75
|
+
export function resolveSourceEntrypoint(
|
|
76
|
+
projectPath: string,
|
|
77
|
+
packageJson: PackageJsonForResolution
|
|
78
|
+
): string | null {
|
|
79
|
+
// Step 1: Check for TypeScript project indicator
|
|
80
|
+
const tsconfigPath = join(projectPath, 'tsconfig.json');
|
|
81
|
+
if (!existsSync(tsconfigPath)) {
|
|
82
|
+
return null; // Not a TypeScript project
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Step 2: Check package.json "source" field (explicit source declaration)
|
|
86
|
+
if (packageJson.source) {
|
|
87
|
+
const sourcePath = join(projectPath, packageJson.source);
|
|
88
|
+
if (existsSync(sourcePath)) {
|
|
89
|
+
return packageJson.source;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Step 3: Try standard TypeScript source candidates
|
|
94
|
+
for (const candidate of TS_SOURCE_CANDIDATES) {
|
|
95
|
+
const candidatePath = join(projectPath, candidate);
|
|
96
|
+
if (existsSync(candidatePath)) {
|
|
97
|
+
return candidate;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Step 4: Not found - caller should fallback to main
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace Type Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects which workspace system is used in a project by checking
|
|
5
|
+
* for configuration files in priority order: pnpm > npm/yarn > lerna.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { existsSync, readFileSync } from 'fs';
|
|
9
|
+
import { join } from 'path';
|
|
10
|
+
|
|
11
|
+
export type WorkspaceType = 'pnpm' | 'npm' | 'yarn' | 'lerna' | null;
|
|
12
|
+
|
|
13
|
+
export interface WorkspaceDetectionResult {
|
|
14
|
+
type: WorkspaceType;
|
|
15
|
+
configPath: string | null;
|
|
16
|
+
rootPath: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Detect workspace type by checking for configuration files.
|
|
21
|
+
* Priority: pnpm > npm/yarn > lerna (most specific first)
|
|
22
|
+
*
|
|
23
|
+
* @param projectPath - Root directory of the project
|
|
24
|
+
* @returns Detection result with type, config path, and root path
|
|
25
|
+
*/
|
|
26
|
+
export function detectWorkspaceType(projectPath: string): WorkspaceDetectionResult {
|
|
27
|
+
// 1. Check for pnpm-workspace.yaml (highest priority)
|
|
28
|
+
const pnpmYaml = join(projectPath, 'pnpm-workspace.yaml');
|
|
29
|
+
const pnpmYml = join(projectPath, 'pnpm-workspace.yml');
|
|
30
|
+
|
|
31
|
+
if (existsSync(pnpmYaml)) {
|
|
32
|
+
return { type: 'pnpm', configPath: pnpmYaml, rootPath: projectPath };
|
|
33
|
+
}
|
|
34
|
+
if (existsSync(pnpmYml)) {
|
|
35
|
+
return { type: 'pnpm', configPath: pnpmYml, rootPath: projectPath };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// 2. Check for npm/yarn workspaces in package.json
|
|
39
|
+
const packageJsonPath = join(projectPath, 'package.json');
|
|
40
|
+
if (existsSync(packageJsonPath)) {
|
|
41
|
+
try {
|
|
42
|
+
const content = readFileSync(packageJsonPath, 'utf-8');
|
|
43
|
+
const pkg = JSON.parse(content);
|
|
44
|
+
|
|
45
|
+
if (pkg.workspaces) {
|
|
46
|
+
// Both npm and yarn use package.json workspaces - detect as 'npm'
|
|
47
|
+
// The format is compatible for both
|
|
48
|
+
return { type: 'npm', configPath: packageJsonPath, rootPath: projectPath };
|
|
49
|
+
}
|
|
50
|
+
} catch {
|
|
51
|
+
// Ignore JSON parse errors
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// 3. Check for lerna.json
|
|
56
|
+
const lernaJsonPath = join(projectPath, 'lerna.json');
|
|
57
|
+
if (existsSync(lernaJsonPath)) {
|
|
58
|
+
return { type: 'lerna', configPath: lernaJsonPath, rootPath: projectPath };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// No workspace configuration found
|
|
62
|
+
return { type: null, configPath: null, rootPath: projectPath };
|
|
63
|
+
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Glob Resolver for Workspace Packages
|
|
3
|
+
*
|
|
4
|
+
* Resolves workspace glob patterns to actual directories containing package.json.
|
|
5
|
+
* Uses minimatch for pattern matching.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { readdirSync, statSync, existsSync, readFileSync, lstatSync } from 'fs';
|
|
9
|
+
import { join, relative } from 'path';
|
|
10
|
+
import { minimatch } from 'minimatch';
|
|
11
|
+
import type { WorkspaceConfig } from './parsers.js';
|
|
12
|
+
|
|
13
|
+
export interface WorkspacePackage {
|
|
14
|
+
path: string;
|
|
15
|
+
name: string;
|
|
16
|
+
relativePath: string;
|
|
17
|
+
packageJson: PackageJson;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
interface PackageJson {
|
|
21
|
+
name?: string;
|
|
22
|
+
version?: string;
|
|
23
|
+
main?: string;
|
|
24
|
+
source?: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
private?: boolean;
|
|
27
|
+
dependencies?: Record<string, string>;
|
|
28
|
+
devDependencies?: Record<string, string>;
|
|
29
|
+
[key: string]: unknown;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Resolve workspace glob patterns to actual packages.
|
|
34
|
+
* Only directories with package.json are considered valid packages.
|
|
35
|
+
*
|
|
36
|
+
* @param projectPath - Root directory of the project
|
|
37
|
+
* @param config - Parsed workspace config with patterns and negativePatterns
|
|
38
|
+
* @returns Array of resolved workspace packages
|
|
39
|
+
*/
|
|
40
|
+
export function resolveWorkspacePackages(
|
|
41
|
+
projectPath: string,
|
|
42
|
+
config: WorkspaceConfig
|
|
43
|
+
): WorkspacePackage[] {
|
|
44
|
+
const packages: WorkspacePackage[] = [];
|
|
45
|
+
const seen = new Set<string>();
|
|
46
|
+
|
|
47
|
+
// Expand all positive patterns
|
|
48
|
+
for (const pattern of config.patterns) {
|
|
49
|
+
const matches = expandGlob(projectPath, pattern);
|
|
50
|
+
|
|
51
|
+
for (const dir of matches) {
|
|
52
|
+
// Check for package.json
|
|
53
|
+
const pkgJsonPath = join(dir, 'package.json');
|
|
54
|
+
if (!existsSync(pkgJsonPath)) continue;
|
|
55
|
+
|
|
56
|
+
// Check negative patterns
|
|
57
|
+
const relPath = relative(projectPath, dir);
|
|
58
|
+
if (config.negativePatterns.some(neg => matchesPattern(relPath, neg))) continue;
|
|
59
|
+
|
|
60
|
+
// Avoid duplicates
|
|
61
|
+
if (seen.has(dir)) continue;
|
|
62
|
+
seen.add(dir);
|
|
63
|
+
|
|
64
|
+
// Parse package.json
|
|
65
|
+
let pkgJson: PackageJson;
|
|
66
|
+
try {
|
|
67
|
+
pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
|
|
68
|
+
} catch {
|
|
69
|
+
// Skip malformed package.json
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
packages.push({
|
|
74
|
+
path: dir,
|
|
75
|
+
name: pkgJson.name || relPath.split('/').pop() || relPath,
|
|
76
|
+
relativePath: relPath,
|
|
77
|
+
packageJson: pkgJson
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return packages;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Check if path matches pattern using minimatch.
|
|
87
|
+
* Normalizes path separators for cross-platform compatibility.
|
|
88
|
+
*/
|
|
89
|
+
function matchesPattern(path: string, pattern: string): boolean {
|
|
90
|
+
// Normalize path separators
|
|
91
|
+
const normalizedPath = path.replace(/\\/g, '/');
|
|
92
|
+
const normalizedPattern = pattern.replace(/\\/g, '/');
|
|
93
|
+
return minimatch(normalizedPath, normalizedPattern);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Expand glob pattern to actual directories.
|
|
98
|
+
*/
|
|
99
|
+
function expandGlob(basePath: string, pattern: string): string[] {
|
|
100
|
+
// Handle literal path (no wildcards)
|
|
101
|
+
if (!pattern.includes('*')) {
|
|
102
|
+
const fullPath = join(basePath, pattern);
|
|
103
|
+
if (existsSync(fullPath) && isDirectory(fullPath)) {
|
|
104
|
+
return [fullPath];
|
|
105
|
+
}
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Handle recursive glob (**)
|
|
110
|
+
if (pattern.includes('**')) {
|
|
111
|
+
return expandRecursiveGlob(basePath, pattern);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Handle simple glob (packages/*)
|
|
115
|
+
return expandSimpleGlob(basePath, pattern);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Expand simple glob like "packages/*" or "apps/*".
|
|
120
|
+
*/
|
|
121
|
+
function expandSimpleGlob(basePath: string, pattern: string): string[] {
|
|
122
|
+
const parts = pattern.split('/');
|
|
123
|
+
const results: string[] = [];
|
|
124
|
+
|
|
125
|
+
// Find the first part with a wildcard
|
|
126
|
+
let currentPath = basePath;
|
|
127
|
+
let patternIndex = 0;
|
|
128
|
+
|
|
129
|
+
// Navigate to the parent directory of the glob
|
|
130
|
+
while (patternIndex < parts.length - 1) {
|
|
131
|
+
currentPath = join(currentPath, parts[patternIndex]);
|
|
132
|
+
patternIndex++;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// The last part contains the wildcard
|
|
136
|
+
const globPart = parts[patternIndex];
|
|
137
|
+
|
|
138
|
+
if (!existsSync(currentPath)) {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
const entries = readdirSync(currentPath);
|
|
144
|
+
for (const entry of entries) {
|
|
145
|
+
if (minimatch(entry, globPart)) {
|
|
146
|
+
const fullPath = join(currentPath, entry);
|
|
147
|
+
if (isDirectory(fullPath)) {
|
|
148
|
+
results.push(fullPath);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
} catch {
|
|
153
|
+
// Ignore permission errors
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return results;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Expand recursive glob like "apps/**" or "libs/**".
|
|
161
|
+
* Recursively walks directories and matches against pattern.
|
|
162
|
+
*/
|
|
163
|
+
function expandRecursiveGlob(basePath: string, pattern: string): string[] {
|
|
164
|
+
const results: string[] = [];
|
|
165
|
+
const maxDepth = 10; // Safety limit
|
|
166
|
+
|
|
167
|
+
function walk(dir: string, depth: number): void {
|
|
168
|
+
if (depth > maxDepth) return;
|
|
169
|
+
|
|
170
|
+
try {
|
|
171
|
+
const entries = readdirSync(dir);
|
|
172
|
+
|
|
173
|
+
for (const entry of entries) {
|
|
174
|
+
// Skip hidden directories and node_modules
|
|
175
|
+
if (entry.startsWith('.') || entry === 'node_modules') continue;
|
|
176
|
+
|
|
177
|
+
const fullPath = join(dir, entry);
|
|
178
|
+
|
|
179
|
+
// Skip symlinks to avoid infinite loops
|
|
180
|
+
if (!isDirectory(fullPath)) continue;
|
|
181
|
+
|
|
182
|
+
const relPath = relative(basePath, fullPath);
|
|
183
|
+
|
|
184
|
+
// Check if this directory matches the pattern
|
|
185
|
+
if (minimatch(relPath, pattern, { dot: false })) {
|
|
186
|
+
results.push(fullPath);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Continue walking regardless of match (** can match at any depth)
|
|
190
|
+
walk(fullPath, depth + 1);
|
|
191
|
+
}
|
|
192
|
+
} catch {
|
|
193
|
+
// Ignore permission errors
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// Start walking from pattern prefix or base
|
|
198
|
+
const parts = pattern.split('**');
|
|
199
|
+
const prefix = parts[0].replace(/\/$/, ''); // Remove trailing slash
|
|
200
|
+
|
|
201
|
+
if (prefix) {
|
|
202
|
+
const startPath = join(basePath, prefix);
|
|
203
|
+
if (existsSync(startPath) && isDirectory(startPath)) {
|
|
204
|
+
// Check if the start path itself matches
|
|
205
|
+
const relPath = relative(basePath, startPath);
|
|
206
|
+
if (minimatch(relPath, pattern, { dot: false })) {
|
|
207
|
+
results.push(startPath);
|
|
208
|
+
}
|
|
209
|
+
walk(startPath, 0);
|
|
210
|
+
}
|
|
211
|
+
} else {
|
|
212
|
+
walk(basePath, 0);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return results;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Check if path is a directory (not following symlinks).
|
|
220
|
+
*/
|
|
221
|
+
function isDirectory(path: string): boolean {
|
|
222
|
+
try {
|
|
223
|
+
const stat = lstatSync(path);
|
|
224
|
+
// Return true for real directories, false for symlinks
|
|
225
|
+
return stat.isDirectory() && !stat.isSymbolicLink();
|
|
226
|
+
} catch {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace Detection and Resolution
|
|
3
|
+
*
|
|
4
|
+
* Exports utilities for detecting workspace types and resolving workspace packages.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export {
|
|
8
|
+
detectWorkspaceType,
|
|
9
|
+
type WorkspaceType,
|
|
10
|
+
type WorkspaceDetectionResult
|
|
11
|
+
} from './detector.js';
|
|
12
|
+
|
|
13
|
+
export {
|
|
14
|
+
parsePnpmWorkspace,
|
|
15
|
+
parseNpmWorkspace,
|
|
16
|
+
parseLernaConfig,
|
|
17
|
+
type WorkspaceConfig
|
|
18
|
+
} from './parsers.js';
|
|
19
|
+
|
|
20
|
+
export {
|
|
21
|
+
resolveWorkspacePackages,
|
|
22
|
+
type WorkspacePackage
|
|
23
|
+
} from './globResolver.js';
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace Config Parsers
|
|
3
|
+
*
|
|
4
|
+
* Parse workspace configuration files and extract glob patterns.
|
|
5
|
+
* Supports pnpm-workspace.yaml, package.json workspaces, and lerna.json.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { readFileSync } from 'fs';
|
|
9
|
+
import { parse as parseYaml } from 'yaml';
|
|
10
|
+
|
|
11
|
+
export interface WorkspaceConfig {
|
|
12
|
+
patterns: string[];
|
|
13
|
+
negativePatterns: string[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Parse pnpm-workspace.yaml
|
|
18
|
+
*
|
|
19
|
+
* Format:
|
|
20
|
+
* packages:
|
|
21
|
+
* - 'packages/*'
|
|
22
|
+
* - 'apps/**'
|
|
23
|
+
* - '!packages/internal'
|
|
24
|
+
*/
|
|
25
|
+
export function parsePnpmWorkspace(configPath: string): WorkspaceConfig {
|
|
26
|
+
const content = readFileSync(configPath, 'utf-8');
|
|
27
|
+
const config = parseYaml(content) as { packages?: string[] };
|
|
28
|
+
|
|
29
|
+
const patterns: string[] = [];
|
|
30
|
+
const negativePatterns: string[] = [];
|
|
31
|
+
|
|
32
|
+
for (const pattern of config.packages || []) {
|
|
33
|
+
if (pattern.startsWith('!')) {
|
|
34
|
+
negativePatterns.push(pattern.slice(1));
|
|
35
|
+
} else {
|
|
36
|
+
patterns.push(pattern);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return { patterns, negativePatterns };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Parse npm/yarn workspaces from package.json
|
|
45
|
+
*
|
|
46
|
+
* Formats:
|
|
47
|
+
* - Array: { "workspaces": ["packages/*", "apps/**"] }
|
|
48
|
+
* - Object (yarn): { "workspaces": { "packages": ["packages/*"], "nohoist": [...] } }
|
|
49
|
+
*/
|
|
50
|
+
export function parseNpmWorkspace(packageJsonPath: string): WorkspaceConfig {
|
|
51
|
+
const content = readFileSync(packageJsonPath, 'utf-8');
|
|
52
|
+
const pkg = JSON.parse(content) as {
|
|
53
|
+
workspaces?: string[] | { packages?: string[] };
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
let workspaces: string[] = [];
|
|
57
|
+
|
|
58
|
+
if (Array.isArray(pkg.workspaces)) {
|
|
59
|
+
workspaces = pkg.workspaces;
|
|
60
|
+
} else if (pkg.workspaces?.packages) {
|
|
61
|
+
workspaces = pkg.workspaces.packages;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const patterns: string[] = [];
|
|
65
|
+
const negativePatterns: string[] = [];
|
|
66
|
+
|
|
67
|
+
for (const pattern of workspaces) {
|
|
68
|
+
if (pattern.startsWith('!')) {
|
|
69
|
+
negativePatterns.push(pattern.slice(1));
|
|
70
|
+
} else {
|
|
71
|
+
patterns.push(pattern);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return { patterns, negativePatterns };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Parse lerna.json
|
|
80
|
+
*
|
|
81
|
+
* Format:
|
|
82
|
+
* { "packages": ["packages/*", "components/*"] }
|
|
83
|
+
*
|
|
84
|
+
* Default: ["packages/*"] if packages field is missing
|
|
85
|
+
*/
|
|
86
|
+
export function parseLernaConfig(lernaJsonPath: string): WorkspaceConfig {
|
|
87
|
+
const content = readFileSync(lernaJsonPath, 'utf-8');
|
|
88
|
+
const config = JSON.parse(content) as { packages?: string[] };
|
|
89
|
+
|
|
90
|
+
// Lerna defaults to packages/* if not specified
|
|
91
|
+
const packages = config.packages ?? ['packages/*'];
|
|
92
|
+
|
|
93
|
+
// Return empty if explicitly set to empty array
|
|
94
|
+
if (packages.length === 0) {
|
|
95
|
+
return { patterns: [], negativePatterns: [] };
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return { patterns: packages, negativePatterns: [] };
|
|
99
|
+
}
|