pkgviz 0.7.7 → 0.8.0

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 (367) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +2 -1
  3. package/.next/build-manifest.json +15 -24
  4. package/.next/fallback-build-manifest.json +15 -0
  5. package/.next/images-manifest.json +14 -3
  6. package/.next/next-minimal-server.js.nft.json +1 -1
  7. package/.next/next-server.js.nft.json +1 -1
  8. package/.next/prerender-manifest.json +52 -16
  9. package/.next/required-server-files.js +349 -0
  10. package/.next/required-server-files.json +106 -75
  11. package/.next/routes-manifest.json +16 -6
  12. package/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
  13. package/.next/server/app/_global-error/page/build-manifest.json +20 -0
  14. package/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
  15. package/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
  16. package/.next/server/app/_global-error/page.js +9 -0
  17. package/.next/server/app/_global-error/page.js.map +5 -0
  18. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  19. package/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
  20. package/.next/server/app/_global-error.html +1 -0
  21. package/.next/server/app/_global-error.meta +22 -0
  22. package/.next/server/app/_global-error.rsc +15 -0
  23. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +20 -0
  24. package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
  25. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  26. package/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
  27. package/.next/server/app/_not-found/page/build-manifest.json +20 -0
  28. package/.next/server/app/_not-found/page/next-font-manifest.json +11 -0
  29. package/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
  30. package/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
  31. package/.next/server/app/_not-found/page.js +13 -2
  32. package/.next/server/app/_not-found/page.js.map +5 -0
  33. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  34. package/.next/server/app/_not-found/page_client-reference-manifest.js +3 -1
  35. package/.next/server/app/_not-found.html +1 -1
  36. package/.next/server/app/_not-found.meta +19 -0
  37. package/.next/server/app/_not-found.rsc +18 -19
  38. package/.next/server/app/_not-found.segments/_full.segment.rsc +18 -0
  39. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +24 -0
  40. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
  41. package/.next/server/app/favicon.ico/route/app-paths-manifest.json +3 -0
  42. package/.next/server/app/favicon.ico/route/build-manifest.json +12 -0
  43. package/.next/server/app/favicon.ico/route.js +6 -1
  44. package/.next/server/app/favicon.ico/route.js.map +5 -0
  45. package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  46. package/.next/server/app/page/app-paths-manifest.json +3 -0
  47. package/.next/server/app/page/build-manifest.json +20 -0
  48. package/.next/server/app/page/next-font-manifest.json +11 -0
  49. package/.next/server/app/page/react-loadable-manifest.json +1 -0
  50. package/.next/server/app/page/server-reference-manifest.json +93 -0
  51. package/.next/server/app/page.js +16 -13
  52. package/.next/server/app/page.js.map +5 -0
  53. package/.next/server/app/page.js.nft.json +1 -1
  54. package/.next/server/app/page_client-reference-manifest.js +3 -1
  55. package/.next/server/app-paths-manifest.json +2 -1
  56. package/.next/server/chunks/[externals]__0l8ei7u._.js +3 -0
  57. package/.next/server/chunks/[externals]__0l8ei7u._.js.map +1 -0
  58. package/.next/server/chunks/[root-of-the-server]__1to-yfd._.js +160 -0
  59. package/.next/server/chunks/[root-of-the-server]__1to-yfd._.js.map +1 -0
  60. package/.next/server/chunks/[turbopack]_runtime.js +807 -0
  61. package/.next/server/chunks/[turbopack]_runtime.js.map +10 -0
  62. package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_0g2jjls.js +3 -0
  63. package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_0g2jjls.js.map +1 -0
  64. package/.next/server/chunks/ssr/[root-of-the-server]__0agsrep._.js +28 -0
  65. package/.next/server/chunks/ssr/[root-of-the-server]__0agsrep._.js.map +1 -0
  66. package/.next/server/chunks/ssr/[root-of-the-server]__0f_e7c8._.js +33 -0
  67. package/.next/server/chunks/ssr/[root-of-the-server]__0f_e7c8._.js.map +1 -0
  68. package/.next/server/chunks/ssr/[root-of-the-server]__0yqn68e._.js +3 -0
  69. package/.next/server/chunks/ssr/[root-of-the-server]__0yqn68e._.js.map +1 -0
  70. package/.next/server/chunks/ssr/[root-of-the-server]__112mz-6._.js +14 -0
  71. package/.next/server/chunks/ssr/[root-of-the-server]__112mz-6._.js.map +1 -0
  72. package/.next/server/chunks/ssr/[root-of-the-server]__11_76b7._.js +3 -0
  73. package/.next/server/chunks/ssr/[root-of-the-server]__11_76b7._.js.map +1 -0
  74. package/.next/server/chunks/ssr/[root-of-the-server]__12ovu0c._.js +3 -0
  75. package/.next/server/chunks/ssr/[root-of-the-server]__12ovu0c._.js.map +1 -0
  76. package/.next/server/chunks/ssr/[root-of-the-server]__16pmw__._.js +3 -0
  77. package/.next/server/chunks/ssr/[root-of-the-server]__16pmw__._.js.map +1 -0
  78. package/.next/server/chunks/ssr/[root-of-the-server]__1f2jx51._.js +33 -0
  79. package/.next/server/chunks/ssr/[root-of-the-server]__1f2jx51._.js.map +1 -0
  80. package/.next/server/chunks/ssr/[root-of-the-server]__1rn09vt._.js +3 -0
  81. package/.next/server/chunks/ssr/[root-of-the-server]__1rn09vt._.js.map +1 -0
  82. package/.next/server/chunks/ssr/[root-of-the-server]__20e4gkp._.js +3 -0
  83. package/.next/server/chunks/ssr/[root-of-the-server]__20e4gkp._.js.map +1 -0
  84. package/.next/server/chunks/ssr/[turbopack]_runtime.js +807 -0
  85. package/.next/server/chunks/ssr/[turbopack]_runtime.js.map +10 -0
  86. package/.next/server/chunks/ssr/_1acy_2s._.js +158 -0
  87. package/.next/server/chunks/ssr/_1acy_2s._.js.map +1 -0
  88. package/.next/server/chunks/ssr/_1rh2tf9._.js +367 -0
  89. package/.next/server/chunks/ssr/_1rh2tf9._.js.map +1 -0
  90. package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js +3 -0
  91. package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js.map +1 -0
  92. package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js +3 -0
  93. package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js.map +1 -0
  94. package/.next/server/chunks/ssr/node_modules_01xbj_9._.js +33 -0
  95. package/.next/server/chunks/ssr/node_modules_01xbj_9._.js.map +1 -0
  96. package/.next/server/chunks/ssr/node_modules_next_dist_1c5ky4f._.js +3 -0
  97. package/.next/server/chunks/ssr/node_modules_next_dist_1c5ky4f._.js.map +1 -0
  98. package/.next/server/chunks/ssr/node_modules_next_dist_1n3w9lb._.js +6 -0
  99. package/.next/server/chunks/ssr/node_modules_next_dist_1n3w9lb._.js.map +1 -0
  100. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js +3 -0
  101. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js.map +1 -0
  102. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js +3 -0
  103. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js.map +1 -0
  104. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0q-w892.js +3 -0
  105. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0q-w892.js.map +1 -0
  106. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js +3 -0
  107. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js.map +1 -0
  108. package/.next/server/chunks/ssr/src_app_loading_tsx_01g_-m0._.js +3 -0
  109. package/.next/server/chunks/ssr/src_app_loading_tsx_01g_-m0._.js.map +1 -0
  110. package/.next/server/middleware-build-manifest.js +24 -1
  111. package/.next/server/middleware-manifest.json +2 -2
  112. package/.next/server/next-font-manifest.js +1 -1
  113. package/.next/server/next-font-manifest.json +15 -1
  114. package/.next/server/pages/404.html +1 -1
  115. package/.next/server/pages/500.html +1 -1
  116. package/.next/server/pages-manifest.json +2 -4
  117. package/.next/server/prefetch-hints.json +25 -0
  118. package/.next/server/server-reference-manifest.js +1 -1
  119. package/.next/server/server-reference-manifest.json +94 -1
  120. package/.next/static/chunks/19mx3mg6lkumu.js +1 -0
  121. package/.next/static/chunks/1las_6j17xa9p.js +1 -0
  122. package/.next/static/chunks/1xk6snnh6e5_j.css +3 -0
  123. package/.next/static/chunks/2-rtuqsgzmno4.js +22 -0
  124. package/.next/static/chunks/27t_qfc-3_lzs.js +1 -0
  125. package/.next/static/chunks/2sswp23h6zh08.js +345 -0
  126. package/.next/static/chunks/310vm2bl3xxpt.js +31 -0
  127. package/.next/static/chunks/3fntmmi971322.js +1 -0
  128. package/.next/static/chunks/turbopack-1b6uko1cu_h42.js +1 -0
  129. package/.next/static/media/4fa387ec64143e14-s.2tuy5pz7dlieh.woff2 +0 -0
  130. package/.next/static/media/53b9e256198e5412-s.390ncx5urfkfu.woff2 +0 -0
  131. package/.next/static/media/5ce348bf30bf5439-s.31988l_ccedte.woff2 +0 -0
  132. package/.next/static/media/6306c77e7c8268e4-s.2dbetqa9o8jxf.woff2 +0 -0
  133. package/.next/static/media/7178b3e590c64307-s.21jp631_3pja2.woff2 +0 -0
  134. package/.next/static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2 +0 -0
  135. package/.next/static/media/7d817b4c03b0c5f1-s.1uyisp29ctx0d.woff2 +0 -0
  136. package/.next/static/media/8a480f0b521d4e75-s.1qq4vpdcun5oj.woff2 +0 -0
  137. package/.next/static/media/bbc41e54d2fcbd21-s.1rgnod-3esatf.woff2 +0 -0
  138. package/.next/static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2 +0 -0
  139. package/.next/static/media/favicon.2246eezznj2ab.ico +0 -0
  140. package/.next/static/media/fef07dbb0973bf53-s.3p2_lha1f2xer.woff2 +0 -0
  141. package/.next/static/rjdzHqzPw2GCNhDbjcu0-/_buildManifest.js +11 -0
  142. package/.next/static/rjdzHqzPw2GCNhDbjcu0-/_clientMiddlewareManifest.js +1 -0
  143. package/README.md +176 -4
  144. package/bin/pkgviz.ts +57 -29
  145. package/package.json +57 -36
  146. package/src/app/actions/audit.actions.ts +7 -49
  147. package/src/app/globals.css +0 -2
  148. package/src/app/layout.tsx +3 -2
  149. package/src/app/loading.tsx +8 -0
  150. package/src/app/page.tsx +16 -2
  151. package/src/app/utils/buildGraph.ts +99 -100
  152. package/src/app/utils/getParsedFileStructure.ts +128 -54
  153. package/src/app/utils/inspectParserLanguageAsync.ts +39 -0
  154. package/src/app/utils/markCyclicPackages.ts +45 -185
  155. package/src/app/utils/parser/cpp/parseCppFile.ts +68 -86
  156. package/src/app/utils/parser/delphi/parseFile.ts +36 -120
  157. package/src/app/utils/parser/java/findEntryPoint.ts +2 -1
  158. package/src/app/utils/parser/java/parseJavaFile.ts +33 -45
  159. package/src/app/utils/parser/kotlin/parseFile.ts +34 -87
  160. package/src/app/utils/parser/python/parseFile.ts +30 -100
  161. package/src/app/utils/parser/typescript/parseFile.ts +17 -52
  162. package/src/app/utils/selectParserLanguage.ts +39 -0
  163. package/src/cli/formatAuditRuleFailures.ts +21 -0
  164. package/src/cli/runAuditAsync.ts +41 -0
  165. package/src/components/Breadcrumb.tsx +5 -4
  166. package/src/components/ExportPanel.tsx +53 -0
  167. package/src/components/Header.tsx +1 -0
  168. package/src/components/Loader.tsx +8 -2
  169. package/src/components/ProjectLoadError.tsx +15 -0
  170. package/src/components/SettingsPanel.tsx +184 -0
  171. package/src/components/Switch.tsx +9 -17
  172. package/src/components/ThemeToggle.tsx +2 -1
  173. package/src/components/ToggleSwitch.tsx +36 -0
  174. package/src/components/sidebar/Sidebar.tsx +14 -0
  175. package/src/components/sidebar/SidebarBadge.tsx +25 -0
  176. package/src/components/sidebar/SidebarRow.tsx +14 -0
  177. package/src/components/sidebar/SidebarSection.tsx +16 -0
  178. package/src/components/sidebar/SidebarTabs.tsx +58 -0
  179. package/src/contexts/SettingsContext.tsx +19 -20
  180. package/src/features/audit/adapters/inbound/react/AuditRuleList.tsx +76 -0
  181. package/src/features/audit/adapters/inbound/react/AuditRulePanel.tsx +30 -0
  182. package/src/features/audit/adapters/inbound/react/CycleInspector.tsx +116 -0
  183. package/src/features/audit/adapters/inbound/react/CyclicDependenciesRuleDetails.tsx +124 -0
  184. package/src/features/audit/adapters/inbound/react/useCycleSelection.ts +47 -0
  185. package/src/features/audit/application/use-cases/createAuditFromSnapshot.ts +28 -0
  186. package/src/features/audit/application/use-cases/resolveSelectedCycleIds.ts +18 -0
  187. package/src/features/audit/composition/createAuditAsync.ts +11 -0
  188. package/src/features/audit/domain/evaluateAuditRules.ts +42 -0
  189. package/src/features/audit/domain/hasBlockingAuditRuleFailure.ts +6 -0
  190. package/src/features/audit/domain/resolveAuditConfiguration.ts +27 -0
  191. package/src/features/audit/utils/cycleVisualization.ts +86 -0
  192. package/src/features/dependency-analysis/adapters/outbound/dependency-graph/analyzeDependencyImportsAsync.ts +172 -0
  193. package/src/features/dependency-analysis/adapters/outbound/dependency-graph/analyzeTypeScriptImportsAsync.ts +6 -0
  194. package/src/features/graph-view/adapters/inbound/react/DependencyGraphView.tsx +184 -0
  195. package/src/features/graph-view/adapters/inbound/react/GraphZoomControls.tsx +48 -0
  196. package/src/features/graph-view/adapters/inbound/react/applyGraphInteractionPresentation.ts +35 -0
  197. package/src/features/graph-view/adapters/inbound/react/createGraphViewModel.ts +240 -0
  198. package/src/features/graph-view/adapters/inbound/react/createGraphViewStyles.ts +37 -0
  199. package/src/features/graph-view/adapters/inbound/react/useGraphFocus.ts +104 -0
  200. package/src/features/graph-view/adapters/inbound/react/useGraphInteractions.ts +50 -0
  201. package/src/features/graph-view/adapters/inbound/react/useGraphProjection.ts +71 -0
  202. package/src/features/graph-view/adapters/inbound/react/useGraphViewport.ts +48 -0
  203. package/src/features/graph-view/domain/getDependencyHighlightClasses.ts +39 -0
  204. package/src/features/graph-view/domain/reduceGraphInteraction.ts +23 -0
  205. package/src/features/graph-view/utils/createCompoundOpacityIndex.ts +38 -0
  206. package/src/features/graph-view/utils/projectVisibleGraph.ts +94 -0
  207. package/src/features/graph-view/utils/readNodeDefinitionId.ts +7 -0
  208. package/src/features/graph-view/utils/removeEmptyStructuralNodes.ts +27 -0
  209. package/src/features/project-analysis/adapters/outbound/filesystem/readProjectSnapshotAsync.ts +12 -0
  210. package/src/features/project-analysis/application/use-cases/createProjectSnapshotReader.ts +29 -0
  211. package/src/features/project-analysis/composition/loadProjectOverviewAsync.ts +14 -0
  212. package/src/features/project-analysis/composition/loadProjectSnapshotAsync.ts +12 -0
  213. package/src/features/project-tree/adapters/inbound/react/ProjectTreePanel.tsx +52 -0
  214. package/src/features/project-tree/adapters/inbound/react/useProjectTreeExpansion.ts +46 -0
  215. package/src/features/project-tree/application/use-cases/buildProjectTree.ts +61 -0
  216. package/src/features/project-tree/application/use-cases/resolveProjectTreeNavigation.ts +13 -0
  217. package/src/features/project-tree/utils/findProjectTreeNode.ts +14 -0
  218. package/src/features/project-tree/utils/findProjectTreeNodeByGraphPackage.ts +21 -0
  219. package/src/features/project-tree/utils/getProjectTreeAncestorIds.ts +26 -0
  220. package/src/features/settings/utils/readSettingsEnvironment.ts +53 -0
  221. package/src/i18n/en.ts +21 -2
  222. package/src/i18n/i18n.ts +2 -3
  223. package/src/layouts/breadthfirst/style.ts +1 -0
  224. package/src/layouts/circle/style.ts +1 -0
  225. package/src/layouts/concentric/style.ts +1 -0
  226. package/src/layouts/elk/layout.ts +1 -3
  227. package/src/layouts/elk/style.ts +1 -0
  228. package/src/layouts/getWeightBuckets.ts +3 -1
  229. package/src/layouts/grid/style.ts +1 -0
  230. package/src/layouts/index.ts +0 -4
  231. package/src/layouts/style.ts +172 -25
  232. package/src/screens/home/Home.tsx +73 -25
  233. package/src/screens/home/HomeGraph.tsx +43 -0
  234. package/src/screens/home/HomeSidebar.tsx +129 -0
  235. package/src/shared/types/index.ts +0 -9
  236. package/src/shared/utils/getProjectName.ts +4 -1
  237. package/src/shared/utils/parseProjectPath.ts +1 -0
  238. package/src/shared/utils/toPosix.ts +1 -1
  239. package/src/types/audit.ts +76 -0
  240. package/src/types/auditVisualization.ts +22 -0
  241. package/src/types/graphInteraction.ts +9 -0
  242. package/src/types/parserSelection.ts +11 -0
  243. package/src/types/projectAnalysis.ts +20 -0
  244. package/src/types/projectAnalysisActionResult.ts +2 -0
  245. package/src/types/projectTree.ts +7 -0
  246. package/src/utils/filter/filterByPackagePrefix.ts +25 -7
  247. package/src/utils/filter/filterEmptyPackages.ts +28 -29
  248. package/src/utils/filter/filterSubPackagesFromDepth.ts +20 -17
  249. package/src/utils/filter/filterVendorPackages.ts +1 -1
  250. package/src/utils/filter/isIntrinsicGraphNode.ts +8 -0
  251. package/src/utils/filter/toggleCompoundNodes.ts +41 -31
  252. package/src/utils/runProjectAnalysisActionAsync.ts +14 -0
  253. package/tsconfig.json +11 -3
  254. package/.next/app-build-manifest.json +0 -29
  255. package/.next/cache/.previewinfo +0 -1
  256. package/.next/cache/.rscinfo +0 -1
  257. package/.next/cache/.tsbuildinfo +0 -1
  258. package/.next/cache/chrome-devtools-workspace-uuid +0 -1
  259. package/.next/cache/eslint/.cache_6t30dc +0 -1
  260. package/.next/cache/webpack/client-production/0.pack +0 -4
  261. package/.next/cache/webpack/client-production/1.pack +0 -0
  262. package/.next/cache/webpack/client-production/10.pack +0 -0
  263. package/.next/cache/webpack/client-production/11.pack +0 -0
  264. package/.next/cache/webpack/client-production/12.pack +0 -0
  265. package/.next/cache/webpack/client-production/13.pack +0 -0
  266. package/.next/cache/webpack/client-production/14.pack +0 -0
  267. package/.next/cache/webpack/client-production/15.pack +0 -0
  268. package/.next/cache/webpack/client-production/16.pack +0 -0
  269. package/.next/cache/webpack/client-production/2.pack +0 -0
  270. package/.next/cache/webpack/client-production/3.pack +0 -0
  271. package/.next/cache/webpack/client-production/4.pack +0 -0
  272. package/.next/cache/webpack/client-production/5.pack +0 -0
  273. package/.next/cache/webpack/client-production/6.pack +0 -0
  274. package/.next/cache/webpack/client-production/7.pack +0 -0
  275. package/.next/cache/webpack/client-production/8.pack +0 -0
  276. package/.next/cache/webpack/client-production/9.pack +0 -0
  277. package/.next/cache/webpack/client-production/index.pack +0 -0
  278. package/.next/cache/webpack/client-production/index.pack.old +0 -0
  279. package/.next/cache/webpack/edge-server-production/0.pack +0 -0
  280. package/.next/cache/webpack/edge-server-production/index.pack +0 -0
  281. package/.next/cache/webpack/edge-server-production/index.pack.old +0 -0
  282. package/.next/cache/webpack/server-production/0.pack +0 -0
  283. package/.next/cache/webpack/server-production/1.pack +0 -0
  284. package/.next/cache/webpack/server-production/10.pack +0 -4
  285. package/.next/cache/webpack/server-production/11.pack +0 -0
  286. package/.next/cache/webpack/server-production/12.pack +0 -0
  287. package/.next/cache/webpack/server-production/13.pack +0 -0
  288. package/.next/cache/webpack/server-production/14.pack +0 -0
  289. package/.next/cache/webpack/server-production/15.pack +0 -0
  290. package/.next/cache/webpack/server-production/16.pack +0 -0
  291. package/.next/cache/webpack/server-production/17.pack +0 -0
  292. package/.next/cache/webpack/server-production/18.pack +0 -4
  293. package/.next/cache/webpack/server-production/2.pack +0 -0
  294. package/.next/cache/webpack/server-production/3.pack +0 -0
  295. package/.next/cache/webpack/server-production/4.pack +0 -0
  296. package/.next/cache/webpack/server-production/5.pack +0 -0
  297. package/.next/cache/webpack/server-production/6.pack +0 -0
  298. package/.next/cache/webpack/server-production/7.pack +0 -0
  299. package/.next/cache/webpack/server-production/8.pack +0 -0
  300. package/.next/cache/webpack/server-production/9.pack +0 -0
  301. package/.next/cache/webpack/server-production/index.pack +0 -0
  302. package/.next/cache/webpack/server-production/index.pack.old +0 -0
  303. package/.next/diagnostics/build-diagnostics.json +0 -6
  304. package/.next/diagnostics/framework.json +0 -1
  305. package/.next/server/app/index.html +0 -1
  306. package/.next/server/app/index.meta +0 -7
  307. package/.next/server/app/index.rsc +0 -20
  308. package/.next/server/chunks/548.js +0 -6
  309. package/.next/server/chunks/610.js +0 -7
  310. package/.next/server/chunks/985.js +0 -22
  311. package/.next/server/middleware-react-loadable-manifest.js +0 -1
  312. package/.next/server/pages/_app.js +0 -1
  313. package/.next/server/pages/_app.js.nft.json +0 -1
  314. package/.next/server/pages/_document.js +0 -1
  315. package/.next/server/pages/_document.js.nft.json +0 -1
  316. package/.next/server/pages/_error.js +0 -19
  317. package/.next/server/pages/_error.js.nft.json +0 -1
  318. package/.next/server/webpack-runtime.js +0 -1
  319. package/.next/static/_YC2p40ZiYT2Gcw-h_tjC/_buildManifest.js +0 -1
  320. package/.next/static/chunks/4bd1b696-cf72ae8a39fa05aa.js +0 -1
  321. package/.next/static/chunks/680-55ad17895c8fb70b.js +0 -1
  322. package/.next/static/chunks/90542734-29e255269788f1bd.js +0 -1
  323. package/.next/static/chunks/91dbc596-b9cdccd3f5cba95d.js +0 -1
  324. package/.next/static/chunks/964-b440f7af22c41ca5.js +0 -1
  325. package/.next/static/chunks/app/_not-found/page-11e4fea8e290f304.js +0 -1
  326. package/.next/static/chunks/app/layout-8aae7fba5ed8afb3.js +0 -1
  327. package/.next/static/chunks/app/page-91450b1230da8bca.js +0 -1
  328. package/.next/static/chunks/framework-bc35dade6ff9684e.js +0 -1
  329. package/.next/static/chunks/main-9e86d333c1e02dd1.js +0 -1
  330. package/.next/static/chunks/main-app-69a9ff75ff3465ca.js +0 -1
  331. package/.next/static/chunks/pages/_app-0a0020ddd67f79cf.js +0 -1
  332. package/.next/static/chunks/pages/_error-03529f2c21436739.js +0 -1
  333. package/.next/static/chunks/webpack-7adfafc806738767.js +0 -1
  334. package/.next/static/css/ec31779168107a11.css +0 -3
  335. package/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  336. package/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  337. package/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  338. package/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  339. package/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  340. package/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  341. package/.next/trace +0 -2
  342. package/.next/types/app/layout.ts +0 -84
  343. package/.next/types/app/page.ts +0 -84
  344. package/.next/types/cache-life.d.ts +0 -141
  345. package/.next/types/package.json +0 -1
  346. package/src/app/actions/graph.actions.ts +0 -25
  347. package/src/app/utils/parser/cpp/extractCppPackageFromImport.ts +0 -18
  348. package/src/app/utils/parser/delphi/extractPackageFromImport.ts +0 -21
  349. package/src/app/utils/parser/java/extractJavaPackageFromImport.ts +0 -39
  350. package/src/app/utils/parser/java/getIntrinsicPackagesRecursive.ts +0 -33
  351. package/src/app/utils/parser/kotlin/extractPackageFromImport.ts +0 -19
  352. package/src/app/utils/parser/python/extractPythonPackageFromImport.ts +0 -18
  353. package/src/app/utils/parser/typescript/extractTypeScriptPackageFromImport.ts +0 -18
  354. package/src/components/Cytoscape.tsx +0 -23
  355. package/src/components/Setting.tsx +0 -17
  356. package/src/components/Settings.tsx +0 -189
  357. package/src/components/ZoomInput.tsx +0 -94
  358. package/src/components/useCytoscape.ts +0 -343
  359. package/src/layouts/getLayoutStyle.ts +0 -19
  360. package/src/shared/utils/detectLanguage.ts +0 -255
  361. package/src/shared/utils/getJsonAsync.ts +0 -13
  362. package/src/shared/utils/parseEnv.ts +0 -91
  363. package/src/store/useLocalStorage.ts +0 -29
  364. package/src/utils/hasChildren.ts +0 -7
  365. /package/.next/{react-loadable-manifest.json → server/app/_global-error/page/react-loadable-manifest.json} +0 -0
  366. /package/.next/static/chunks/{polyfills-42372ed130431b0a.js → 0cz1d0mv5g_q7.js} +0 -0
  367. /package/.next/static/{_YC2p40ZiYT2Gcw-h_tjC → rjdzHqzPw2GCNhDbjcu0-}/_ssgManifest.js +0 -0
