@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.
Files changed (530) hide show
  1. package/README.md +0 -1
  2. package/dist/Orchestrator.d.ts +31 -2
  3. package/dist/Orchestrator.d.ts.map +1 -1
  4. package/dist/Orchestrator.js +222 -27
  5. package/dist/config/ConfigLoader.d.ts +90 -0
  6. package/dist/config/ConfigLoader.d.ts.map +1 -0
  7. package/dist/config/ConfigLoader.js +249 -0
  8. package/dist/config/index.d.ts +6 -0
  9. package/dist/config/index.d.ts.map +1 -0
  10. package/dist/config/index.js +4 -0
  11. package/dist/core/ASTWorker.d.ts +11 -36
  12. package/dist/core/ASTWorker.d.ts.map +1 -1
  13. package/dist/core/ASTWorker.js +93 -99
  14. package/dist/core/CoverageAnalyzer.d.ts +65 -0
  15. package/dist/core/CoverageAnalyzer.d.ts.map +1 -0
  16. package/dist/core/CoverageAnalyzer.js +198 -0
  17. package/dist/core/FileExplainer.d.ts +101 -0
  18. package/dist/core/FileExplainer.d.ts.map +1 -0
  19. package/dist/core/FileExplainer.js +139 -0
  20. package/dist/core/FileNodeManager.d.ts +40 -0
  21. package/dist/core/FileNodeManager.d.ts.map +1 -0
  22. package/dist/core/FileNodeManager.js +84 -0
  23. package/dist/core/GraphFreshnessChecker.d.ts +33 -0
  24. package/dist/core/GraphFreshnessChecker.d.ts.map +1 -0
  25. package/dist/core/GraphFreshnessChecker.js +101 -0
  26. package/dist/core/HashUtils.d.ts +24 -0
  27. package/dist/core/HashUtils.d.ts.map +1 -0
  28. package/dist/core/HashUtils.js +45 -0
  29. package/dist/core/IncrementalReanalyzer.d.ts +36 -0
  30. package/dist/core/IncrementalReanalyzer.d.ts.map +1 -0
  31. package/dist/core/IncrementalReanalyzer.js +132 -0
  32. package/dist/core/NodeFactory.d.ts +266 -19
  33. package/dist/core/NodeFactory.d.ts.map +1 -1
  34. package/dist/core/NodeFactory.js +256 -21
  35. package/dist/core/ScopeTracker.d.ts +84 -0
  36. package/dist/core/ScopeTracker.d.ts.map +1 -0
  37. package/dist/core/ScopeTracker.js +116 -0
  38. package/dist/core/SemanticId.d.ts +90 -0
  39. package/dist/core/SemanticId.d.ts.map +1 -0
  40. package/dist/core/SemanticId.js +115 -0
  41. package/dist/core/VersionManager.d.ts.map +1 -1
  42. package/dist/core/VersionManager.js +3 -2
  43. package/dist/core/nodes/ArgumentExpressionNode.d.ts +43 -0
  44. package/dist/core/nodes/ArgumentExpressionNode.d.ts.map +1 -0
  45. package/dist/core/nodes/ArgumentExpressionNode.js +60 -0
  46. package/dist/core/nodes/ArrayLiteralNode.d.ts +27 -0
  47. package/dist/core/nodes/ArrayLiteralNode.d.ts.map +1 -0
  48. package/dist/core/nodes/ArrayLiteralNode.js +43 -0
  49. package/dist/core/nodes/BranchNode.d.ts +41 -0
  50. package/dist/core/nodes/BranchNode.d.ts.map +1 -0
  51. package/dist/core/nodes/BranchNode.js +82 -0
  52. package/dist/core/nodes/CallSiteNode.d.ts +30 -2
  53. package/dist/core/nodes/CallSiteNode.d.ts.map +1 -1
  54. package/dist/core/nodes/CallSiteNode.js +54 -4
  55. package/dist/core/nodes/CaseNode.d.ts +43 -0
  56. package/dist/core/nodes/CaseNode.d.ts.map +1 -0
  57. package/dist/core/nodes/CaseNode.js +81 -0
  58. package/dist/core/nodes/ClassNode.d.ts +34 -2
  59. package/dist/core/nodes/ClassNode.d.ts.map +1 -1
  60. package/dist/core/nodes/ClassNode.js +52 -4
  61. package/dist/core/nodes/ConstantNode.d.ts +2 -2
  62. package/dist/core/nodes/ConstantNode.d.ts.map +1 -1
  63. package/dist/core/nodes/ConstantNode.js +6 -4
  64. package/dist/core/nodes/ConstructorCallNode.d.ts +51 -0
  65. package/dist/core/nodes/ConstructorCallNode.d.ts.map +1 -0
  66. package/dist/core/nodes/ConstructorCallNode.js +171 -0
  67. package/dist/core/nodes/DatabaseQueryNode.d.ts +3 -2
  68. package/dist/core/nodes/DatabaseQueryNode.d.ts.map +1 -1
  69. package/dist/core/nodes/DatabaseQueryNode.js +5 -2
  70. package/dist/core/nodes/DecoratorNode.d.ts +42 -0
  71. package/dist/core/nodes/DecoratorNode.d.ts.map +1 -0
  72. package/dist/core/nodes/DecoratorNode.js +64 -0
  73. package/dist/core/nodes/EnumNode.d.ts +42 -0
  74. package/dist/core/nodes/EnumNode.d.ts.map +1 -0
  75. package/dist/core/nodes/EnumNode.js +56 -0
  76. package/dist/core/nodes/EventListenerNode.d.ts +4 -4
  77. package/dist/core/nodes/EventListenerNode.d.ts.map +1 -1
  78. package/dist/core/nodes/EventListenerNode.js +7 -4
  79. package/dist/core/nodes/ExportNode.d.ts +38 -2
  80. package/dist/core/nodes/ExportNode.d.ts.map +1 -1
  81. package/dist/core/nodes/ExportNode.js +54 -4
  82. package/dist/core/nodes/ExpressionNode.d.ts +97 -0
  83. package/dist/core/nodes/ExpressionNode.d.ts.map +1 -0
  84. package/dist/core/nodes/ExpressionNode.js +180 -0
  85. package/dist/core/nodes/ExternalModuleNode.d.ts +32 -0
  86. package/dist/core/nodes/ExternalModuleNode.d.ts.map +1 -0
  87. package/dist/core/nodes/ExternalModuleNode.js +49 -0
  88. package/dist/core/nodes/ExternalStdioNode.d.ts +13 -6
  89. package/dist/core/nodes/ExternalStdioNode.d.ts.map +1 -1
  90. package/dist/core/nodes/ExternalStdioNode.js +15 -8
  91. package/dist/core/nodes/FunctionNode.d.ts +36 -0
  92. package/dist/core/nodes/FunctionNode.d.ts.map +1 -1
  93. package/dist/core/nodes/FunctionNode.js +80 -1
  94. package/dist/core/nodes/HttpRequestNode.d.ts +4 -4
  95. package/dist/core/nodes/HttpRequestNode.d.ts.map +1 -1
  96. package/dist/core/nodes/HttpRequestNode.js +7 -4
  97. package/dist/core/nodes/ImportNode.d.ts +28 -6
  98. package/dist/core/nodes/ImportNode.d.ts.map +1 -1
  99. package/dist/core/nodes/ImportNode.js +43 -8
  100. package/dist/core/nodes/InterfaceNode.d.ts +46 -0
  101. package/dist/core/nodes/InterfaceNode.d.ts.map +1 -0
  102. package/dist/core/nodes/InterfaceNode.js +57 -0
  103. package/dist/core/nodes/IssueNode.d.ts +73 -0
  104. package/dist/core/nodes/IssueNode.d.ts.map +1 -0
  105. package/dist/core/nodes/IssueNode.js +129 -0
  106. package/dist/core/nodes/LiteralNode.d.ts +2 -2
  107. package/dist/core/nodes/LiteralNode.d.ts.map +1 -1
  108. package/dist/core/nodes/LiteralNode.js +6 -4
  109. package/dist/core/nodes/MethodCallNode.d.ts +32 -2
  110. package/dist/core/nodes/MethodCallNode.d.ts.map +1 -1
  111. package/dist/core/nodes/MethodCallNode.js +57 -4
  112. package/dist/core/nodes/MethodNode.d.ts +34 -2
  113. package/dist/core/nodes/MethodNode.d.ts.map +1 -1
  114. package/dist/core/nodes/MethodNode.js +55 -3
  115. package/dist/core/nodes/ModuleNode.d.ts +31 -0
  116. package/dist/core/nodes/ModuleNode.d.ts.map +1 -1
  117. package/dist/core/nodes/ModuleNode.js +37 -0
  118. package/dist/core/nodes/NetworkRequestNode.d.ts +54 -0
  119. package/dist/core/nodes/NetworkRequestNode.d.ts.map +1 -0
  120. package/dist/core/nodes/NetworkRequestNode.js +65 -0
  121. package/dist/core/nodes/ObjectLiteralNode.d.ts +27 -0
  122. package/dist/core/nodes/ObjectLiteralNode.d.ts.map +1 -0
  123. package/dist/core/nodes/ObjectLiteralNode.js +43 -0
  124. package/dist/core/nodes/ParameterNode.d.ts +2 -2
  125. package/dist/core/nodes/ParameterNode.d.ts.map +1 -1
  126. package/dist/core/nodes/ParameterNode.js +5 -3
  127. package/dist/core/nodes/ScopeNode.d.ts +31 -0
  128. package/dist/core/nodes/ScopeNode.d.ts.map +1 -1
  129. package/dist/core/nodes/ScopeNode.js +49 -0
  130. package/dist/core/nodes/TypeNode.d.ts +36 -0
  131. package/dist/core/nodes/TypeNode.d.ts.map +1 -0
  132. package/dist/core/nodes/TypeNode.js +55 -0
  133. package/dist/core/nodes/VariableDeclarationNode.d.ts +29 -2
  134. package/dist/core/nodes/VariableDeclarationNode.d.ts.map +1 -1
  135. package/dist/core/nodes/VariableDeclarationNode.js +48 -4
  136. package/dist/core/nodes/index.d.ts +15 -1
  137. package/dist/core/nodes/index.d.ts.map +1 -1
  138. package/dist/core/nodes/index.js +17 -0
  139. package/dist/data/builtins/BuiltinRegistry.d.ts +78 -0
  140. package/dist/data/builtins/BuiltinRegistry.d.ts.map +1 -0
  141. package/dist/data/builtins/BuiltinRegistry.js +110 -0
  142. package/dist/data/builtins/definitions.d.ts +28 -0
  143. package/dist/data/builtins/definitions.d.ts.map +1 -0
  144. package/dist/data/builtins/definitions.js +250 -0
  145. package/dist/data/builtins/index.d.ts +10 -0
  146. package/dist/data/builtins/index.d.ts.map +1 -0
  147. package/dist/data/builtins/index.js +8 -0
  148. package/dist/data/builtins/jsGlobals.d.ts +18 -0
  149. package/dist/data/builtins/jsGlobals.d.ts.map +1 -0
  150. package/dist/data/builtins/jsGlobals.js +26 -0
  151. package/dist/data/builtins/types.d.ts +34 -0
  152. package/dist/data/builtins/types.d.ts.map +1 -0
  153. package/dist/data/builtins/types.js +7 -0
  154. package/dist/data/globals/definitions.d.ts +27 -0
  155. package/dist/data/globals/definitions.d.ts.map +1 -0
  156. package/dist/data/globals/definitions.js +117 -0
  157. package/dist/data/globals/index.d.ts +36 -0
  158. package/dist/data/globals/index.d.ts.map +1 -0
  159. package/dist/data/globals/index.js +52 -0
  160. package/dist/diagnostics/DiagnosticCollector.d.ts +98 -0
  161. package/dist/diagnostics/DiagnosticCollector.d.ts.map +1 -0
  162. package/dist/diagnostics/DiagnosticCollector.js +129 -0
  163. package/dist/diagnostics/DiagnosticReporter.d.ts +100 -0
  164. package/dist/diagnostics/DiagnosticReporter.d.ts.map +1 -0
  165. package/dist/diagnostics/DiagnosticReporter.js +247 -0
  166. package/dist/diagnostics/DiagnosticWriter.d.ts +31 -0
  167. package/dist/diagnostics/DiagnosticWriter.d.ts.map +1 -0
  168. package/dist/diagnostics/DiagnosticWriter.js +43 -0
  169. package/dist/diagnostics/index.d.ts +14 -0
  170. package/dist/diagnostics/index.d.ts.map +1 -0
  171. package/dist/diagnostics/index.js +11 -0
  172. package/dist/errors/GrafemaError.d.ts +161 -0
  173. package/dist/errors/GrafemaError.d.ts.map +1 -0
  174. package/dist/errors/GrafemaError.js +181 -0
  175. package/dist/index.d.ts +73 -1
  176. package/dist/index.d.ts.map +1 -1
  177. package/dist/index.js +70 -1
  178. package/dist/logging/Logger.d.ts +48 -0
  179. package/dist/logging/Logger.d.ts.map +1 -0
  180. package/dist/logging/Logger.js +134 -0
  181. package/dist/plugins/Plugin.d.ts +5 -1
  182. package/dist/plugins/Plugin.d.ts.map +1 -1
  183. package/dist/plugins/Plugin.js +33 -0
  184. package/dist/plugins/analysis/DatabaseAnalyzer.d.ts.map +1 -1
  185. package/dist/plugins/analysis/DatabaseAnalyzer.js +14 -6
  186. package/dist/plugins/analysis/ExpressAnalyzer.d.ts.map +1 -1
  187. package/dist/plugins/analysis/ExpressAnalyzer.js +29 -19
  188. package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts +148 -0
  189. package/dist/plugins/analysis/ExpressResponseAnalyzer.d.ts.map +1 -0
  190. package/dist/plugins/analysis/ExpressResponseAnalyzer.js +495 -0
  191. package/dist/plugins/analysis/ExpressRouteAnalyzer.d.ts.map +1 -1
  192. package/dist/plugins/analysis/ExpressRouteAnalyzer.js +71 -29
  193. package/dist/plugins/analysis/FetchAnalyzer.d.ts +41 -0
  194. package/dist/plugins/analysis/FetchAnalyzer.d.ts.map +1 -1
  195. package/dist/plugins/analysis/FetchAnalyzer.js +187 -19
  196. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts +6 -3
  197. package/dist/plugins/analysis/IncrementalAnalysisPlugin.d.ts.map +1 -1
  198. package/dist/plugins/analysis/IncrementalAnalysisPlugin.js +76 -80
  199. package/dist/plugins/analysis/JSASTAnalyzer.d.ts +313 -19
  200. package/dist/plugins/analysis/JSASTAnalyzer.d.ts.map +1 -1
  201. package/dist/plugins/analysis/JSASTAnalyzer.js +3430 -503
  202. package/dist/plugins/analysis/ReactAnalyzer.d.ts.map +1 -1
  203. package/dist/plugins/analysis/ReactAnalyzer.js +56 -57
  204. package/dist/plugins/analysis/RustAnalyzer.d.ts.map +1 -1
  205. package/dist/plugins/analysis/RustAnalyzer.js +16 -11
  206. package/dist/plugins/analysis/SQLiteAnalyzer.d.ts.map +1 -1
  207. package/dist/plugins/analysis/SQLiteAnalyzer.js +11 -7
  208. package/dist/plugins/analysis/ServiceLayerAnalyzer.d.ts.map +1 -1
  209. package/dist/plugins/analysis/ServiceLayerAnalyzer.js +21 -9
  210. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts +9 -0
  211. package/dist/plugins/analysis/SocketIOAnalyzer.d.ts.map +1 -1
  212. package/dist/plugins/analysis/SocketIOAnalyzer.js +117 -21
  213. package/dist/plugins/analysis/SystemDbAnalyzer.d.ts.map +1 -1
  214. package/dist/plugins/analysis/SystemDbAnalyzer.js +15 -5
  215. package/dist/plugins/analysis/ast/GraphBuilder.d.ts +207 -4
  216. package/dist/plugins/analysis/ast/GraphBuilder.d.ts.map +1 -1
  217. package/dist/plugins/analysis/ast/GraphBuilder.js +1527 -316
  218. package/dist/plugins/analysis/ast/IdGenerator.d.ts +105 -0
  219. package/dist/plugins/analysis/ast/IdGenerator.d.ts.map +1 -0
  220. package/dist/plugins/analysis/ast/IdGenerator.js +116 -0
  221. package/dist/plugins/analysis/ast/types.d.ts +470 -5
  222. package/dist/plugins/analysis/ast/types.d.ts.map +1 -1
  223. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts +33 -0
  224. package/dist/plugins/analysis/ast/utils/createParameterNodes.d.ts.map +1 -0
  225. package/dist/plugins/analysis/ast/utils/createParameterNodes.js +89 -0
  226. package/dist/plugins/analysis/ast/utils/index.d.ts +6 -0
  227. package/dist/plugins/analysis/ast/utils/index.d.ts.map +1 -0
  228. package/dist/plugins/analysis/ast/utils/index.js +5 -0
  229. package/dist/plugins/analysis/ast/utils/location.d.ts +87 -0
  230. package/dist/plugins/analysis/ast/utils/location.d.ts.map +1 -0
  231. package/dist/plugins/analysis/ast/utils/location.js +78 -0
  232. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts +14 -5
  233. package/dist/plugins/analysis/ast/visitors/ASTVisitor.d.ts.map +1 -1
  234. package/dist/plugins/analysis/ast/visitors/ASTVisitor.js +6 -5
  235. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts +100 -9
  236. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.d.ts.map +1 -1
  237. package/dist/plugins/analysis/ast/visitors/CallExpressionVisitor.js +674 -125
  238. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts +4 -1
  239. package/dist/plugins/analysis/ast/visitors/ClassVisitor.d.ts.map +1 -1
  240. package/dist/plugins/analysis/ast/visitors/ClassVisitor.js +72 -32
  241. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts +14 -1
  242. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.d.ts.map +1 -1
  243. package/dist/plugins/analysis/ast/visitors/FunctionVisitor.js +190 -63
  244. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts +4 -0
  245. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.d.ts.map +1 -1
  246. package/dist/plugins/analysis/ast/visitors/ImportExportVisitor.js +112 -8
  247. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts +12 -1
  248. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.d.ts.map +1 -1
  249. package/dist/plugins/analysis/ast/visitors/TypeScriptVisitor.js +36 -14
  250. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts +20 -2
  251. package/dist/plugins/analysis/ast/visitors/VariableVisitor.d.ts.map +1 -1
  252. package/dist/plugins/analysis/ast/visitors/VariableVisitor.js +243 -45
  253. package/dist/plugins/discovery/MonorepoServiceDiscovery.d.ts.map +1 -1
  254. package/dist/plugins/discovery/MonorepoServiceDiscovery.js +3 -2
  255. package/dist/plugins/discovery/SimpleProjectDiscovery.d.ts.map +1 -1
  256. package/dist/plugins/discovery/SimpleProjectDiscovery.js +5 -1
  257. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts +22 -0
  258. package/dist/plugins/discovery/WorkspaceDiscovery.d.ts.map +1 -0
  259. package/dist/plugins/discovery/WorkspaceDiscovery.js +141 -0
  260. package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts +46 -0
  261. package/dist/plugins/discovery/resolveSourceEntrypoint.d.ts.map +1 -0
  262. package/dist/plugins/discovery/resolveSourceEntrypoint.js +86 -0
  263. package/dist/plugins/discovery/workspaces/detector.d.ts +21 -0
  264. package/dist/plugins/discovery/workspaces/detector.d.ts.map +1 -0
  265. package/dist/plugins/discovery/workspaces/detector.js +49 -0
  266. package/dist/plugins/discovery/workspaces/globResolver.d.ts +35 -0
  267. package/dist/plugins/discovery/workspaces/globResolver.d.ts.map +1 -0
  268. package/dist/plugins/discovery/workspaces/globResolver.js +184 -0
  269. package/dist/plugins/discovery/workspaces/index.d.ts +9 -0
  270. package/dist/plugins/discovery/workspaces/index.d.ts.map +1 -0
  271. package/dist/plugins/discovery/workspaces/index.js +8 -0
  272. package/dist/plugins/discovery/workspaces/parsers.d.ts +38 -0
  273. package/dist/plugins/discovery/workspaces/parsers.d.ts.map +1 -0
  274. package/dist/plugins/discovery/workspaces/parsers.js +80 -0
  275. package/dist/plugins/enrichment/AliasTracker.d.ts.map +1 -1
  276. package/dist/plugins/enrichment/AliasTracker.js +29 -8
  277. package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts +32 -0
  278. package/dist/plugins/enrichment/ArgumentParameterLinker.d.ts.map +1 -0
  279. package/dist/plugins/enrichment/ArgumentParameterLinker.js +175 -0
  280. package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts +51 -0
  281. package/dist/plugins/enrichment/ClosureCaptureEnricher.d.ts.map +1 -0
  282. package/dist/plugins/enrichment/ClosureCaptureEnricher.js +205 -0
  283. package/dist/plugins/enrichment/ExternalCallResolver.d.ts +42 -0
  284. package/dist/plugins/enrichment/ExternalCallResolver.d.ts.map +1 -0
  285. package/dist/plugins/enrichment/ExternalCallResolver.js +213 -0
  286. package/dist/plugins/enrichment/FunctionCallResolver.d.ts +58 -0
  287. package/dist/plugins/enrichment/FunctionCallResolver.d.ts.map +1 -0
  288. package/dist/plugins/enrichment/FunctionCallResolver.js +340 -0
  289. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts +16 -3
  290. package/dist/plugins/enrichment/HTTPConnectionEnricher.d.ts.map +1 -1
  291. package/dist/plugins/enrichment/HTTPConnectionEnricher.js +78 -27
  292. package/dist/plugins/enrichment/ImportExportLinker.d.ts.map +1 -1
  293. package/dist/plugins/enrichment/ImportExportLinker.js +23 -6
  294. package/dist/plugins/enrichment/MethodCallResolver.d.ts.map +1 -1
  295. package/dist/plugins/enrichment/MethodCallResolver.js +33 -13
  296. package/dist/plugins/enrichment/MountPointResolver.d.ts +14 -12
  297. package/dist/plugins/enrichment/MountPointResolver.d.ts.map +1 -1
  298. package/dist/plugins/enrichment/MountPointResolver.js +173 -147
  299. package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts +44 -0
  300. package/dist/plugins/enrichment/NodejsBuiltinsResolver.d.ts.map +1 -0
  301. package/dist/plugins/enrichment/NodejsBuiltinsResolver.js +271 -0
  302. package/dist/plugins/enrichment/PrefixEvaluator.d.ts.map +1 -1
  303. package/dist/plugins/enrichment/PrefixEvaluator.js +16 -7
  304. package/dist/plugins/enrichment/RustFFIEnricher.d.ts.map +1 -1
  305. package/dist/plugins/enrichment/RustFFIEnricher.js +6 -5
  306. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts +22 -27
  307. package/dist/plugins/enrichment/ValueDomainAnalyzer.d.ts.map +1 -1
  308. package/dist/plugins/enrichment/ValueDomainAnalyzer.js +185 -143
  309. package/dist/plugins/indexing/IncrementalModuleIndexer.d.ts.map +1 -1
  310. package/dist/plugins/indexing/IncrementalModuleIndexer.js +23 -14
  311. package/dist/plugins/indexing/JSModuleIndexer.d.ts +15 -0
  312. package/dist/plugins/indexing/JSModuleIndexer.d.ts.map +1 -1
  313. package/dist/plugins/indexing/JSModuleIndexer.js +121 -31
  314. package/dist/plugins/indexing/RustModuleIndexer.d.ts +1 -1
  315. package/dist/plugins/indexing/RustModuleIndexer.d.ts.map +1 -1
  316. package/dist/plugins/indexing/RustModuleIndexer.js +8 -7
  317. package/dist/plugins/indexing/ServiceDetector.d.ts +10 -0
  318. package/dist/plugins/indexing/ServiceDetector.d.ts.map +1 -1
  319. package/dist/plugins/indexing/ServiceDetector.js +28 -15
  320. package/dist/plugins/validation/BrokenImportValidator.d.ts +31 -0
  321. package/dist/plugins/validation/BrokenImportValidator.d.ts.map +1 -0
  322. package/dist/plugins/validation/BrokenImportValidator.js +249 -0
  323. package/dist/plugins/validation/CallResolverValidator.d.ts +21 -10
  324. package/dist/plugins/validation/CallResolverValidator.d.ts.map +1 -1
  325. package/dist/plugins/validation/CallResolverValidator.js +103 -77
  326. package/dist/plugins/validation/DataFlowValidator.d.ts.map +1 -1
  327. package/dist/plugins/validation/DataFlowValidator.js +62 -49
  328. package/dist/plugins/validation/EvalBanValidator.d.ts.map +1 -1
  329. package/dist/plugins/validation/EvalBanValidator.js +17 -16
  330. package/dist/plugins/validation/GraphConnectivityValidator.d.ts.map +1 -1
  331. package/dist/plugins/validation/GraphConnectivityValidator.js +44 -24
  332. package/dist/plugins/validation/NodeCreationValidator.d.ts +85 -0
  333. package/dist/plugins/validation/NodeCreationValidator.d.ts.map +1 -0
  334. package/dist/plugins/validation/NodeCreationValidator.js +415 -0
  335. package/dist/plugins/validation/SQLInjectionValidator.d.ts.map +1 -1
  336. package/dist/plugins/validation/SQLInjectionValidator.js +61 -19
  337. package/dist/plugins/validation/ShadowingDetector.d.ts.map +1 -1
  338. package/dist/plugins/validation/ShadowingDetector.js +6 -5
  339. package/dist/plugins/validation/TypeScriptDeadCodeValidator.d.ts.map +1 -1
  340. package/dist/plugins/validation/TypeScriptDeadCodeValidator.js +12 -11
  341. package/dist/plugins/vcs/GitPlugin.d.ts.map +1 -1
  342. package/dist/plugins/vcs/GitPlugin.js +10 -12
  343. package/dist/plugins/vcs/VCSPlugin.d.ts +3 -2
  344. package/dist/plugins/vcs/VCSPlugin.d.ts.map +1 -1
  345. package/dist/plugins/vcs/VCSPlugin.js +5 -5
  346. package/dist/queries/findCallsInFunction.d.ts +52 -0
  347. package/dist/queries/findCallsInFunction.d.ts.map +1 -0
  348. package/dist/queries/findCallsInFunction.js +135 -0
  349. package/dist/queries/findContainingFunction.d.ts +45 -0
  350. package/dist/queries/findContainingFunction.d.ts.map +1 -0
  351. package/dist/queries/findContainingFunction.js +54 -0
  352. package/dist/queries/index.d.ts +14 -0
  353. package/dist/queries/index.d.ts.map +1 -0
  354. package/dist/queries/index.js +11 -0
  355. package/dist/queries/traceValues.d.ts +70 -0
  356. package/dist/queries/traceValues.d.ts.map +1 -0
  357. package/dist/queries/traceValues.js +299 -0
  358. package/dist/queries/types.d.ts +163 -0
  359. package/dist/queries/types.d.ts.map +1 -0
  360. package/dist/queries/types.js +9 -0
  361. package/dist/schema/GraphSchemaExtractor.d.ts +53 -0
  362. package/dist/schema/GraphSchemaExtractor.d.ts.map +1 -0
  363. package/dist/schema/GraphSchemaExtractor.js +124 -0
  364. package/dist/schema/InterfaceSchemaExtractor.d.ts +73 -0
  365. package/dist/schema/InterfaceSchemaExtractor.d.ts.map +1 -0
  366. package/dist/schema/InterfaceSchemaExtractor.js +112 -0
  367. package/dist/schema/index.d.ts +5 -0
  368. package/dist/schema/index.d.ts.map +1 -0
  369. package/dist/schema/index.js +2 -0
  370. package/dist/storage/backends/RFDBServerBackend.d.ts +21 -34
  371. package/dist/storage/backends/RFDBServerBackend.d.ts.map +1 -1
  372. package/dist/storage/backends/RFDBServerBackend.js +72 -62
  373. package/dist/storage/backends/typeValidation.d.ts.map +1 -1
  374. package/dist/storage/backends/typeValidation.js +1 -0
  375. package/dist/validation/PathValidator.d.ts +1 -2
  376. package/dist/validation/PathValidator.d.ts.map +1 -1
  377. package/package.json +3 -3
  378. package/src/Orchestrator.ts +272 -27
  379. package/src/config/ConfigLoader.ts +354 -0
  380. package/src/config/index.ts +5 -0
  381. package/src/core/ASTWorker.ts +143 -139
  382. package/src/core/CoverageAnalyzer.ts +243 -0
  383. package/src/core/FileExplainer.ts +179 -0
  384. package/src/core/FileNodeManager.ts +100 -0
  385. package/src/core/GraphFreshnessChecker.ts +143 -0
  386. package/src/core/HashUtils.ts +48 -0
  387. package/src/core/IncrementalReanalyzer.ts +192 -0
  388. package/src/core/NodeFactory.ts +470 -23
  389. package/src/core/ScopeTracker.ts +154 -0
  390. package/src/core/SemanticId.ts +192 -0
  391. package/src/core/VersionManager.ts +3 -2
  392. package/src/core/nodes/ArgumentExpressionNode.ts +89 -0
  393. package/src/core/nodes/ArrayLiteralNode.ts +66 -0
  394. package/src/core/nodes/BranchNode.ts +113 -0
  395. package/src/core/nodes/CallSiteNode.ts +64 -4
  396. package/src/core/nodes/CaseNode.ts +123 -0
  397. package/src/core/nodes/ClassNode.ts +67 -4
  398. package/src/core/nodes/ConstantNode.ts +5 -4
  399. package/src/core/nodes/ConstructorCallNode.ts +217 -0
  400. package/src/core/nodes/DatabaseQueryNode.ts +5 -1
  401. package/src/core/nodes/DecoratorNode.ts +92 -0
  402. package/src/core/nodes/EnumNode.ts +87 -0
  403. package/src/core/nodes/EventListenerNode.ts +7 -4
  404. package/src/core/nodes/ExportNode.ts +74 -4
  405. package/src/core/nodes/ExpressionNode.ts +232 -0
  406. package/src/core/nodes/ExternalModuleNode.ts +65 -0
  407. package/src/core/nodes/ExternalStdioNode.ts +17 -9
  408. package/src/core/nodes/FunctionNode.ts +101 -1
  409. package/src/core/nodes/HttpRequestNode.ts +7 -4
  410. package/src/core/nodes/ImportNode.ts +62 -13
  411. package/src/core/nodes/InterfaceNode.ts +92 -0
  412. package/src/core/nodes/IssueNode.ts +177 -0
  413. package/src/core/nodes/LiteralNode.ts +5 -4
  414. package/src/core/nodes/MethodCallNode.ts +70 -4
  415. package/src/core/nodes/MethodNode.ts +68 -3
  416. package/src/core/nodes/ModuleNode.ts +50 -0
  417. package/src/core/nodes/NetworkRequestNode.ts +77 -0
  418. package/src/core/nodes/ObjectLiteralNode.ts +66 -0
  419. package/src/core/nodes/ParameterNode.ts +4 -3
  420. package/src/core/nodes/ScopeNode.ts +65 -0
  421. package/src/core/nodes/TypeNode.ts +79 -0
  422. package/src/core/nodes/VariableDeclarationNode.ts +58 -4
  423. package/src/core/nodes/index.ts +21 -1
  424. package/src/data/builtins/BuiltinRegistry.ts +124 -0
  425. package/src/data/builtins/definitions.ts +267 -0
  426. package/src/data/builtins/index.ts +10 -0
  427. package/src/data/builtins/jsGlobals.ts +28 -0
  428. package/src/data/builtins/types.ts +36 -0
  429. package/src/data/globals/definitions.ts +156 -0
  430. package/src/data/globals/index.ts +66 -0
  431. package/src/diagnostics/DiagnosticCollector.ts +163 -0
  432. package/src/diagnostics/DiagnosticReporter.ts +324 -0
  433. package/src/diagnostics/DiagnosticWriter.ts +50 -0
  434. package/src/diagnostics/index.ts +16 -0
  435. package/src/errors/GrafemaError.ts +239 -0
  436. package/src/index.ts +193 -1
  437. package/src/logging/Logger.ts +152 -0
  438. package/src/plugins/Plugin.ts +42 -0
  439. package/src/plugins/analysis/DatabaseAnalyzer.ts +16 -8
  440. package/src/plugins/analysis/ExpressAnalyzer.ts +33 -19
  441. package/src/plugins/analysis/ExpressResponseAnalyzer.ts +636 -0
  442. package/src/plugins/analysis/ExpressRouteAnalyzer.ts +76 -36
  443. package/src/plugins/analysis/FetchAnalyzer.ts +232 -21
  444. package/src/plugins/analysis/IncrementalAnalysisPlugin.ts +84 -101
  445. package/src/plugins/analysis/JSASTAnalyzer.ts +4265 -587
  446. package/src/plugins/analysis/ReactAnalyzer.ts +57 -57
  447. package/src/plugins/analysis/RustAnalyzer.ts +16 -11
  448. package/src/plugins/analysis/SQLiteAnalyzer.ts +13 -7
  449. package/src/plugins/analysis/ServiceLayerAnalyzer.ts +22 -16
  450. package/src/plugins/analysis/SocketIOAnalyzer.ts +151 -28
  451. package/src/plugins/analysis/SystemDbAnalyzer.ts +16 -11
  452. package/src/plugins/analysis/ast/GraphBuilder.ts +1947 -327
  453. package/src/plugins/analysis/ast/IdGenerator.ts +177 -0
  454. package/src/plugins/analysis/ast/types.ts +596 -6
  455. package/src/plugins/analysis/ast/utils/createParameterNodes.ts +104 -0
  456. package/src/plugins/analysis/ast/utils/index.ts +12 -0
  457. package/src/plugins/analysis/ast/utils/location.ts +103 -0
  458. package/src/plugins/analysis/ast/visitors/ASTVisitor.ts +19 -8
  459. package/src/plugins/analysis/ast/visitors/CallExpressionVisitor.ts +924 -83
  460. package/src/plugins/analysis/ast/visitors/ClassVisitor.ts +97 -44
  461. package/src/plugins/analysis/ast/visitors/FunctionVisitor.ts +234 -93
  462. package/src/plugins/analysis/ast/visitors/ImportExportVisitor.ts +124 -9
  463. package/src/plugins/analysis/ast/visitors/TypeScriptVisitor.ts +41 -14
  464. package/src/plugins/analysis/ast/visitors/VariableVisitor.ts +294 -49
  465. package/src/plugins/discovery/MonorepoServiceDiscovery.ts +3 -2
  466. package/src/plugins/discovery/SimpleProjectDiscovery.ts +6 -1
  467. package/src/plugins/discovery/WorkspaceDiscovery.ts +184 -0
  468. package/src/plugins/discovery/resolveSourceEntrypoint.ts +103 -0
  469. package/src/plugins/discovery/workspaces/detector.ts +63 -0
  470. package/src/plugins/discovery/workspaces/globResolver.ts +229 -0
  471. package/src/plugins/discovery/workspaces/index.ts +23 -0
  472. package/src/plugins/discovery/workspaces/parsers.ts +99 -0
  473. package/src/plugins/enrichment/AliasTracker.ts +35 -8
  474. package/src/plugins/enrichment/ArgumentParameterLinker.ts +240 -0
  475. package/src/plugins/enrichment/ClosureCaptureEnricher.ts +267 -0
  476. package/src/plugins/enrichment/ExternalCallResolver.ts +262 -0
  477. package/src/plugins/enrichment/FunctionCallResolver.ts +456 -0
  478. package/src/plugins/enrichment/HTTPConnectionEnricher.ts +84 -27
  479. package/src/plugins/enrichment/ImportExportLinker.ts +24 -6
  480. package/src/plugins/enrichment/MethodCallResolver.ts +39 -13
  481. package/src/plugins/enrichment/MountPointResolver.ts +208 -195
  482. package/src/plugins/enrichment/NodejsBuiltinsResolver.ts +365 -0
  483. package/src/plugins/enrichment/PrefixEvaluator.ts +16 -7
  484. package/src/plugins/enrichment/RustFFIEnricher.ts +6 -5
  485. package/src/plugins/enrichment/ValueDomainAnalyzer.ts +209 -189
  486. package/src/plugins/indexing/IncrementalModuleIndexer.ts +23 -14
  487. package/src/plugins/indexing/JSModuleIndexer.ts +140 -34
  488. package/src/plugins/indexing/RustModuleIndexer.ts +8 -7
  489. package/src/plugins/validation/BrokenImportValidator.ts +325 -0
  490. package/src/plugins/validation/CallResolverValidator.ts +131 -110
  491. package/src/plugins/validation/DataFlowValidator.ts +88 -67
  492. package/src/plugins/validation/EvalBanValidator.ts +17 -16
  493. package/src/plugins/validation/GraphConnectivityValidator.ts +58 -24
  494. package/src/plugins/validation/NodeCreationValidator.ts +554 -0
  495. package/src/plugins/validation/SQLInjectionValidator.ts +63 -20
  496. package/src/plugins/validation/ShadowingDetector.ts +6 -5
  497. package/src/plugins/validation/TypeScriptDeadCodeValidator.ts +12 -11
  498. package/src/plugins/vcs/GitPlugin.ts +40 -12
  499. package/src/plugins/vcs/VCSPlugin.ts +7 -5
  500. package/src/queries/README.md +46 -0
  501. package/src/queries/findCallsInFunction.ts +206 -0
  502. package/src/queries/findContainingFunction.ts +83 -0
  503. package/src/queries/index.ts +23 -0
  504. package/src/queries/traceValues.ts +398 -0
  505. package/src/queries/types.ts +187 -0
  506. package/src/schema/GraphSchemaExtractor.ts +177 -0
  507. package/src/schema/InterfaceSchemaExtractor.ts +173 -0
  508. package/src/schema/index.ts +5 -0
  509. package/src/storage/backends/RFDBServerBackend.ts +100 -98
  510. package/src/storage/backends/typeValidation.ts +1 -0
  511. package/src/validation/PathValidator.ts +1 -1
  512. package/dist/core/AnalysisWorker.d.ts +0 -14
  513. package/dist/core/AnalysisWorker.d.ts.map +0 -1
  514. package/dist/core/AnalysisWorker.js +0 -307
  515. package/dist/core/ParallelAnalyzer.d.ts +0 -120
  516. package/dist/core/ParallelAnalyzer.d.ts.map +0 -1
  517. package/dist/core/ParallelAnalyzer.js +0 -331
  518. package/dist/core/QueueWorker.d.ts +0 -12
  519. package/dist/core/QueueWorker.d.ts.map +0 -1
  520. package/dist/core/QueueWorker.js +0 -567
  521. package/dist/core/RFDBClient.d.ts +0 -179
  522. package/dist/core/RFDBClient.d.ts.map +0 -1
  523. package/dist/core/RFDBClient.js +0 -429
  524. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts +0 -19
  525. package/dist/plugins/discovery/ZonServiceDiscovery.d.ts.map +0 -1
  526. package/dist/plugins/discovery/ZonServiceDiscovery.js +0 -204
  527. package/src/core/AnalysisWorker.ts +0 -410
  528. package/src/core/ParallelAnalyzer.ts +0 -476
  529. package/src/core/QueueWorker.ts +0 -780
  530. 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
+ }