modviz 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +261 -0
- package/dist/client/_shell.html +0 -0
- package/dist/client/android-chrome-192x192.png +0 -0
- package/dist/client/android-chrome-512x512.png +0 -0
- package/dist/client/apple-touch-icon.png +0 -0
- package/dist/client/assets/app-Sjrldkrg.css +2 -0
- package/dist/client/assets/button-aOWckyNs.js +1 -0
- package/dist/client/assets/check-C0EQe2S8.js +1 -0
- package/dist/client/assets/chevron-down-DrspihmT.js +1 -0
- package/dist/client/assets/chevron-right-DIJHr8AN.js +1 -0
- package/dist/client/assets/colors-CQoWjU5E.js +1 -0
- package/dist/client/assets/command-kkF7_wdz.js +45 -0
- package/dist/client/assets/compare-K6jVFsiI.js +1 -0
- package/dist/client/assets/compare-TOnoe1EP.js +2 -0
- package/dist/client/assets/configure-DnlSnhtN.js +1 -0
- package/dist/client/assets/explorer-C7NclVKg.js +2 -0
- package/dist/client/assets/explorer-Xu2X6XXF.js +1 -0
- package/dist/client/assets/external-link-B9eNA-li.js +1 -0
- package/dist/client/assets/flamegraph-CRVZSAlj.js +13 -0
- package/dist/client/assets/floating-ui.dom-DLIT5tPE.js +1 -0
- package/dist/client/assets/formatting-CiC0SYI8.js +1 -0
- package/dist/client/assets/graph-6Vr74V1k.js +2 -0
- package/dist/client/assets/graph-CVzypIGU.js +2 -0
- package/dist/client/assets/graph-command-menu-D2MoVT2B.js +4 -0
- package/dist/client/assets/graph-command-menu-VWiiW3qy.css +1 -0
- package/dist/client/assets/hierarchy-C8xxGb_u.js +2 -0
- package/dist/client/assets/hierarchy-iO7d4oSK.js +2 -0
- package/dist/client/assets/import-display-D-jRyyjM.js +5 -0
- package/dist/client/assets/imports-CPggnrs-.js +2 -0
- package/dist/client/assets/imports-CodbPyUJ.js +1 -0
- package/dist/client/assets/index-Dj_rhLdR.js +12 -0
- package/dist/client/assets/input-BCFMF0aR.js +1 -0
- package/dist/client/assets/jsx-runtime-DWSWI4JT.js +1 -0
- package/dist/client/assets/lazyRouteComponent-PTSyFp1J.js +1 -0
- package/dist/client/assets/loading-state-CyC_hrTF.js +1 -0
- package/dist/client/assets/modviz-data-BiRqoDI5.js +1 -0
- package/dist/client/assets/modviz-layout-Do93E-IB.js +1 -0
- package/dist/client/assets/modviz-sigma-Xl8qHaxK.js +312 -0
- package/dist/client/assets/portal-BgAm3V3j.js +1 -0
- package/dist/client/assets/routes-DBtN8hrZ.js +1 -0
- package/dist/client/assets/schemas-B4zfTepZ.js +39 -0
- package/dist/client/assets/search-BYHxNrYn.js +1 -0
- package/dist/client/assets/search-params-BaZRBvGI.js +1 -0
- package/dist/client/assets/setup-view-j1o0TuZz.js +1 -0
- package/dist/client/assets/summary-D703Zh3x.js +1 -0
- package/dist/client/assets/tooltip-B1VDU9HG.js +1 -0
- package/dist/client/assets/trace-B67CM5s2.js +2 -0
- package/dist/client/assets/trace-Bwwdw3AM.js +1 -0
- package/dist/client/assets/treemap-BZf2shzY.js +5 -0
- package/dist/client/assets/treemap-Csroy8Gy.js +2 -0
- package/dist/client/assets/utils-DkkZd0ys.js +1 -0
- package/dist/client/favicon-16x16.png +0 -0
- package/dist/client/favicon-32x32.png +0 -0
- package/dist/client/favicon.ico +0 -0
- package/dist/client/favicon.png +0 -0
- package/dist/client/site.webmanifest +19 -0
- package/dist/mod/cli-options.js +225 -0
- package/dist/mod/cli.js +519 -0
- package/dist/mod/index.js +3 -0
- package/dist/mod/llm-analysis.js +29 -0
- package/dist/mod/llm-output.js +742 -0
- package/dist/mod/module-graph-plugins.js +60 -0
- package/dist/mod/production-server.js +103 -0
- package/dist/mod/runtime-host.js +217 -0
- package/dist/mod/snapshot-history.js +73 -0
- package/dist/mod/types.js +3 -0
- package/dist/server/assets/__23tanstack-start-plugin-adapters-3QxJs4a0.js +5 -0
- package/dist/server/assets/_tanstack-start-manifest_v-DMytuIue.js +188 -0
- package/dist/server/assets/button-Bqnnid5i.js +41 -0
- package/dist/server/assets/colors-DhAxrYua.js +100 -0
- package/dist/server/assets/command-SdxShIbL.js +138 -0
- package/dist/server/assets/compare-BFMiiUsB.js +562 -0
- package/dist/server/assets/compare-CpOqTpYu.js +10 -0
- package/dist/server/assets/configure-Bvd45DTI.js +288 -0
- package/dist/server/assets/explorer-C7dODpSv.js +379 -0
- package/dist/server/assets/explorer-CpSb0JTa.js +20 -0
- package/dist/server/assets/flamegraph-CdW-VG6I.js +198 -0
- package/dist/server/assets/formatting-iDlL4tA-.js +4 -0
- package/dist/server/assets/graph-C1G9H5O4.js +438 -0
- package/dist/server/assets/graph-DAGFGioS.js +45 -0
- package/dist/server/assets/graph-command-menu-BV5GtOWx.js +249 -0
- package/dist/server/assets/hierarchy-B4K-Zfn9.js +16 -0
- package/dist/server/assets/hierarchy-BGpWSG-f.js +104 -0
- package/dist/server/assets/import-display-BVIOWcsm.js +124 -0
- package/dist/server/assets/imports-B6JBDl_h.js +379 -0
- package/dist/server/assets/imports-BGe5tZJT.js +28 -0
- package/dist/server/assets/input-C5r-hBix.js +19 -0
- package/dist/server/assets/loading-state-CrvCWTtw.js +23 -0
- package/dist/server/assets/modviz-data-CUyTorv0.js +197 -0
- package/dist/server/assets/modviz-layout-BAH2ogse.js +253 -0
- package/dist/server/assets/modviz-server-DoMlAyFW.js +195 -0
- package/dist/server/assets/modviz-sigma-XYxARWqd.js +1441 -0
- package/dist/server/assets/rolldown-runtime-rSIU-vHC.js +13 -0
- package/dist/server/assets/router-DYJ-zDbU.js +353 -0
- package/dist/server/assets/routes-DInCacpY.js +244 -0
- package/dist/server/assets/search-params-BNApPgkX.js +26 -0
- package/dist/server/assets/setup-view-DjI49Iqr.js +91 -0
- package/dist/server/assets/start-Ba3KII43.js +4 -0
- package/dist/server/assets/summary-z3lXkLCQ.js +208 -0
- package/dist/server/assets/tooltip-Ck0DDfF7.js +24 -0
- package/dist/server/assets/trace-ColKOf9g.js +16 -0
- package/dist/server/assets/trace-eVs-hIZO.js +578 -0
- package/dist/server/assets/treemap-BbZ9M4GF.js +17 -0
- package/dist/server/assets/treemap-CrgWFoCF.js +912 -0
- package/dist/server/assets/utils-BQZm0uva.js +8 -0
- package/dist/server/server.js +5259 -0
- package/dist/shared/modviz-compare.js +120 -0
- package/dist/shared/modviz-trace.js +244 -0
- package/package.json +135 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Link } from "@tanstack/react-router";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { AlertTriangle, ArrowLeftRight, FolderClock, Terminal } from "lucide-react";
|
|
4
|
+
//#region src/components/modviz/setup-view.tsx
|
|
5
|
+
function SetupView(props) {
|
|
6
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
7
|
+
className: "space-y-6",
|
|
8
|
+
children: [/* @__PURE__ */ jsx("section", {
|
|
9
|
+
className: `rounded-[24px] border p-6 shadow-[0_16px_50px_-32px_rgba(15,23,42,0.55)] ${props.bundle.setup.status === "invalid" ? "border-rose-200 bg-rose-50 text-rose-700 dark:border-rose-500/30 dark:bg-rose-500/10 dark:text-rose-200" : "border-sky-200 bg-sky-50 text-sky-700 dark:border-sky-500/30 dark:bg-sky-500/10 dark:text-sky-200"}`,
|
|
10
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
11
|
+
className: "flex items-start gap-4",
|
|
12
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
13
|
+
className: "rounded-2xl bg-white/70 p-3 dark:bg-slate-950/30",
|
|
14
|
+
children: /* @__PURE__ */ jsx(AlertTriangle, { className: "size-5" })
|
|
15
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
16
|
+
className: "space-y-3",
|
|
17
|
+
children: [
|
|
18
|
+
/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h2", {
|
|
19
|
+
className: "text-lg font-semibold",
|
|
20
|
+
children: "No active modviz snapshot"
|
|
21
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
22
|
+
className: "mt-2 text-sm leading-6 opacity-90",
|
|
23
|
+
children: props.bundle.setup.message
|
|
24
|
+
})] }),
|
|
25
|
+
/* @__PURE__ */ jsx("div", {
|
|
26
|
+
className: "rounded-2xl border border-current/15 bg-white/70 px-4 py-3 font-mono text-xs dark:bg-slate-950/30",
|
|
27
|
+
children: "pnpm exec modviz analyze ./src/index.ts --ui --snapshot-name=first-run"
|
|
28
|
+
}),
|
|
29
|
+
/* @__PURE__ */ jsxs("div", {
|
|
30
|
+
className: "flex flex-wrap gap-2",
|
|
31
|
+
children: [/* @__PURE__ */ jsxs(Link, {
|
|
32
|
+
to: "/configure",
|
|
33
|
+
className: "inline-flex items-center gap-2 rounded-full border border-current/20 bg-white/80 px-4 py-2 text-sm font-medium dark:bg-slate-950/30",
|
|
34
|
+
children: [/* @__PURE__ */ jsx(Terminal, { className: "size-4" }), "Open command builder"]
|
|
35
|
+
}), props.bundle.history.length > 0 ? /* @__PURE__ */ jsxs(Link, {
|
|
36
|
+
to: "/compare",
|
|
37
|
+
search: { baselineSnapshot: "" },
|
|
38
|
+
className: "inline-flex items-center gap-2 rounded-full border border-current/20 bg-white/80 px-4 py-2 text-sm font-medium dark:bg-slate-950/30",
|
|
39
|
+
children: [/* @__PURE__ */ jsx(ArrowLeftRight, { className: "size-4" }), "Open compare with history"]
|
|
40
|
+
}) : null]
|
|
41
|
+
})
|
|
42
|
+
]
|
|
43
|
+
})]
|
|
44
|
+
})
|
|
45
|
+
}), /* @__PURE__ */ jsxs("section", {
|
|
46
|
+
className: "rounded-[24px] border border-slate-200/70 bg-white/90 p-6 shadow-[0_16px_50px_-32px_rgba(15,23,42,0.55)] dark:border-slate-800 dark:bg-slate-950/70",
|
|
47
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
48
|
+
className: "flex items-center gap-3",
|
|
49
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
50
|
+
className: "rounded-2xl bg-slate-100 p-3 text-slate-700 dark:bg-slate-900 dark:text-slate-200",
|
|
51
|
+
children: /* @__PURE__ */ jsx(FolderClock, { className: "size-5" })
|
|
52
|
+
}), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
|
|
53
|
+
className: "text-lg font-semibold text-slate-900 dark:text-slate-100",
|
|
54
|
+
children: "Named snapshot history"
|
|
55
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
56
|
+
className: "mt-1 text-sm text-slate-500 dark:text-slate-400",
|
|
57
|
+
children: "Saved runs can be loaded in Compare even before a current graph is active."
|
|
58
|
+
})] })]
|
|
59
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
60
|
+
className: "mt-4 space-y-2",
|
|
61
|
+
children: props.bundle.history.length === 0 ? /* @__PURE__ */ jsx("p", {
|
|
62
|
+
className: "text-sm text-slate-500 dark:text-slate-400",
|
|
63
|
+
children: "No named snapshots saved yet."
|
|
64
|
+
}) : props.bundle.history.slice(0, 12).map((snapshot) => /* @__PURE__ */ jsx("div", {
|
|
65
|
+
className: "rounded-2xl bg-slate-50/90 px-4 py-3 dark:bg-slate-900/70",
|
|
66
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
67
|
+
className: "flex flex-wrap items-center justify-between gap-3",
|
|
68
|
+
children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
|
|
69
|
+
className: "font-medium text-slate-900 dark:text-slate-100",
|
|
70
|
+
children: snapshot.id
|
|
71
|
+
}), /* @__PURE__ */ jsxs("p", {
|
|
72
|
+
className: "mt-1 text-xs text-slate-500 dark:text-slate-400",
|
|
73
|
+
children: [
|
|
74
|
+
snapshot.totalNodes,
|
|
75
|
+
" nodes",
|
|
76
|
+
snapshot.generatedAt ? ` • ${new Date(snapshot.generatedAt).toLocaleString()}` : ""
|
|
77
|
+
]
|
|
78
|
+
})] }), /* @__PURE__ */ jsx(Link, {
|
|
79
|
+
to: "/compare",
|
|
80
|
+
search: { baselineSnapshot: snapshot.id },
|
|
81
|
+
className: "text-sm font-medium text-sky-700 dark:text-sky-300",
|
|
82
|
+
children: "Use in compare"
|
|
83
|
+
})]
|
|
84
|
+
})
|
|
85
|
+
}, snapshot.id))
|
|
86
|
+
})]
|
|
87
|
+
})]
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
//#endregion
|
|
91
|
+
export { SetupView as t };
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
//#region node_modules/.pnpm/@tanstack+react-start@1.167.35_react-dom@19.2.5_react@19.2.5__react@19.2.5_vite@8.0.8_@_fb73f0827e410b8796146e2e1bb1ff1b/node_modules/@tanstack/react-start/dist/plugin/default-entry/start.ts
|
|
2
|
+
var startInstance = void 0;
|
|
3
|
+
//#endregion
|
|
4
|
+
export { startInstance };
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { f as isModvizBundleReady, m as useModvizBundle } from "./modviz-data-CUyTorv0.js";
|
|
2
|
+
import { t as formatNumber } from "./formatting-iDlL4tA-.js";
|
|
3
|
+
import { t as ModvizLayout } from "./modviz-layout-BAH2ogse.js";
|
|
4
|
+
import { t as SetupView } from "./setup-view-DjI49Iqr.js";
|
|
5
|
+
import { Link } from "@tanstack/react-router";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
//#region src/components/modviz/summary-view.tsx
|
|
8
|
+
function MetricCard(props) {
|
|
9
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
10
|
+
className: "rounded-[24px] border border-slate-200/70 bg-white/90 p-5 shadow-[0_16px_50px_-32px_rgba(15,23,42,0.55)] dark:border-slate-800 dark:bg-slate-950/70",
|
|
11
|
+
children: [
|
|
12
|
+
/* @__PURE__ */ jsx("p", {
|
|
13
|
+
className: "text-xs font-semibold uppercase tracking-[0.2em] text-slate-500 dark:text-slate-400",
|
|
14
|
+
children: props.label
|
|
15
|
+
}),
|
|
16
|
+
/* @__PURE__ */ jsx("p", {
|
|
17
|
+
className: "mt-3 text-3xl font-semibold text-slate-900 dark:text-slate-100",
|
|
18
|
+
children: formatNumber.format(props.value)
|
|
19
|
+
}),
|
|
20
|
+
/* @__PURE__ */ jsx("p", {
|
|
21
|
+
className: "mt-2 text-sm leading-6 text-slate-500 dark:text-slate-400",
|
|
22
|
+
children: props.note
|
|
23
|
+
})
|
|
24
|
+
]
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
function SummaryTable(props) {
|
|
28
|
+
return /* @__PURE__ */ jsxs("section", {
|
|
29
|
+
className: "rounded-[24px] border border-slate-200/70 bg-white/90 p-5 shadow-[0_16px_50px_-32px_rgba(15,23,42,0.55)] dark:border-slate-800 dark:bg-slate-950/70",
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ jsx("h2", {
|
|
32
|
+
className: "text-lg font-semibold text-slate-900 dark:text-slate-100",
|
|
33
|
+
children: props.title
|
|
34
|
+
}),
|
|
35
|
+
/* @__PURE__ */ jsx("p", {
|
|
36
|
+
className: "mt-1 text-sm text-slate-500 dark:text-slate-400",
|
|
37
|
+
children: props.description
|
|
38
|
+
}),
|
|
39
|
+
/* @__PURE__ */ jsx("div", {
|
|
40
|
+
className: "mt-4 overflow-hidden rounded-2xl border border-slate-200/70 dark:border-slate-800",
|
|
41
|
+
children: /* @__PURE__ */ jsxs("table", {
|
|
42
|
+
className: "min-w-full divide-y divide-slate-200 dark:divide-slate-800",
|
|
43
|
+
children: [/* @__PURE__ */ jsx("thead", {
|
|
44
|
+
className: "bg-slate-50/90 dark:bg-slate-900/80",
|
|
45
|
+
children: /* @__PURE__ */ jsxs("tr", { children: [
|
|
46
|
+
/* @__PURE__ */ jsx("th", {
|
|
47
|
+
className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-[0.18em] text-slate-500 dark:text-slate-400",
|
|
48
|
+
children: "Target"
|
|
49
|
+
}),
|
|
50
|
+
/* @__PURE__ */ jsx("th", {
|
|
51
|
+
className: "px-4 py-3 text-left text-xs font-semibold uppercase tracking-[0.18em] text-slate-500 dark:text-slate-400",
|
|
52
|
+
children: "Path"
|
|
53
|
+
}),
|
|
54
|
+
/* @__PURE__ */ jsx("th", {
|
|
55
|
+
className: "px-4 py-3 text-right text-xs font-semibold uppercase tracking-[0.18em] text-slate-500 dark:text-slate-400",
|
|
56
|
+
children: props.valueLabel
|
|
57
|
+
})
|
|
58
|
+
] })
|
|
59
|
+
}), /* @__PURE__ */ jsx("tbody", {
|
|
60
|
+
className: "divide-y divide-slate-200 bg-white dark:divide-slate-800 dark:bg-slate-950/60",
|
|
61
|
+
children: props.rows.map((row, index) => /* @__PURE__ */ jsxs("tr", {
|
|
62
|
+
className: "transition hover:bg-sky-50/70 dark:hover:bg-sky-500/10",
|
|
63
|
+
children: [
|
|
64
|
+
/* @__PURE__ */ jsxs("td", {
|
|
65
|
+
className: "px-4 py-3 text-sm font-medium text-slate-800 dark:text-slate-100",
|
|
66
|
+
children: [/* @__PURE__ */ jsx(Link, {
|
|
67
|
+
to: props.getLink(row).to,
|
|
68
|
+
search: props.getLink(row).search,
|
|
69
|
+
className: "hover:text-sky-700 dark:hover:text-sky-300",
|
|
70
|
+
children: row.label
|
|
71
|
+
}), row.description ? /* @__PURE__ */ jsx("p", {
|
|
72
|
+
className: "mt-1 text-xs font-normal text-slate-500 dark:text-slate-400",
|
|
73
|
+
children: row.description
|
|
74
|
+
}) : null]
|
|
75
|
+
}),
|
|
76
|
+
/* @__PURE__ */ jsx("td", {
|
|
77
|
+
className: "max-w-[24rem] truncate px-4 py-3 text-sm text-slate-500 dark:text-slate-400",
|
|
78
|
+
children: row.path
|
|
79
|
+
}),
|
|
80
|
+
/* @__PURE__ */ jsx("td", {
|
|
81
|
+
className: "px-4 py-3 text-right text-sm font-semibold text-slate-900 dark:text-slate-100",
|
|
82
|
+
children: formatNumber.format(row.value)
|
|
83
|
+
})
|
|
84
|
+
]
|
|
85
|
+
}, `${row.path}-${index}`))
|
|
86
|
+
})]
|
|
87
|
+
})
|
|
88
|
+
})
|
|
89
|
+
]
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function SummaryView(props) {
|
|
93
|
+
const { graph, summary } = props.bundle;
|
|
94
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
95
|
+
className: "space-y-6",
|
|
96
|
+
children: [
|
|
97
|
+
/* @__PURE__ */ jsxs("section", {
|
|
98
|
+
className: "grid gap-4 md:grid-cols-2 xl:grid-cols-4",
|
|
99
|
+
children: [
|
|
100
|
+
/* @__PURE__ */ jsx(MetricCard, {
|
|
101
|
+
label: "Total nodes",
|
|
102
|
+
value: summary.overview.totalNodes,
|
|
103
|
+
note: `${formatNumber.format(summary.overview.workspaceNodes)} workspace nodes and ${formatNumber.format(summary.overview.externalNodes)} external nodes are available in the loaded graph.`
|
|
104
|
+
}),
|
|
105
|
+
/* @__PURE__ */ jsx(MetricCard, {
|
|
106
|
+
label: "Entrypoints",
|
|
107
|
+
value: summary.overview.entrypoints,
|
|
108
|
+
note: graph.metadata.entrypoints.join(" • ") || "No entrypoint metadata present."
|
|
109
|
+
}),
|
|
110
|
+
/* @__PURE__ */ jsx(MetricCard, {
|
|
111
|
+
label: "Workspace packages",
|
|
112
|
+
value: summary.overview.workspacePackages,
|
|
113
|
+
note: "Monorepo packages discovered in metadata and reused by the filters in the import-search view."
|
|
114
|
+
}),
|
|
115
|
+
/* @__PURE__ */ jsx(MetricCard, {
|
|
116
|
+
label: "Barrel files",
|
|
117
|
+
value: summary.overview.barrelFiles,
|
|
118
|
+
note: summary.hasLlm ? "The LLM companion report is available, so hotspot tables use companion-report reachability." : "No LLM companion report was found, so hotspot tables use graph-derived reachable-module counts."
|
|
119
|
+
})
|
|
120
|
+
]
|
|
121
|
+
}),
|
|
122
|
+
/* @__PURE__ */ jsxs("section", {
|
|
123
|
+
className: "grid gap-4 xl:grid-cols-2",
|
|
124
|
+
children: [/* @__PURE__ */ jsx(SummaryTable, {
|
|
125
|
+
title: "Most transitive imports",
|
|
126
|
+
description: summary.hasLlm ? "Approximate hotspots ranked by reachable modules from the companion report." : "Graph-derived ranking based on how many unique modules each file can reach through its import chain.",
|
|
127
|
+
rows: summary.hotspots,
|
|
128
|
+
valueLabel: "Reachable",
|
|
129
|
+
getLink: (row) => ({
|
|
130
|
+
to: "/trace",
|
|
131
|
+
search: {
|
|
132
|
+
node: row.path,
|
|
133
|
+
package: "",
|
|
134
|
+
limit: 10
|
|
135
|
+
}
|
|
136
|
+
})
|
|
137
|
+
}), /* @__PURE__ */ jsx(SummaryTable, {
|
|
138
|
+
title: "Most imported by",
|
|
139
|
+
description: "Files or modules with the highest number of direct importers.",
|
|
140
|
+
rows: summary.topImportedBy,
|
|
141
|
+
valueLabel: "Inbound",
|
|
142
|
+
getLink: (row) => ({
|
|
143
|
+
to: "/explorer",
|
|
144
|
+
search: {
|
|
145
|
+
selected: row.path,
|
|
146
|
+
scope: row.path.includes("node_modules") ? "external" : "workspace"
|
|
147
|
+
}
|
|
148
|
+
})
|
|
149
|
+
})]
|
|
150
|
+
}),
|
|
151
|
+
/* @__PURE__ */ jsxs("section", {
|
|
152
|
+
className: "grid gap-4 xl:grid-cols-2",
|
|
153
|
+
children: [/* @__PURE__ */ jsx(SummaryTable, {
|
|
154
|
+
title: "Top importers",
|
|
155
|
+
description: "Files or modules with the highest number of direct outgoing imports.",
|
|
156
|
+
rows: summary.topImporters,
|
|
157
|
+
valueLabel: "Outgoing",
|
|
158
|
+
getLink: (row) => ({
|
|
159
|
+
to: "/explorer",
|
|
160
|
+
search: {
|
|
161
|
+
selected: row.path,
|
|
162
|
+
scope: row.path.includes("node_modules") ? "external" : "workspace"
|
|
163
|
+
}
|
|
164
|
+
})
|
|
165
|
+
}), /* @__PURE__ */ jsx(SummaryTable, {
|
|
166
|
+
title: "External packages",
|
|
167
|
+
description: "Distinct external package presence in the current graph.",
|
|
168
|
+
rows: summary.topExternalPackages,
|
|
169
|
+
valueLabel: "Nodes",
|
|
170
|
+
getLink: (row) => ({
|
|
171
|
+
to: "/trace",
|
|
172
|
+
search: {
|
|
173
|
+
package: row.label,
|
|
174
|
+
node: "",
|
|
175
|
+
limit: 10
|
|
176
|
+
}
|
|
177
|
+
})
|
|
178
|
+
})]
|
|
179
|
+
}),
|
|
180
|
+
/* @__PURE__ */ jsx(SummaryTable, {
|
|
181
|
+
title: "Largest clusters",
|
|
182
|
+
description: "Useful when deciding where to zoom first in the bubble graph or what to scope in import search.",
|
|
183
|
+
rows: summary.topClusters,
|
|
184
|
+
valueLabel: "Nodes",
|
|
185
|
+
getLink: (row) => ({
|
|
186
|
+
to: "/graph",
|
|
187
|
+
search: {
|
|
188
|
+
cluster: row.label,
|
|
189
|
+
externalGrouping: "package"
|
|
190
|
+
}
|
|
191
|
+
})
|
|
192
|
+
})
|
|
193
|
+
]
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
//#endregion
|
|
197
|
+
//#region src/routes/summary.tsx?tsr-split=component
|
|
198
|
+
function SummaryRoute() {
|
|
199
|
+
const bundle = useModvizBundle();
|
|
200
|
+
return /* @__PURE__ */ jsx(ModvizLayout, {
|
|
201
|
+
projectTitle: bundle.projectTitle,
|
|
202
|
+
title: "Summary",
|
|
203
|
+
description: "Tabular views for hotspots, direct import fan-in and fan-out, cluster sizes, and package-level distribution.",
|
|
204
|
+
children: isModvizBundleReady(bundle) ? /* @__PURE__ */ jsx(SummaryView, { bundle }) : /* @__PURE__ */ jsx(SetupView, { bundle })
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
//#endregion
|
|
208
|
+
export { SummaryRoute as component };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { t as cn } from "./utils-BQZm0uva.js";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import { Tooltip } from "@ark-ui/react/tooltip";
|
|
5
|
+
//#region src/components/ui/tooltip.tsx
|
|
6
|
+
var Tooltip$1 = Tooltip.Root;
|
|
7
|
+
var TooltipArrow = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(Tooltip.Arrow, {
|
|
8
|
+
ref,
|
|
9
|
+
className: cn("[--arrow-background:var(--popover)] [--arrow-size:calc(var(--spacing)*2)]", className),
|
|
10
|
+
...props,
|
|
11
|
+
children: /* @__PURE__ */ jsx(Tooltip.ArrowTip, { className: "border-t border-l" })
|
|
12
|
+
}));
|
|
13
|
+
TooltipArrow.displayName = "TooltipArrow";
|
|
14
|
+
var TooltipContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(Tooltip.Positioner, { children: /* @__PURE__ */ jsx(Tooltip.Content, {
|
|
15
|
+
ref,
|
|
16
|
+
className: cn("fade-in-0 zoom-in-95 data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-w-70 animate-in rounded-md border bg-popover px-3 py-1.5 text-popover-foreground text-sm data-[state=closed]:animate-out", className),
|
|
17
|
+
...props
|
|
18
|
+
}) }));
|
|
19
|
+
TooltipContent.displayName = "TooltipContent";
|
|
20
|
+
Tooltip.Context;
|
|
21
|
+
Tooltip.RootProvider;
|
|
22
|
+
var TooltipTrigger = Tooltip.Trigger;
|
|
23
|
+
//#endregion
|
|
24
|
+
export { TooltipTrigger as i, TooltipArrow as n, TooltipContent as r, Tooltip$1 as t };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createFileRoute, lazyRouteComponent } from "@tanstack/react-router";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
//#region src/routes/trace.tsx
|
|
4
|
+
var $$splitComponentImporter = () => import("./trace-eVs-hIZO.js");
|
|
5
|
+
var traceSearchSchema = z.object({
|
|
6
|
+
limit: z.coerce.number().catch(25),
|
|
7
|
+
node: z.string().catch(""),
|
|
8
|
+
package: z.string().catch("")
|
|
9
|
+
});
|
|
10
|
+
var Route = createFileRoute("/trace")({
|
|
11
|
+
ssr: false,
|
|
12
|
+
validateSearch: (search) => traceSearchSchema.parse(search),
|
|
13
|
+
component: lazyRouteComponent($$splitComponentImporter, "component")
|
|
14
|
+
});
|
|
15
|
+
//#endregion
|
|
16
|
+
export { Route as t };
|