Skip to content

Commit 8503777

Browse files
committed
feat: basic module graph
1 parent f5fa6e7 commit 8503777

File tree

7 files changed

+98
-36
lines changed

7 files changed

+98
-36
lines changed

packages/devtools/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"get-port-please": "catalog:deps",
4242
"h3": "catalog:deps",
4343
"launch-editor": "catalog:deps",
44-
"mlly": "catalog:testing",
44+
"mlly": "catalog:deps",
4545
"mrmime": "catalog:deps",
4646
"ohash": "catalog:deps",
4747
"open": "catalog:deps",

packages/devtools/src/app/components/flowmap/ModuleFlow.vue

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script setup lang="ts">
22
import type { ModuleInfo, RolldownModuleFlowNode, RolldownModuleLoadNoChanges, RolldownModuleTransformInfo, RolldownModuleTransformNoChanges } from '../../../node/rpc/functions/rolldown-get-module-info'
33
import type { SessionContext } from '../../types/data'
4+
import { Menu as VMenu } from 'floating-vue'
45
import { computed, ref, shallowRef, toRefs } from 'vue'
56
import PluginName from '../display/PluginName.vue'
67
@@ -104,17 +105,72 @@ const codeDisplay = computed(() => {
104105
</script>
105106

106107
<template>
107-
<div of-auto>
108-
<FlowmapNode
109-
:lines="{ bottom: true }" pt4
110-
:active="selected != null"
111-
>
112-
<template #content>
113-
<div p2>
114-
<DisplayModuleId :id="info.id" />
115-
</div>
108+
<div of-auto pt4>
109+
<div v-if="info.importers?.length" flex="~ gap-2" pb4 text-sm>
110+
<VMenu>
111+
<FlowmapNode :lines="{ bottom: true }" :active="selected != null" class-node-outer="border-dashed">
112+
<template #inner>
113+
<div flex="~ items-center gap-1" text-sm text-blue px3 py1>
114+
<div i-ph-arrows-merge-duotone rotate-270 />
115+
{{ info.importers?.length }} importers
116+
</div>
117+
</template>
118+
</FlowmapNode>
119+
<template #popper="{ hide }">
120+
<div p2 flex="~ col gap-1">
121+
<DisplayModuleId
122+
v-for="importer of info.importers"
123+
:id="importer"
124+
:key="importer"
125+
:session="session"
126+
:link="true"
127+
class="hover:bg-active"
128+
px2 py1 rounded
129+
@click="hide"
130+
/>
131+
</div>
132+
</template>
133+
</VMenu>
134+
</div>
135+
<div flex="~">
136+
<FlowmapNode
137+
:lines="{ bottom: true }"
138+
:active="selected != null"
139+
>
140+
<template #content>
141+
<div p2>
142+
<DisplayModuleId :id="info.id" />
143+
</div>
144+
</template>
145+
</FlowmapNode>
146+
<template v-if="info.imports?.length">
147+
<div w-10 border="t base dashed" mya />
148+
<VMenu mya>
149+
<FlowmapNode :active="selected != null" class-node-outer="border-dashed">
150+
<template #inner>
151+
<div flex="~ items-center gap-1" text-sm text-orange px3 py1>
152+
<div i-ph-arrows-split-duotone rotate-270 />
153+
{{ info.imports?.length }} imports
154+
</div>
155+
</template>
156+
</FlowmapNode>
157+
<template #popper="{ hide }">
158+
<div p2 flex="~ col gap-1">
159+
<DisplayModuleId
160+
v-for="imp of info.imports"
161+
:id="imp"
162+
:key="imp"
163+
:session="session"
164+
:link="true"
165+
class="hover:bg-active"
166+
px2 py1 rounded
167+
@click="hide"
168+
/>
169+
</div>
170+
</template>
171+
</VMenu>
116172
</template>
117-
</FlowmapNode>
173+
</div>
118174
<div w-max flex="~ gap-4">
119175
<div select-none>
120176
<FlowmapExpandable

packages/devtools/src/node/rolldown/events-manager.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,36 @@
1-
import type { Event } from '@rolldown/debug'
1+
import type { Event, Module as ModuleInfo } from '@rolldown/debug'
22

33
export type RolldownEvent = Event & {
44
event_id: string
55
}
66

77
export class RolldownEventsManager {
88
events: RolldownEvent[] = []
9+
modules: Map<string, ModuleInfo> = new Map()
910

1011
handleEvent(raw: Event) {
1112
const event = {
1213
...raw,
1314
event_id: `${raw.timestamp}#${this.events.length}`,
1415
}
1516
this.events.push(event)
17+
18+
if ('module_id' in event) {
19+
if (this.modules.has(event.module_id))
20+
return
21+
this.modules.set(event.module_id, {
22+
id: event.module_id,
23+
is_external: false,
24+
imports: [],
25+
importers: [],
26+
})
27+
}
28+
if (event.action === 'ModuleGraphReady') {
29+
for (const module of event.modules) {
30+
this.modules.set(module.id, module)
31+
}
32+
}
33+
1634
return event
1735
}
1836

packages/devtools/src/node/rpc/functions/rolldown-get-module-info.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@ export interface ModuleInfo {
99
loads: RolldownModuleLoadInfo[]
1010
transforms: RolldownModuleTransformInfo[]
1111
resolve_ids: RolldownResolveInfo[]
12-
13-
// TODO: Awaits https://github.com/rolldown/rolldown/issues/4135
14-
deps: string[]
15-
importers: string[]
12+
imports: string[] | null
13+
importers: string[] | null
1614
}
1715

1816
export interface RolldownResolveInfo {
@@ -94,9 +92,10 @@ export const rolldownGetModuleInfo = defineRpcFunction({
9492
id: module,
9593
loads: [],
9694
transforms: [],
97-
deps: [],
95+
imports: [],
9896
importers: [],
9997
resolve_ids: [],
98+
...reader.manager.modules.get(module) || {},
10099
}
101100

102101
events.forEach((start, index) => {

packages/devtools/src/node/rpc/functions/rolldown-get-module-list.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,7 @@ export const rolldownGetModuleList = defineRpcFunction({
1010
handler: async ({ session }: { session: string }) => {
1111
const reader = RolldownEventsReader.get(join(cwd, '.rolldown', session, 'logs.json'))
1212
await reader.read()
13-
const modules = new Set<string>()
14-
for (const event of reader.manager.events) {
15-
if ('module_id' in event) {
16-
modules.add(event.module_id)
17-
}
18-
}
19-
return Array.from(modules)
20-
.map((id) => {
21-
return {
22-
id,
23-
}
24-
})
13+
return Array.from(reader.manager.modules.values())
2514
.sort((a, b) => a.id.localeCompare(b.id))
2615
},
2716
}

packages/devtools/src/uno.config.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export default defineConfig({
2828
'fg-flow-line-active': 'color-primary-700/30 dark:color-primary-300/30',
2929

3030
'bg-tooltip': 'bg-white:75 dark:bg-#111:75 backdrop-blur-8',
31-
'bg-code': 'bg-gray5:5',
31+
'bg-code': 'bg-gray-500:5',
3232

3333
'bg-gradient-more': 'bg-gradient-to-t from-white via-white:80 to-white:0 dark:from-#111 dark:via-#111:80 dark:to-#111:0',
3434

@@ -59,11 +59,11 @@ export default defineConfig({
5959
'op-mute': 'op30 dark:op25',
6060
'color-deprecated': 'text-op85 text-[#b71c1c] dark:text-[#f87171]',
6161

62-
'color-scale-neutral': 'text-gray-700:75 dark:text-gray-700:75!',
63-
'color-scale-low': 'text-lime-700:75 dark:text-lime-700:75! dark:saturate-50',
64-
'color-scale-medium': 'text-amber-700:85 dark:text-amber-700:85! dark:saturate-80',
65-
'color-scale-high': 'text-orange-700:95 dark:text-orange-700:95!',
66-
'color-scale-critical': 'text-red-700:95 dark:text-red-700:95!',
62+
'color-scale-neutral': 'text-gray-700:75 dark:text-gray-300:75!',
63+
'color-scale-low': 'text-lime-700:75 dark:text-lime-300:75! dark:saturate-50',
64+
'color-scale-medium': 'text-amber-700:85 dark:text-amber-300:85! dark:saturate-80',
65+
'color-scale-high': 'text-orange-700:95 dark:text-orange-300:95!',
66+
'color-scale-critical': 'text-red-700:95 dark:text-red-300:95!',
6767

6868
'page-padding': 'pt-24 pl-112 pr-8 pb-8',
6969
'page-padding-collapsed': 'pt-24 pl-14 pr-8 pb-8',

pnpm-workspace.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ catalogs:
2525
get-port-please: ^3.1.2
2626
h3: ^1.15.3
2727
launch-editor: ^2.10.0
28+
mlly: ^1.7.4
2829
mrmime: ^2.0.1
2930
ohash: ^2.0.11
3031
open: ^10.1.2
@@ -78,7 +79,6 @@ catalogs:
7879
inlined:
7980
'@antfu/utils': ^9.2.0
8081
testing:
81-
mlly: ^1.7.4
8282
vitest: ^3.1.3
8383
types:
8484
'@types/codemirror': ^5.60.15

0 commit comments

Comments
 (0)