From 9612d30f99b14fed79a5bcca791b48430ae6e0f8 Mon Sep 17 00:00:00 2001 From: arlo Date: Wed, 1 Jul 2026 22:10:21 +0800 Subject: [PATCH] feat(vite): add inspect devtools --- docs/errors/VDT0001.md | 25 + docs/errors/VDT0002.md | 25 + docs/errors/index.md | 11 +- docs/kit/diagnostics.md | 2 +- .../src/app/components/assets/Sunburst.vue | 1 + .../src/app/components/chunks/Graph.vue | 6 +- .../src/app/components/chunks/Sunburst.vue | 1 + .../components/data/AssetRelationships.vue | 4 +- .../data/ModuleImportRelationships.vue | 4 +- .../components/data/PluginDetailsLoader.vue | 15 +- .../components/flowmap/ModuleFlowDetails.vue | 2 +- .../app/components/flowmap/NodeModuleInfo.vue | 1 + .../src/app/components/flowmap/PluginFlow.vue | 1 + .../components/flowmap/PluginFlowTimeline.vue | 1 + .../app/components/modules/DetailedList.vue | 1 + .../src/app/components/modules/Graph.vue | 6 +- .../app/pages/session/[session]/assets.vue | 2 + .../app/pages/session/[session]/chunks.vue | 7 +- .../pages/session/[session]/graph/index.vue | 6 +- .../app/pages/session/[session]/packages.vue | 2 + .../app/pages/session/[session]/plugins.vue | 2 + packages/ui/package.json | 5 + .../src/components/ChartNavBreadcrumb.vue} | 5 +- .../src/components/DataPathSelector.vue} | 37 +- .../src/components/DataPathSelectorItem.vue} | 6 +- .../src/components/DataSearchPanel.vue} | 30 +- .../src/components/DisplayModuleGraph.vue} | 8 +- .../src/components/DisplayPluginName.vue} | 2 +- .../src/components/DisplayTimeoutView.vue} | 0 .../src/components/PluginsFlatList.vue} | 9 +- .../src/components/PluginsSunburst.vue} | 37 +- .../src}/composables/graph-path-selector.ts | 27 +- .../src}/composables/module-graph.ts | 106 +--- .../src}/composables/zoom-element.ts | 4 - packages/ui/src/utils/color.ts | 15 + packages/vite/package.json | 24 +- packages/vite/src/app/app.vue | 14 +- .../app/components/chart/ModuleFlamegraph.vue | 232 +++++++ .../src/app/components/code/DiffEditor.vue | 270 +++++++++ .../components/data/ModuleDetailsLoader.vue | 151 +++++ .../data/ModuleImportRelationships.vue | 239 ++++++++ .../components/data/PluginDetailsLoader.vue | 403 +++++++++++++ .../components/data/PluginDetailsTable.vue | 221 +++++++ .../src/app/components/display/FileIcon.vue | 18 + .../app/components/display/FileSizeBadge.vue | 57 ++ .../app/components/display/GraphHoverView.vue | 57 ++ .../app/components/display/HighlightedPath.ts | 99 +++ .../src/app/components/display/ModuleId.vue | 91 +++ .../app/components/display/VirtualTree.vue | 234 ++++++++ .../src/app/components/flowmap/Expandable.vue | 63 ++ .../src/app/components/flowmap/ModuleFlow.vue | 86 +++ .../components/flowmap/ModuleFlowDetails.vue | 79 +++ .../components/flowmap/ModuleFlowTimeline.vue | 394 ++++++++++++ .../vite/src/app/components/flowmap/Node.vue | 51 ++ .../app/components/flowmap/NodeModuleInfo.vue | 200 ++++++ .../app/components/flowmap/NodePluginInfo.vue | 34 ++ .../src/app/components/flowmap/PluginFlow.vue | 153 +++++ .../components/flowmap/PluginFlowTimeline.vue | 176 ++++++ .../app/components/modules/BuildMetrics.vue | 69 +++ .../app/components/modules/DetailedList.vue | 86 +++ .../src/app/components/modules/FlatList.vue | 48 ++ .../src/app/components/modules/Folder.vue | 92 +++ .../vite/src/app/components/modules/Graph.vue | 199 ++++++ packages/vite/src/app/composables/chart.ts | 234 ++++++++ packages/vite/src/app/composables/monaco.ts | 194 ++++++ packages/vite/src/app/composables/rpc.ts | 45 +- packages/vite/src/app/pages/graph.vue | 353 +++++++++++ packages/vite/src/app/pages/plugins.vue | 230 +++++++ packages/vite/src/app/state/flowmap.ts | 10 + packages/vite/src/app/state/settings.ts | 71 +++ packages/vite/src/app/styles/cm.css | 23 + packages/vite/src/app/styles/global.css | 81 +++ packages/vite/src/app/styles/splitpanes.css | 53 ++ packages/vite/src/app/types/chart.ts | 11 + packages/vite/src/app/types/modules.ts | 49 ++ packages/vite/src/app/types/plugins.ts | 10 + packages/vite/src/app/utils/cache.ts | 9 + packages/vite/src/app/utils/color.ts | 16 + packages/vite/src/app/utils/filepath.ts | 145 +++++ packages/vite/src/app/utils/format.ts | 61 ++ packages/vite/src/app/utils/icon.ts | 190 ++++++ packages/vite/src/app/worker/diff.ts | 18 + packages/vite/src/app/worker/diff.worker.ts | 16 + packages/vite/src/index.ts | 2 +- packages/vite/src/modules/rpc.ts | 14 +- .../node/__tests__/inspect-context.test.ts | 384 ++++++++++++ .../src/node/__tests__/inspect-plugin.test.ts | 42 ++ packages/vite/src/node/diagnostics.ts | 14 + packages/vite/src/node/index.ts | 3 + packages/vite/src/node/inspect/context.ts | 567 ++++++++++++++++++ packages/vite/src/node/inspect/hijack.ts | 191 ++++++ packages/vite/src/node/inspect/plugin.ts | 140 +++++ packages/vite/src/node/inspect/server.ts | 67 +++ packages/vite/src/node/inspect/types.ts | 100 +++ packages/vite/src/node/inspect/utils.ts | 105 ++++ packages/vite/src/node/plugin.ts | 39 ++ .../functions/vite-clear-module-transform.ts | 17 + .../node/rpc/functions/vite-get-metadata.ts | 17 + .../vite-get-module-transform-info.ts | 22 + .../rpc/functions/vite-get-modules-list.ts | 22 + .../rpc/functions/vite-get-plugin-details.ts | 15 + .../rpc/functions/vite-get-plugin-metrics.ts | 22 + .../rpc/functions/vite-get-server-metrics.ts | 22 + .../src/node/rpc/functions/vite-resolve-id.ts | 22 + packages/vite/src/node/rpc/index.ts | 38 +- packages/vite/src/nuxt.config.ts | 13 + pnpm-lock.yaml | 544 ++++------------- 107 files changed, 7843 insertions(+), 654 deletions(-) create mode 100644 docs/errors/VDT0001.md create mode 100644 docs/errors/VDT0002.md rename packages/{rolldown/src/app/components/chart/NavBreadcrumb.vue => ui/src/components/ChartNavBreadcrumb.vue} (81%) rename packages/{rolldown/src/app/components/data/PathSelector.vue => ui/src/components/DataPathSelector.vue} (77%) rename packages/{rolldown/src/app/components/data/PathSelectorItem.vue => ui/src/components/DataPathSelectorItem.vue} (86%) rename packages/{rolldown/src/app/components/data/SearchPanel.vue => ui/src/components/DataSearchPanel.vue} (87%) rename packages/{rolldown/src/app/components/display/ModuleGraph.vue => ui/src/components/DisplayModuleGraph.vue} (98%) rename packages/{rolldown/src/app/components/display/PluginName.vue => ui/src/components/DisplayPluginName.vue} (95%) rename packages/{rolldown/src/app/components/display/TimeoutView.vue => ui/src/components/DisplayTimeoutView.vue} (100%) rename packages/{rolldown/src/app/components/plugins/FlatList.vue => ui/src/components/PluginsFlatList.vue} (80%) rename packages/{rolldown/src/app/components/plugins/Sunburst.vue => ui/src/components/PluginsSunburst.vue} (72%) rename packages/{rolldown/src/app => ui/src}/composables/graph-path-selector.ts (85%) rename packages/{rolldown/src/app => ui/src}/composables/module-graph.ts (79%) rename packages/{rolldown/src/app => ui/src}/composables/zoom-element.ts (92%) create mode 100644 packages/vite/src/app/components/chart/ModuleFlamegraph.vue create mode 100644 packages/vite/src/app/components/code/DiffEditor.vue create mode 100644 packages/vite/src/app/components/data/ModuleDetailsLoader.vue create mode 100644 packages/vite/src/app/components/data/ModuleImportRelationships.vue create mode 100644 packages/vite/src/app/components/data/PluginDetailsLoader.vue create mode 100644 packages/vite/src/app/components/data/PluginDetailsTable.vue create mode 100644 packages/vite/src/app/components/display/FileIcon.vue create mode 100644 packages/vite/src/app/components/display/FileSizeBadge.vue create mode 100644 packages/vite/src/app/components/display/GraphHoverView.vue create mode 100644 packages/vite/src/app/components/display/HighlightedPath.ts create mode 100644 packages/vite/src/app/components/display/ModuleId.vue create mode 100644 packages/vite/src/app/components/display/VirtualTree.vue create mode 100644 packages/vite/src/app/components/flowmap/Expandable.vue create mode 100644 packages/vite/src/app/components/flowmap/ModuleFlow.vue create mode 100644 packages/vite/src/app/components/flowmap/ModuleFlowDetails.vue create mode 100644 packages/vite/src/app/components/flowmap/ModuleFlowTimeline.vue create mode 100644 packages/vite/src/app/components/flowmap/Node.vue create mode 100644 packages/vite/src/app/components/flowmap/NodeModuleInfo.vue create mode 100644 packages/vite/src/app/components/flowmap/NodePluginInfo.vue create mode 100644 packages/vite/src/app/components/flowmap/PluginFlow.vue create mode 100644 packages/vite/src/app/components/flowmap/PluginFlowTimeline.vue create mode 100644 packages/vite/src/app/components/modules/BuildMetrics.vue create mode 100644 packages/vite/src/app/components/modules/DetailedList.vue create mode 100644 packages/vite/src/app/components/modules/FlatList.vue create mode 100644 packages/vite/src/app/components/modules/Folder.vue create mode 100644 packages/vite/src/app/components/modules/Graph.vue create mode 100644 packages/vite/src/app/composables/chart.ts create mode 100644 packages/vite/src/app/composables/monaco.ts create mode 100644 packages/vite/src/app/pages/graph.vue create mode 100644 packages/vite/src/app/pages/plugins.vue create mode 100644 packages/vite/src/app/state/flowmap.ts create mode 100644 packages/vite/src/app/state/settings.ts create mode 100644 packages/vite/src/app/styles/cm.css create mode 100644 packages/vite/src/app/styles/splitpanes.css create mode 100644 packages/vite/src/app/types/chart.ts create mode 100644 packages/vite/src/app/types/modules.ts create mode 100644 packages/vite/src/app/types/plugins.ts create mode 100644 packages/vite/src/app/utils/cache.ts create mode 100644 packages/vite/src/app/utils/color.ts create mode 100644 packages/vite/src/app/utils/filepath.ts create mode 100644 packages/vite/src/app/utils/format.ts create mode 100644 packages/vite/src/app/utils/icon.ts create mode 100644 packages/vite/src/app/worker/diff.ts create mode 100644 packages/vite/src/app/worker/diff.worker.ts create mode 100644 packages/vite/src/node/__tests__/inspect-context.test.ts create mode 100644 packages/vite/src/node/__tests__/inspect-plugin.test.ts create mode 100644 packages/vite/src/node/diagnostics.ts create mode 100644 packages/vite/src/node/index.ts create mode 100644 packages/vite/src/node/inspect/context.ts create mode 100644 packages/vite/src/node/inspect/hijack.ts create mode 100644 packages/vite/src/node/inspect/plugin.ts create mode 100644 packages/vite/src/node/inspect/server.ts create mode 100644 packages/vite/src/node/inspect/types.ts create mode 100644 packages/vite/src/node/inspect/utils.ts create mode 100644 packages/vite/src/node/plugin.ts create mode 100644 packages/vite/src/node/rpc/functions/vite-clear-module-transform.ts create mode 100644 packages/vite/src/node/rpc/functions/vite-get-metadata.ts create mode 100644 packages/vite/src/node/rpc/functions/vite-get-module-transform-info.ts create mode 100644 packages/vite/src/node/rpc/functions/vite-get-modules-list.ts create mode 100644 packages/vite/src/node/rpc/functions/vite-get-plugin-details.ts create mode 100644 packages/vite/src/node/rpc/functions/vite-get-plugin-metrics.ts create mode 100644 packages/vite/src/node/rpc/functions/vite-get-server-metrics.ts create mode 100644 packages/vite/src/node/rpc/functions/vite-resolve-id.ts diff --git a/docs/errors/VDT0001.md b/docs/errors/VDT0001.md new file mode 100644 index 00000000..2066fab8 --- /dev/null +++ b/docs/errors/VDT0001.md @@ -0,0 +1,25 @@ +--- +outline: deep +--- + +# VDT0001: Inspect Context Unavailable + +## Message + +> Vite inspect context is not available for this DevTools context. + +## Cause + +A `vite:inspect:*` RPC function was called in a DevTools context that did not register the Vite inspect collector. + +## Example + +Calling `vite:inspect:get-modules-list` while only the base Vite metadata RPC functions are registered triggers this error. + +## Fix + +Register the Vite UI plugin with inspect collection enabled before calling `vite:inspect:*` RPC functions. + +## Source + +- [`packages/vite/src/node/inspect/context.ts`](https://github.com/vitejs/devtools/blob/main/packages/vite/src/node/inspect/context.ts) — `getViteInspectContext()` throws this when no inspect context was registered for the current DevTools context. diff --git a/docs/errors/VDT0002.md b/docs/errors/VDT0002.md new file mode 100644 index 00000000..ce16c0c7 --- /dev/null +++ b/docs/errors/VDT0002.md @@ -0,0 +1,25 @@ +--- +outline: deep +--- + +# VDT0002: Inspect Target Not Found + +## Message + +> Vite inspect target "`{id}`" was not found in `{target}`. + +## Cause + +An inspect RPC query referenced a Vite instance or environment that the collector has not recorded. + +## Example + +Calling `vite:inspect:get-module-transform-info` with an unknown `{ vite, env }` query triggers this error. + +## Fix + +Read `vite:inspect:get-metadata` first and pass one of the returned Vite instance IDs and environment names to follow-up inspect RPC calls. + +## Source + +- [`packages/vite/src/node/inspect/context.ts`](https://github.com/vitejs/devtools/blob/main/packages/vite/src/node/inspect/context.ts) — `getViteContext()` and `getEnvContext()` throw this when a query references an unknown inspect target. diff --git a/docs/errors/index.md b/docs/errors/index.md index 10004303..05772d60 100644 --- a/docs/errors/index.md +++ b/docs/errors/index.md @@ -9,7 +9,7 @@ Vite DevTools uses structured diagnostics to surface actionable warnings and err ## How error codes work - Codes follow the pattern **prefix + 4-digit number** (e.g., `DF0001`, `DTK0008`, `RDDT0002`). -- Each prefix maps to a package: `DTK` for `@vitejs/devtools` (Vite-specific pieces), `RDDT` for `@vitejs/devtools-rolldown`. The framework-neutral `devframe` package documents its own `DF`-prefixed codes at the [Devframe docs site](https://devfra.me/errors/). +- Each prefix maps to a package: `DTK` for `@vitejs/devtools` (Vite-specific pieces), `RDDT` for `@vitejs/devtools-rolldown`, `VDT` for `@vitejs/devtools-vite`. The framework-neutral `devframe` package documents its own `DF`-prefixed codes at the [Devframe docs site](https://devfra.me/errors/). - Every error page includes the cause, recommended fix, and a reference to the source file that emits it. - The diagnostics system is powered by [`nostics`](https://github.com/vercel-labs/nostics), which provides structured diagnostic codes with docs URLs and ANSI-formatted console output. @@ -42,3 +42,12 @@ Emitted by `@vitejs/devtools-rolldown`. |------|-------|-------| | [RDDT0001](./RDDT0001) | warn | Rolldown Logs Directory Not Found | | [RDDT0002](./RDDT0002) | warn | Rolldown Log Reader Bad Line | + +## Vite DevTools (VDT) + +Emitted by `@vitejs/devtools-vite`. + +| Code | Level | Title | +|------|-------|-------| +| [VDT0001](./VDT0001) | error | Inspect Context Unavailable | +| [VDT0002](./VDT0002) | error | Inspect Target Not Found | diff --git a/docs/kit/diagnostics.md b/docs/kit/diagnostics.md index cadb527e..5d1d6657 100644 --- a/docs/kit/diagnostics.md +++ b/docs/kit/diagnostics.md @@ -75,7 +75,7 @@ Prefixes used by the in-tree packages: | `DF` | `devframe` | | `DTK` | `@vitejs/devtools` | | `RDDT` | `@vitejs/devtools-rolldown` | -| `VDT` | `@vitejs/devtools-vite` (reserved) | +| `VDT` | `@vitejs/devtools-vite` | Each definition supports `why` (string or function returning a string) and an optional `fix` (string or function). A `docsBase` on the definition group auto-attaches a per-code URL to every emitted diagnostic. diff --git a/packages/rolldown/src/app/components/assets/Sunburst.vue b/packages/rolldown/src/app/components/assets/Sunburst.vue index 1792a71f..6f61b53e 100644 --- a/packages/rolldown/src/app/components/assets/Sunburst.vue +++ b/packages/rolldown/src/app/components/assets/Sunburst.vue @@ -1,6 +1,7 @@ @@ -101,7 +107,9 @@ function unselectToggle() { @change="toggleRule(rule)" >
-
{{ rule.description || rule.name }}
+
+ {{ rule.description || rule.name }} +