@@ -1,85 +1,81 @@
1
1
  'use server';
2
- import type { ParsedFile, MethodCall, MethodDefinition, ImportDefinition } from '@/shared/types';
3
-
4
- import fs from 'node:fs';
5
2
  import path from 'node:path';
6
- import { extractCppPackageFromImport } from '@/app/utils/parser/cpp/extractCppPackageFromImport';
7
3
 
8
- /**
9
- * Extracts namespace from C++ code.
10
- */
4
+ import { readTextFileWithinRoot } from '@ankhorage/utility/node/fs';
5
+
6
+ import type { ImportDefinition, MethodCall, MethodDefinition, ParsedFile } from '@/shared/types';
7
+ import { toPosix } from '@/shared/utils/toPosix';
8
+
9
+ /*** Extracts namespace from C++ code. */
11
10
  function extractNamespace(content: string): string {
12
- const match = content.match(/namespace\s+([a-zA-Z0-9_:]+)\s*\{/);
11
+ const match = /namespace\s+([a-zA-Z0-9_:]+)\s*\{/.exec(content);
13
12
  return match?.[1]?.replace(/::/g, '.') || '';
14
13
  }
15
14
 
16
- /**
17
- * Extracts include statements from C++ code.
18
- */
19
- function extractIncludes(content: string, projectRoot: string): ImportDefinition[] {
20
- console.log('[CPP] projectRoot:', projectRoot);
21
- const includeRegex = /#include\s+["<]([^">]+)[">]/g;
22
- const includes: ImportDefinition[] = [];
23
-
15
+ /*** Retains include metadata canonical graph topology intentionally omits. */
16
+ function extractPresentationOnlyIncludes(
17
+ content: string,
18
+ namespace: string,
19
+ canonicalImports: readonly ImportDefinition[]
20
+ ): ImportDefinition[] {
21
+ const canonicalNames = new Set(canonicalImports.map(({ name }) => name));
22
+ const includeRegex = /#include\s+(["<])([^">]+)[">]/g;
23
+ const imports: ImportDefinition[] = [];
24
24
  let match;
25
+
25
26
  while ((match = includeRegex.exec(content)) !== null) {
26
- const includePath = match[1];
27
+ const delimiter = match[1];
28
+ const specifier = match[2];
29
+ if (canonicalNames.has(specifier)) continue;
27
30
 
28
- // System includes use angle brackets, local includes use quotes
29
- const isSystemInclude = content.includes(`<${includePath}>`);
30
- const pkg = extractCppPackageFromImport(includePath);
31
+ const segments = specifier.replace(/\.(h|hpp|hxx)$/u, '').split('/');
32
+ const pkg = segments.length > 1 ? segments.slice(0, -1).join('.') : '';
33
+ if (pkg !== '' && pkg !== namespace) continue;
31
34
 
32
- includes.push({
33
- name: includePath,
35
+ imports.push({
36
+ name: specifier,
34
37
  pkg,
35
- isIntrinsic: !isSystemInclude, // Local includes are intrinsic
38
+ isIntrinsic: delimiter === '"',
36
39
  });
37
40
  }
38
41
 
39
- return includes;
42
+ return imports;
40
43
  }
41
44
 
42
- /**
43
- * Extracts the class name from the content and filename fallback.
44
- */
45
+ /*** Restores complete include metadata in source declaration order. */
46
+ function mergeImports(
47
+ content: string,
48
+ namespace: string,
49
+ canonicalImports: readonly ImportDefinition[]
50
+ ): readonly ImportDefinition[] {
51
+ return [
52
+ ...canonicalImports,
53
+ ...extractPresentationOnlyIncludes(content, namespace, canonicalImports),
54
+ ].sort((left, right) => content.indexOf(left.name) - content.indexOf(right.name));
55
+ }
56
+
57
+ /*** Extracts the class name from the content and filename fallback. */
45
58
  function extractClassName(content: string, fileName: string): string {
46
- // Try to find class declaration
47
- const classMatch = content.match(/class\s+([A-Za-z0-9_]+)/);
48
- if (classMatch) {
49
- return classMatch[1];
50
- }
59
+ const classMatch = /class\s+([A-Za-z0-9_]+)/.exec(content);
60
+ if (classMatch) return classMatch[1];
51
61
 
52
- // Try to find struct declaration
53
- const structMatch = content.match(/struct\s+([A-Za-z0-9_]+)/);
54
- if (structMatch) {
55
- return structMatch[1];
56
- }
62
+ const structMatch = /struct\s+([A-Za-z0-9_]+)/.exec(content);
63
+ if (structMatch) return structMatch[1];
57
64
 
58
- // Fallback to filename without extension
59
65
  return path.basename(fileName, path.extname(fileName));
60
66
  }
61
67
 
62
- /**
63
- * Extracts method definitions from C++ content.
64
- */
68
+ /*** Extracts method definitions from C++ content. */
65
69
  function extractMethodDefinitions(content: string): MethodDefinition[] {
66
70
  const methods: MethodDefinition[] = [];
67
-
68
- // Match method definitions (simplified regex, may need refinement)
69
71
  const methodRegex = /(?:(public|protected|private):\s*)?([\w<>:&*\s]+)\s+(\w+)\s*$$([^)]*)$$/g;
70
-
71
72
  let match;
72
73
  let currentVisibility: 'public' | 'protected' | 'private' | 'default' = 'default';
73
74
 
74
- // Also track visibility changes
75
75
  const visibilityRegex = /(public|protected|private):/g;
76
- const lines = content.split('\n');
77
-
78
- for (const line of lines) {
76
+ for (const line of content.split('\n')) {
79
77
  const visMatch = visibilityRegex.exec(line);
80
- if (visMatch) {
81
- currentVisibility = visMatch[1] as 'public' | 'protected' | 'private';
82
- }
78
+ if (visMatch) currentVisibility = visMatch[1] as 'public' | 'protected' | 'private';
83
79
  }
84
80
 
85
81
  methodRegex.lastIndex = 0;
@@ -92,59 +88,45 @@ function extractMethodDefinitions(content: string): MethodDefinition[] {
92
88
  .map(p => p.trim())
93
89
  .filter(Boolean);
94
90
 
95
- // Skip obvious non-methods (keywords, control structures)
96
- if (['if', 'while', 'for', 'switch', 'catch'].includes(name)) {
97
- continue;
98
- }
99
-
100
- methods.push({
101
- name,
102
- returnType,
103
- parameters: params,
104
- visibility,
105
- });
91
+ if (['if', 'while', 'for', 'switch', 'catch'].includes(name)) continue;
92
+ methods.push({ name, returnType, parameters: params, visibility });
106
93
  }
107
94
 
108
95
  return methods;
109
96
  }
110
97
 
111
- /**
112
- * Extract method calls from C++ content.
113
- */
98
+ /*** Extracts method calls from C++ content. */
114
99
  function extractMethodCalls(content: string): MethodCall[] {
115
100
  const callRegex = /(\b\w+)(?:\.|->)(\w+)\s*\(/g;
116
101
  const calls: MethodCall[] = [];
117
-
118
102
  let match;
103
+
119
104
  while ((match = callRegex.exec(content)) !== null) {
120
- const callee = match[1];
121
- const method = match[2];
122
- calls.push({ callee, method });
105
+ calls.push({ callee: match[1], method: match[2] });
123
106
  }
124
-
125
107
  return calls;
126
108
  }
127
109
 
128
- /**
129
- * Parses a C++ file and returns metadata useful for diagram generation.
130
- */
131
- export async function parseCppFile(fullPath: string, projectRoot: string): Promise<ParsedFile> {
132
- const content = fs.readFileSync(fullPath, 'utf-8');
133
- const fileName = path.basename(fullPath);
110
+ /*** Parses C++ metadata while consuming canonical dependency includes. */
111
+ export async function parseCppFile(
112
+ fullPath: string,
113
+ projectRoot: string,
114
+ imports: readonly ImportDefinition[]
115
+ ): Promise<ParsedFile> {
116
+ const { content, path: resolvedPath } = readTextFileWithinRoot({
117
+ rootPath: projectRoot,
118
+ filePath: fullPath,
119
+ });
120
+ const fileName = path.basename(resolvedPath);
134
121
 
135
- const className = extractClassName(content, fileName);
136
122
  const namespace = extractNamespace(content);
137
- const includes = extractIncludes(content, projectRoot);
138
- const methods = extractMethodDefinitions(content);
139
- const calls = extractMethodCalls(content);
140
- const relativePath = path.relative(projectRoot, fullPath);
141
123
 
142
124
  return {
143
- className,
125
+ className: extractClassName(content, fileName),
144
126
  package: namespace,
145
- imports: includes,
146
- methods,
147
- calls,
148
- path: relativePath,
127
+ imports: [...mergeImports(content, namespace, imports)],
128
+ methods: extractMethodDefinitions(content),
129
+ calls: extractMethodCalls(content),
130
+ path: toPosix(path.relative(projectRoot, resolvedPath)),
149
131
  };
150
132
  }
@@ -1,93 +1,32 @@
1
1
  'use server';
2
- import type { ParsedFile, MethodCall, MethodDefinition, ImportDefinition } from '@/shared/types';
3
-
4
- import fs from 'node:fs';
5
2
  import path from 'node:path';
6
- import { extractPackageFromImport } from '@/app/utils/parser/delphi/extractPackageFromImport';
7
-
8
- /**
9
- * Extracts package/unit path from Delphi file structure.
10
- */
11
- function extractUnitPath(filePath: string, projectRoot: string): string {
12
- const relativePath = path.relative(projectRoot, filePath);
13
- const dir = path.dirname(relativePath);
14
-
15
- // Convert path separators to dots for Delphi unit notation
16
- return dir === '.' ? '' : dir.replace(/[/\\]/g, '.');
17
- }
18
3
 
19
- /**
20
- * Extracts uses clause imports from Delphi code.
21
- */
22
- function extractImports(content: string): ImportDefinition[] {
23
- const imports: ImportDefinition[] = [];
4
+ import { readTextFileWithinRoot } from '@ankhorage/utility/node/fs';
24
5
 
25
- // Match uses clause: uses Unit1, Unit2, Unit3;
26
- // Can appear in interface and implementation sections
27
- const usesRegex = /\buses\s+([\s\S]*?);/gi;
6
+ import type { ImportDefinition, MethodCall, MethodDefinition, ParsedFile } from '@/shared/types';
7
+ import { toPosix } from '@/shared/utils/toPosix';
28
8
 
29
- let match;
30
- while ((match = usesRegex.exec(content)) !== null) {
31
- const usesClause = match[1];
32
-
33
- // Split by comma and extract unit names
34
- const units = usesClause.split(',').map(u => u.trim());
35
-
36
- for (const unit of units) {
37
- // Remove "in 'path'" suffix if present
38
- const unitName = unit.replace(/\s+in\s+['"].*?['"]/gi, '').trim();
39
-
40
- if (unitName) {
41
- const pkg = extractPackageFromImport(unitName);
42
-
43
- // Determine if it's a standard RTL/VCL/FMX unit
44
- const isIntrinsic =
45
- unitName.startsWith('System.') ||
46
- unitName.startsWith('Vcl.') ||
47
- unitName.startsWith('FMX.') ||
48
- unitName.startsWith('Data.') ||
49
- unitName.startsWith('Web.');
50
-
51
- imports.push({
52
- name: unitName,
53
- pkg,
54
- isIntrinsic,
55
- });
56
- }
57
- }
58
- }
59
-
60
- return imports;
9
+ /*** Extracts package/unit path from Delphi file structure. */
10
+ function extractUnitPath(filePath: string, projectRoot: string): string {
11
+ const relativePath = toPosix(path.relative(projectRoot, filePath));
12
+ const dir = path.posix.dirname(relativePath);
13
+ return dir === '.' ? '' : dir.replace(/\//g, '.');
61
14
  }
62
15
 
63
- /**
64
- * Extracts the unit/class name from Delphi content.
65
- */
16
+ /*** Extracts the unit/class name from Delphi content. */
66
17
  function extractClassName(content: string, fileName: string): string {
67
- // Try to find unit name
68
- const unitMatch = content.match(/\bunit\s+([A-Za-z_][A-Za-z0-9_]*)\s*;/i);
69
- if (unitMatch) {
70
- return unitMatch[1];
71
- }
18
+ const unitMatch = /\bunit\s+([A-Za-z_][A-Za-z0-9_]*)\s*;/i.exec(content);
19
+ if (unitMatch) return unitMatch[1];
72
20
 
73
- // Try to find primary class name in type section
74
- const classMatch = content.match(/\bT([A-Za-z_][A-Za-z0-9_]*)\s*=\s*class/i);
75
- if (classMatch) {
76
- return 'T' + classMatch[1];
77
- }
21
+ const classMatch = /\bT([A-Za-z_][A-Za-z0-9_]*)\s*=\s*class/i.exec(content);
22
+ if (classMatch) return 'T' + classMatch[1];
78
23
 
79
- // Fallback to filename without extension
80
24
  return path.basename(fileName, path.extname(fileName));
81
25
  }
82
26
 
83
- /**
84
- * Extracts method/procedure/function definitions from Delphi content.
85
- */
27
+ /*** Extracts method/procedure/function definitions from Delphi content. */
86
28
  function extractMethodDefinitions(content: string): MethodDefinition[] {
87
29
  const methods: MethodDefinition[] = [];
88
-
89
- // Match procedure/function declarations in interface or class definition
90
- // procedure MethodName(Params); or function MethodName: ReturnType;
91
30
  const methodRegex =
92
31
  /\b(procedure|function)\s+([A-Za-z_][A-Za-z0-9_]*)\s*(?:$$(.*?)$$)?\s*(?::\s*([A-Za-z_][A-Za-z0-9_.<>]+))?\s*;/gi;
93
32
 
@@ -97,25 +36,16 @@ function extractMethodDefinitions(content: string): MethodDefinition[] {
97
36
  const name = match[2];
98
37
  const paramsStr = match[3] || '';
99
38
  const returnType = match[4] || (kind === 'procedure' ? 'void' : 'Unknown');
100
-
101
- // Parse parameters (format: Name: Type; Name2: Type2)
102
39
  const params = paramsStr
103
40
  .split(';')
104
41
  .map(p => p.trim())
105
42
  .filter(p => p)
106
43
  .map(p => {
107
- // Extract parameter name (before colon)
108
44
  const colonIdx = p.indexOf(':');
109
- if (colonIdx > 0) {
110
- return p.substring(0, colonIdx).trim();
111
- }
112
- return p;
45
+ return colonIdx > 0 ? p.substring(0, colonIdx).trim() : p;
113
46
  });
114
47
 
115
- // Determine visibility based on section or keywords
116
48
  let visibility: 'public' | 'protected' | 'private' | 'default' = 'public';
117
-
118
- // Look backwards in content to find visibility section
119
49
  const beforeMethod = content.substring(0, match.index);
120
50
  if (/\bprivate\b(?!.*\bpublic\b)(?!.*\bprotected\b)/is.test(beforeMethod)) {
121
51
  visibility = 'private';
@@ -123,57 +53,43 @@ function extractMethodDefinitions(content: string): MethodDefinition[] {
123
53
  visibility = 'protected';
124
54
  }
125
55
 
126
- methods.push({
127
- name,
128
- returnType,
129
- parameters: params,
130
- visibility,
131
- });
56
+ methods.push({ name, returnType, parameters: params, visibility });
132
57
  }
133
58
 
134
59
  return methods;
135
60
  }
136
61
 
137
- /**
138
- * Extract method calls from Delphi content.
139
- */
62
+ /*** Extracts method calls from Delphi content. */
140
63
  function extractMethodCalls(content: string): MethodCall[] {
141
64
  const calls: MethodCall[] = [];
142
-
143
- // Match: Object.Method( or Object.Property
144
65
  const callRegex = /([A-Za-z_][A-Za-z0-9_]*)\.([A-Za-z_][A-Za-z0-9_]*)\s*\(/g;
145
-
146
66
  let match;
147
- while ((match = callRegex.exec(content)) !== null) {
148
- const callee = match[1];
149
- const method = match[2];
150
67
 
151
- calls.push({ callee, method });
68
+ while ((match = callRegex.exec(content)) !== null) {
69
+ calls.push({ callee: match[1], method: match[2] });
152
70
  }
153
71
 
154
72
  return calls;
155
73
  }
156
74
 
157
- /**
158
- * Parses a Delphi file and returns metadata useful for diagram generation.
159
- */
160
- export async function parseDelphiFile(fullPath: string, projectRoot: string): Promise<ParsedFile> {
161
- const content = fs.readFileSync(fullPath, 'utf-8');
162
- const fileName = path.basename(fullPath);
163
-
164
- const className = extractClassName(content, fileName);
165
- const unitPath = extractUnitPath(fullPath, projectRoot);
166
- const imports = extractImports(content);
167
- const methods = extractMethodDefinitions(content);
168
- const calls = extractMethodCalls(content);
169
- const relativePath = path.relative(projectRoot, fullPath);
75
+ /*** Parses Delphi metadata while consuming canonical dependency imports. */
76
+ export async function parseDelphiFile(
77
+ fullPath: string,
78
+ projectRoot: string,
79
+ imports: readonly ImportDefinition[]
80
+ ): Promise<ParsedFile> {
81
+ const { content, path: resolvedPath } = readTextFileWithinRoot({
82
+ rootPath: projectRoot,
83
+ filePath: fullPath,
84
+ });
85
+ const fileName = path.basename(resolvedPath);
170
86
 
171
87
  return {
172
- className,
173
- package: unitPath,
174
- imports,
175
- methods,
176
- calls,
177
- path: relativePath,
88
+ className: extractClassName(content, fileName),
89
+ package: extractUnitPath(resolvedPath, projectRoot),
90
+ imports: [...imports],
91
+ methods: extractMethodDefinitions(content),
92
+ calls: extractMethodCalls(content),
93
+ path: toPosix(path.relative(projectRoot, resolvedPath)),
178
94
  };
179
95
  }
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * @unused This file will be useful as soon as we add Sequence Diagrams
3
3
  */
4
- import { parseJavaFile } from '@/app/utils/parser/java/parseJavaFile';
4
+ import type { parseJavaFile } from '@/app/utils/parser/java/parseJavaFile';
5
5
 
6
+ /*** Finds the Java entry point in the parsed project. */
6
7
  export function findEntryPoint(files: JavaParsedFile[]): JavaParsedFile | null {
7
8
  for (const file of files) {
8
9
  const mainMethod = file.methods.find(
@@ -1,39 +1,35 @@
1
1
  'use server';
2
- import type { ParsedFile, MethodCall, MethodDefinition } from '@/shared/types';
3
-
4
- import fs from 'node:fs';
5
2
  import path from 'node:path';
6
- import { getIntrinsicPackagesRecursive } from '@/app/utils/parser/java/getIntrinsicPackagesRecursive';
7
- import { extractJavaPackageFromImport } from '@/app/utils/parser/java/extractJavaPackageFromImport';
8
3
 
9
- /**
4
+ import { readTextFileWithinRoot } from '@ankhorage/utility/node/fs';
5
+ import { escapeRegExp } from '@ankhorage/utility/regex';
6
+
7
+ import type { ImportDefinition, MethodCall, MethodDefinition, ParsedFile } from '@/shared/types';
8
+ import { toPosix } from '@/shared/utils/toPosix';
9
+
10
+ /***
10
11
  * Extracts the package declaration from Java code.
11
12
  */
12
13
  function extractPackageName(content: string): string {
13
- const match = content.match(/^package\s+([a-zA-Z0-9_.]+);/m);
14
+ const match = /^package\s+([a-zA-Z0-9_.]+);/m.exec(content);
14
15
  return match?.[1] || '';
15
16
  }
16
17
 
17
- /**
18
- * Extracts import statements from Java code.
19
- */
20
- function extractImports(content: string): string[] {
21
- return Array.from(content.matchAll(/^import\s+([a-zA-Z0-9_.*]+);/gm)).map(match => match[1]);
22
- }
23
-
24
- /**
18
+ /***
25
19
  * Extracts the class name from the content and filename fallback.
26
20
  */
27
21
  function extractClassName(content: string, fileName: string): string {
28
- const classPattern = new RegExp(`(?:public\\s+)?(class|interface|enum|record)\\s+${fileName}\\b`);
22
+ const classPattern = new RegExp(
23
+ `(?:public\\s+)?(class|interface|enum|record)\\s+${escapeRegExp(fileName)}\\b`
24
+ );
29
25
  const classNameMatch = content.match(classPattern);
30
26
  if (classNameMatch) return fileName;
31
27
 
32
- const fallback = content.match(/(?:public\s+)?(class|interface|enum|record)\s+([A-Za-z0-9_]+)/);
28
+ const fallback = /(?:public\s+)?(class|interface|enum|record)\s+([A-Za-z0-9_]+)/.exec(content);
33
29
  return fallback?.[2] || '';
34
30
  }
35
31
 
36
- /**
32
+ /***
37
33
  * Extracts the method definitions from file content
38
34
  */
39
35
  function extractMethodDefinitions(content: string): MethodDefinition[] {
@@ -62,8 +58,8 @@ function extractMethodDefinitions(content: string): MethodDefinition[] {
62
58
  return methods;
63
59
  }
64
60
 
65
- /**
66
- * Extract method calls from file content
61
+ /***
62
+ * Extract method calls from Java content.
67
63
  */
68
64
  function extractMethodCalls(content: string): MethodCall[] {
69
65
  const callRegex = /(\b\w+)\.(\w+)\s*\(/g;
@@ -79,35 +75,27 @@ function extractMethodCalls(content: string): MethodCall[] {
79
75
  return calls;
80
76
  }
81
77
 
82
- /**
83
- * Parses a Java file and returns metadata useful for diagram generation.
78
+ /***
79
+ * Parses Java class/method/call metadata while consuming canonical dependency imports.
84
80
  */
85
- export async function parseJavaFile(fullPath: string, projectRoot: string) {
86
- const content = fs.readFileSync(fullPath, 'utf-8');
87
- const fileName = path.basename(fullPath, '.java');
88
- const intrinsicPackages = await getIntrinsicPackagesRecursive();
89
-
90
- const className = extractClassName(content, fileName);
91
- const pkg = extractPackageName(content);
92
- const imports = extractImports(content).map(imp => {
93
- const pkgFromImport = extractJavaPackageFromImport(imp);
94
- return {
95
- name: imp,
96
- pkg: pkgFromImport,
97
- isIntrinsic: intrinsicPackages.includes(pkgFromImport),
98
- };
81
+ export async function parseJavaFile(
82
+ fullPath: string,
83
+ projectRoot: string,
84
+ imports: readonly ImportDefinition[]
85
+ ): Promise<ParsedFile> {
86
+ const { content, path: resolvedPath } = readTextFileWithinRoot({
87
+ rootPath: projectRoot,
88
+ filePath: fullPath,
99
89
  });
100
- const methods = extractMethodDefinitions(content);
101
- const calls = extractMethodCalls(content);
102
- const relativePath = path.relative(projectRoot, fullPath);
90
+ const fileName = path.basename(resolvedPath, '.java');
103
91
 
104
92
  const file: ParsedFile = {
105
- className,
106
- package: pkg,
107
- imports,
108
- methods,
109
- calls,
110
- path: relativePath,
93
+ className: extractClassName(content, fileName),
94
+ package: extractPackageName(content),
95
+ imports: [...imports],
96
+ methods: extractMethodDefinitions(content),
97
+ calls: extractMethodCalls(content),
98
+ path: toPosix(path.relative(projectRoot, resolvedPath)),
111
99
  };
112
100
 
113
101
  return file;