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.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +2 -1
- package/.next/build-manifest.json +15 -24
- package/.next/fallback-build-manifest.json +15 -0
- package/.next/images-manifest.json +14 -3
- package/.next/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +52 -16
- package/.next/required-server-files.js +349 -0
- package/.next/required-server-files.json +106 -75
- package/.next/routes-manifest.json +16 -6
- package/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
- package/.next/server/app/_global-error/page/build-manifest.json +20 -0
- package/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
- package/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
- package/.next/server/app/_global-error/page.js +9 -0
- package/.next/server/app/_global-error/page.js.map +5 -0
- package/.next/server/app/_global-error/page.js.nft.json +1 -0
- package/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
- package/.next/server/app/_global-error.html +1 -0
- package/.next/server/app/_global-error.meta +22 -0
- package/.next/server/app/_global-error.rsc +15 -0
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +20 -0
- package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
- package/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
- package/.next/server/app/_not-found/page/build-manifest.json +20 -0
- package/.next/server/app/_not-found/page/next-font-manifest.json +11 -0
- package/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
- package/.next/server/app/_not-found/page.js +13 -2
- package/.next/server/app/_not-found/page.js.map +5 -0
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +3 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.meta +19 -0
- package/.next/server/app/_not-found.rsc +18 -19
- package/.next/server/app/_not-found.segments/_full.segment.rsc +18 -0
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +24 -0
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/favicon.ico/route/app-paths-manifest.json +3 -0
- package/.next/server/app/favicon.ico/route/build-manifest.json +12 -0
- package/.next/server/app/favicon.ico/route.js +6 -1
- package/.next/server/app/favicon.ico/route.js.map +5 -0
- package/.next/server/app/favicon.ico/route.js.nft.json +1 -1
- package/.next/server/app/page/app-paths-manifest.json +3 -0
- package/.next/server/app/page/build-manifest.json +20 -0
- package/.next/server/app/page/next-font-manifest.json +11 -0
- package/.next/server/app/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/page/server-reference-manifest.json +93 -0
- package/.next/server/app/page.js +16 -13
- package/.next/server/app/page.js.map +5 -0
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +3 -1
- package/.next/server/app-paths-manifest.json +2 -1
- package/.next/server/chunks/[externals]__0l8ei7u._.js +3 -0
- package/.next/server/chunks/[externals]__0l8ei7u._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__1to-yfd._.js +160 -0
- package/.next/server/chunks/[root-of-the-server]__1to-yfd._.js.map +1 -0
- package/.next/server/chunks/[turbopack]_runtime.js +807 -0
- package/.next/server/chunks/[turbopack]_runtime.js.map +10 -0
- package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_0g2jjls.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_0g2jjls.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0agsrep._.js +28 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0agsrep._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0f_e7c8._.js +33 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0f_e7c8._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0yqn68e._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0yqn68e._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__112mz-6._.js +14 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__112mz-6._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__11_76b7._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__11_76b7._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__12ovu0c._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__12ovu0c._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__16pmw__._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__16pmw__._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1f2jx51._.js +33 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1f2jx51._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1rn09vt._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__1rn09vt._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__20e4gkp._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__20e4gkp._.js.map +1 -0
- package/.next/server/chunks/ssr/[turbopack]_runtime.js +807 -0
- package/.next/server/chunks/ssr/[turbopack]_runtime.js.map +10 -0
- package/.next/server/chunks/ssr/_1acy_2s._.js +158 -0
- package/.next/server/chunks/ssr/_1acy_2s._.js.map +1 -0
- package/.next/server/chunks/ssr/_1rh2tf9._.js +367 -0
- package/.next/server/chunks/ssr/_1rh2tf9._.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0zi5s8-.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0pt47yr.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_01xbj_9._.js +33 -0
- package/.next/server/chunks/ssr/node_modules_01xbj_9._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_1c5ky4f._.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_1c5ky4f._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_1n3w9lb._.js +6 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_1n3w9lb._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0wpq8j3._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0symwr9.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0q-w892.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0q-w892.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js +3 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0l_sp0x.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_loading_tsx_01g_-m0._.js +3 -0
- package/.next/server/chunks/ssr/src_app_loading_tsx_01g_-m0._.js.map +1 -0
- package/.next/server/middleware-build-manifest.js +24 -1
- package/.next/server/middleware-manifest.json +2 -2
- package/.next/server/next-font-manifest.js +1 -1
- package/.next/server/next-font-manifest.json +15 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages-manifest.json +2 -4
- package/.next/server/prefetch-hints.json +25 -0
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +94 -1
- package/.next/static/chunks/19mx3mg6lkumu.js +1 -0
- package/.next/static/chunks/1las_6j17xa9p.js +1 -0
- package/.next/static/chunks/1xk6snnh6e5_j.css +3 -0
- package/.next/static/chunks/2-rtuqsgzmno4.js +22 -0
- package/.next/static/chunks/27t_qfc-3_lzs.js +1 -0
- package/.next/static/chunks/2sswp23h6zh08.js +345 -0
- package/.next/static/chunks/310vm2bl3xxpt.js +31 -0
- package/.next/static/chunks/3fntmmi971322.js +1 -0
- package/.next/static/chunks/turbopack-1b6uko1cu_h42.js +1 -0
- package/.next/static/media/4fa387ec64143e14-s.2tuy5pz7dlieh.woff2 +0 -0
- package/.next/static/media/53b9e256198e5412-s.390ncx5urfkfu.woff2 +0 -0
- package/.next/static/media/5ce348bf30bf5439-s.31988l_ccedte.woff2 +0 -0
- package/.next/static/media/6306c77e7c8268e4-s.2dbetqa9o8jxf.woff2 +0 -0
- package/.next/static/media/7178b3e590c64307-s.21jp631_3pja2.woff2 +0 -0
- package/.next/static/media/797e433ab948586e-s.p.0r6juujl39pe6.woff2 +0 -0
- package/.next/static/media/7d817b4c03b0c5f1-s.1uyisp29ctx0d.woff2 +0 -0
- package/.next/static/media/8a480f0b521d4e75-s.1qq4vpdcun5oj.woff2 +0 -0
- package/.next/static/media/bbc41e54d2fcbd21-s.1rgnod-3esatf.woff2 +0 -0
- package/.next/static/media/caa3a2e1cccd8315-s.p.0wgildi0cnwt9.woff2 +0 -0
- package/.next/static/media/favicon.2246eezznj2ab.ico +0 -0
- package/.next/static/media/fef07dbb0973bf53-s.3p2_lha1f2xer.woff2 +0 -0
- package/.next/static/rjdzHqzPw2GCNhDbjcu0-/_buildManifest.js +11 -0
- package/.next/static/rjdzHqzPw2GCNhDbjcu0-/_clientMiddlewareManifest.js +1 -0
- package/README.md +176 -4
- package/bin/pkgviz.ts +57 -29
- package/package.json +57 -36
- package/src/app/actions/audit.actions.ts +7 -49
- package/src/app/globals.css +0 -2
- package/src/app/layout.tsx +3 -2
- package/src/app/loading.tsx +8 -0
- package/src/app/page.tsx +16 -2
- package/src/app/utils/buildGraph.ts +99 -100
- package/src/app/utils/getParsedFileStructure.ts +128 -54
- package/src/app/utils/inspectParserLanguageAsync.ts +39 -0
- package/src/app/utils/markCyclicPackages.ts +45 -185
- package/src/app/utils/parser/cpp/parseCppFile.ts +68 -86
- package/src/app/utils/parser/delphi/parseFile.ts +36 -120
- package/src/app/utils/parser/java/findEntryPoint.ts +2 -1
- package/src/app/utils/parser/java/parseJavaFile.ts +33 -45
- package/src/app/utils/parser/kotlin/parseFile.ts +34 -87
- package/src/app/utils/parser/python/parseFile.ts +30 -100
- package/src/app/utils/parser/typescript/parseFile.ts +17 -52
- package/src/app/utils/selectParserLanguage.ts +39 -0
- package/src/cli/formatAuditRuleFailures.ts +21 -0
- package/src/cli/runAuditAsync.ts +41 -0
- package/src/components/Breadcrumb.tsx +5 -4
- package/src/components/ExportPanel.tsx +53 -0
- package/src/components/Header.tsx +1 -0
- package/src/components/Loader.tsx +8 -2
- package/src/components/ProjectLoadError.tsx +15 -0
- package/src/components/SettingsPanel.tsx +184 -0
- package/src/components/Switch.tsx +9 -17
- package/src/components/ThemeToggle.tsx +2 -1
- package/src/components/ToggleSwitch.tsx +36 -0
- package/src/components/sidebar/Sidebar.tsx +14 -0
- package/src/components/sidebar/SidebarBadge.tsx +25 -0
- package/src/components/sidebar/SidebarRow.tsx +14 -0
- package/src/components/sidebar/SidebarSection.tsx +16 -0
- package/src/components/sidebar/SidebarTabs.tsx +58 -0
- package/src/contexts/SettingsContext.tsx +19 -20
- package/src/features/audit/adapters/inbound/react/AuditRuleList.tsx +76 -0
- package/src/features/audit/adapters/inbound/react/AuditRulePanel.tsx +30 -0
- package/src/features/audit/adapters/inbound/react/CycleInspector.tsx +116 -0
- package/src/features/audit/adapters/inbound/react/CyclicDependenciesRuleDetails.tsx +124 -0
- package/src/features/audit/adapters/inbound/react/useCycleSelection.ts +47 -0
- package/src/features/audit/application/use-cases/createAuditFromSnapshot.ts +28 -0
- package/src/features/audit/application/use-cases/resolveSelectedCycleIds.ts +18 -0
- package/src/features/audit/composition/createAuditAsync.ts +11 -0
- package/src/features/audit/domain/evaluateAuditRules.ts +42 -0
- package/src/features/audit/domain/hasBlockingAuditRuleFailure.ts +6 -0
- package/src/features/audit/domain/resolveAuditConfiguration.ts +27 -0
- package/src/features/audit/utils/cycleVisualization.ts +86 -0
- package/src/features/dependency-analysis/adapters/outbound/dependency-graph/analyzeDependencyImportsAsync.ts +172 -0
- package/src/features/dependency-analysis/adapters/outbound/dependency-graph/analyzeTypeScriptImportsAsync.ts +6 -0
- package/src/features/graph-view/adapters/inbound/react/DependencyGraphView.tsx +184 -0
- package/src/features/graph-view/adapters/inbound/react/GraphZoomControls.tsx +48 -0
- package/src/features/graph-view/adapters/inbound/react/applyGraphInteractionPresentation.ts +35 -0
- package/src/features/graph-view/adapters/inbound/react/createGraphViewModel.ts +240 -0
- package/src/features/graph-view/adapters/inbound/react/createGraphViewStyles.ts +37 -0
- package/src/features/graph-view/adapters/inbound/react/useGraphFocus.ts +104 -0
- package/src/features/graph-view/adapters/inbound/react/useGraphInteractions.ts +50 -0
- package/src/features/graph-view/adapters/inbound/react/useGraphProjection.ts +71 -0
- package/src/features/graph-view/adapters/inbound/react/useGraphViewport.ts +48 -0
- package/src/features/graph-view/domain/getDependencyHighlightClasses.ts +39 -0
- package/src/features/graph-view/domain/reduceGraphInteraction.ts +23 -0
- package/src/features/graph-view/utils/createCompoundOpacityIndex.ts +38 -0
- package/src/features/graph-view/utils/projectVisibleGraph.ts +94 -0
- package/src/features/graph-view/utils/readNodeDefinitionId.ts +7 -0
- package/src/features/graph-view/utils/removeEmptyStructuralNodes.ts +27 -0
- package/src/features/project-analysis/adapters/outbound/filesystem/readProjectSnapshotAsync.ts +12 -0
- package/src/features/project-analysis/application/use-cases/createProjectSnapshotReader.ts +29 -0
- package/src/features/project-analysis/composition/loadProjectOverviewAsync.ts +14 -0
- package/src/features/project-analysis/composition/loadProjectSnapshotAsync.ts +12 -0
- package/src/features/project-tree/adapters/inbound/react/ProjectTreePanel.tsx +52 -0
- package/src/features/project-tree/adapters/inbound/react/useProjectTreeExpansion.ts +46 -0
- package/src/features/project-tree/application/use-cases/buildProjectTree.ts +61 -0
- package/src/features/project-tree/application/use-cases/resolveProjectTreeNavigation.ts +13 -0
- package/src/features/project-tree/utils/findProjectTreeNode.ts +14 -0
- package/src/features/project-tree/utils/findProjectTreeNodeByGraphPackage.ts +21 -0
- package/src/features/project-tree/utils/getProjectTreeAncestorIds.ts +26 -0
- package/src/features/settings/utils/readSettingsEnvironment.ts +53 -0
- package/src/i18n/en.ts +21 -2
- package/src/i18n/i18n.ts +2 -3
- package/src/layouts/breadthfirst/style.ts +1 -0
- package/src/layouts/circle/style.ts +1 -0
- package/src/layouts/concentric/style.ts +1 -0
- package/src/layouts/elk/layout.ts +1 -3
- package/src/layouts/elk/style.ts +1 -0
- package/src/layouts/getWeightBuckets.ts +3 -1
- package/src/layouts/grid/style.ts +1 -0
- package/src/layouts/index.ts +0 -4
- package/src/layouts/style.ts +172 -25
- package/src/screens/home/Home.tsx +73 -25
- package/src/screens/home/HomeGraph.tsx +43 -0
- package/src/screens/home/HomeSidebar.tsx +129 -0
- package/src/shared/types/index.ts +0 -9
- package/src/shared/utils/getProjectName.ts +4 -1
- package/src/shared/utils/parseProjectPath.ts +1 -0
- package/src/shared/utils/toPosix.ts +1 -1
- package/src/types/audit.ts +76 -0
- package/src/types/auditVisualization.ts +22 -0
- package/src/types/graphInteraction.ts +9 -0
- package/src/types/parserSelection.ts +11 -0
- package/src/types/projectAnalysis.ts +20 -0
- package/src/types/projectAnalysisActionResult.ts +2 -0
- package/src/types/projectTree.ts +7 -0
- package/src/utils/filter/filterByPackagePrefix.ts +25 -7
- package/src/utils/filter/filterEmptyPackages.ts +28 -29
- package/src/utils/filter/filterSubPackagesFromDepth.ts +20 -17
- package/src/utils/filter/filterVendorPackages.ts +1 -1
- package/src/utils/filter/isIntrinsicGraphNode.ts +8 -0
- package/src/utils/filter/toggleCompoundNodes.ts +41 -31
- package/src/utils/runProjectAnalysisActionAsync.ts +14 -0
- package/tsconfig.json +11 -3
- package/.next/app-build-manifest.json +0 -29
- package/.next/cache/.previewinfo +0 -1
- package/.next/cache/.rscinfo +0 -1
- package/.next/cache/.tsbuildinfo +0 -1
- package/.next/cache/chrome-devtools-workspace-uuid +0 -1
- package/.next/cache/eslint/.cache_6t30dc +0 -1
- package/.next/cache/webpack/client-production/0.pack +0 -4
- package/.next/cache/webpack/client-production/1.pack +0 -0
- package/.next/cache/webpack/client-production/10.pack +0 -0
- package/.next/cache/webpack/client-production/11.pack +0 -0
- package/.next/cache/webpack/client-production/12.pack +0 -0
- package/.next/cache/webpack/client-production/13.pack +0 -0
- package/.next/cache/webpack/client-production/14.pack +0 -0
- package/.next/cache/webpack/client-production/15.pack +0 -0
- package/.next/cache/webpack/client-production/16.pack +0 -0
- package/.next/cache/webpack/client-production/2.pack +0 -0
- package/.next/cache/webpack/client-production/3.pack +0 -0
- package/.next/cache/webpack/client-production/4.pack +0 -0
- package/.next/cache/webpack/client-production/5.pack +0 -0
- package/.next/cache/webpack/client-production/6.pack +0 -0
- package/.next/cache/webpack/client-production/7.pack +0 -0
- package/.next/cache/webpack/client-production/8.pack +0 -0
- package/.next/cache/webpack/client-production/9.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack +0 -0
- package/.next/cache/webpack/client-production/index.pack.old +0 -0
- package/.next/cache/webpack/edge-server-production/0.pack +0 -0
- package/.next/cache/webpack/edge-server-production/index.pack +0 -0
- package/.next/cache/webpack/edge-server-production/index.pack.old +0 -0
- package/.next/cache/webpack/server-production/0.pack +0 -0
- package/.next/cache/webpack/server-production/1.pack +0 -0
- package/.next/cache/webpack/server-production/10.pack +0 -4
- package/.next/cache/webpack/server-production/11.pack +0 -0
- package/.next/cache/webpack/server-production/12.pack +0 -0
- package/.next/cache/webpack/server-production/13.pack +0 -0
- package/.next/cache/webpack/server-production/14.pack +0 -0
- package/.next/cache/webpack/server-production/15.pack +0 -0
- package/.next/cache/webpack/server-production/16.pack +0 -0
- package/.next/cache/webpack/server-production/17.pack +0 -0
- package/.next/cache/webpack/server-production/18.pack +0 -4
- package/.next/cache/webpack/server-production/2.pack +0 -0
- package/.next/cache/webpack/server-production/3.pack +0 -0
- package/.next/cache/webpack/server-production/4.pack +0 -0
- package/.next/cache/webpack/server-production/5.pack +0 -0
- package/.next/cache/webpack/server-production/6.pack +0 -0
- package/.next/cache/webpack/server-production/7.pack +0 -0
- package/.next/cache/webpack/server-production/8.pack +0 -0
- package/.next/cache/webpack/server-production/9.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack +0 -0
- package/.next/cache/webpack/server-production/index.pack.old +0 -0
- package/.next/diagnostics/build-diagnostics.json +0 -6
- package/.next/diagnostics/framework.json +0 -1
- package/.next/server/app/index.html +0 -1
- package/.next/server/app/index.meta +0 -7
- package/.next/server/app/index.rsc +0 -20
- package/.next/server/chunks/548.js +0 -6
- package/.next/server/chunks/610.js +0 -7
- package/.next/server/chunks/985.js +0 -22
- package/.next/server/middleware-react-loadable-manifest.js +0 -1
- package/.next/server/pages/_app.js +0 -1
- package/.next/server/pages/_app.js.nft.json +0 -1
- package/.next/server/pages/_document.js +0 -1
- package/.next/server/pages/_document.js.nft.json +0 -1
- package/.next/server/pages/_error.js +0 -19
- package/.next/server/pages/_error.js.nft.json +0 -1
- package/.next/server/webpack-runtime.js +0 -1
- package/.next/static/_YC2p40ZiYT2Gcw-h_tjC/_buildManifest.js +0 -1
- package/.next/static/chunks/4bd1b696-cf72ae8a39fa05aa.js +0 -1
- package/.next/static/chunks/680-55ad17895c8fb70b.js +0 -1
- package/.next/static/chunks/90542734-29e255269788f1bd.js +0 -1
- package/.next/static/chunks/91dbc596-b9cdccd3f5cba95d.js +0 -1
- package/.next/static/chunks/964-b440f7af22c41ca5.js +0 -1
- package/.next/static/chunks/app/_not-found/page-11e4fea8e290f304.js +0 -1
- package/.next/static/chunks/app/layout-8aae7fba5ed8afb3.js +0 -1
- package/.next/static/chunks/app/page-91450b1230da8bca.js +0 -1
- package/.next/static/chunks/framework-bc35dade6ff9684e.js +0 -1
- package/.next/static/chunks/main-9e86d333c1e02dd1.js +0 -1
- package/.next/static/chunks/main-app-69a9ff75ff3465ca.js +0 -1
- package/.next/static/chunks/pages/_app-0a0020ddd67f79cf.js +0 -1
- package/.next/static/chunks/pages/_error-03529f2c21436739.js +0 -1
- package/.next/static/chunks/webpack-7adfafc806738767.js +0 -1
- package/.next/static/css/ec31779168107a11.css +0 -3
- package/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- package/.next/static/media/747892c23ea88013-s.woff2 +0 -0
- package/.next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
- package/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
- package/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- package/.next/trace +0 -2
- package/.next/types/app/layout.ts +0 -84
- package/.next/types/app/page.ts +0 -84
- package/.next/types/cache-life.d.ts +0 -141
- package/.next/types/package.json +0 -1
- package/src/app/actions/graph.actions.ts +0 -25
- package/src/app/utils/parser/cpp/extractCppPackageFromImport.ts +0 -18
- package/src/app/utils/parser/delphi/extractPackageFromImport.ts +0 -21
- package/src/app/utils/parser/java/extractJavaPackageFromImport.ts +0 -39
- package/src/app/utils/parser/java/getIntrinsicPackagesRecursive.ts +0 -33
- package/src/app/utils/parser/kotlin/extractPackageFromImport.ts +0 -19
- package/src/app/utils/parser/python/extractPythonPackageFromImport.ts +0 -18
- package/src/app/utils/parser/typescript/extractTypeScriptPackageFromImport.ts +0 -18
- package/src/components/Cytoscape.tsx +0 -23
- package/src/components/Setting.tsx +0 -17
- package/src/components/Settings.tsx +0 -189
- package/src/components/ZoomInput.tsx +0 -94
- package/src/components/useCytoscape.ts +0 -343
- package/src/layouts/getLayoutStyle.ts +0 -19
- package/src/shared/utils/detectLanguage.ts +0 -255
- package/src/shared/utils/getJsonAsync.ts +0 -13
- package/src/shared/utils/parseEnv.ts +0 -91
- package/src/store/useLocalStorage.ts +0 -29
- package/src/utils/hasChildren.ts +0 -7
- /package/.next/{react-loadable-manifest.json → server/app/_global-error/page/react-loadable-manifest.json} +0 -0
- /package/.next/static/chunks/{polyfills-42372ed130431b0a.js → 0cz1d0mv5g_q7.js} +0 -0
- /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
|
-
|
|
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 =
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const
|
|
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
|
|
27
|
+
const delimiter = match[1];
|
|
28
|
+
const specifier = match[2];
|
|
29
|
+
if (canonicalNames.has(specifier)) continue;
|
|
27
30
|
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
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
|
-
|
|
33
|
-
name:
|
|
35
|
+
imports.push({
|
|
36
|
+
name: specifier,
|
|
34
37
|
pkg,
|
|
35
|
-
isIntrinsic:
|
|
38
|
+
isIntrinsic: delimiter === '"',
|
|
36
39
|
});
|
|
37
40
|
}
|
|
38
41
|
|
|
39
|
-
return
|
|
42
|
+
return imports;
|
|
40
43
|
}
|
|
41
44
|
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
47
|
-
|
|
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
|
-
|
|
53
|
-
|
|
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
|
|
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
|
-
|
|
96
|
-
|
|
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
|
-
|
|
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
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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:
|
|
146
|
-
methods,
|
|
147
|
-
calls,
|
|
148
|
-
path:
|
|
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
|
-
|
|
26
|
-
|
|
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
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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
|
-
|
|
74
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
const
|
|
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:
|
|
174
|
-
imports,
|
|
175
|
-
methods,
|
|
176
|
-
calls,
|
|
177
|
-
path:
|
|
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 =
|
|
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(
|
|
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 =
|
|
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
|
|
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
|
|
78
|
+
/***
|
|
79
|
+
* Parses Java class/method/call metadata while consuming canonical dependency imports.
|
|
84
80
|
*/
|
|
85
|
-
export async function parseJavaFile(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
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
|
|
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:
|
|
107
|
-
imports,
|
|
108
|
-
methods,
|
|
109
|
-
calls,
|
|
110
|
-
path:
|
|
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;
|