Skip to content

Commit 9a44fec

Browse files
committed
Merge remote-tracking branch 'origin/main' into antfu/migrate-devframe-hub-0.5.2
# Conflicts: # packages/core/src/client/webcomponents/.generated/css.ts # pnpm-lock.yaml # pnpm-workspace.yaml
2 parents 301f85d + 4cbbefc commit 9a44fec

16 files changed

Lines changed: 509 additions & 364 deletions

File tree

packages/core/src/client/webcomponents/.generated/css.ts

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

packages/core/src/client/webcomponents/components/dock/DockEdge.vue

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,10 +161,34 @@ const panelStyle = computed<CSSProperties>(() => {
161161
return style
162162
})
163163
164+
const panelLayoutClass = computed(() => {
165+
switch (store.position) {
166+
case 'bottom':
167+
return 'flex flex-col-reverse'
168+
case 'top':
169+
return 'flex flex-col'
170+
case 'left':
171+
return 'flex flex-row'
172+
case 'right':
173+
return 'flex flex-row-reverse'
174+
default:
175+
return 'flex flex-col-reverse'
176+
}
177+
})
178+
164179
const toolbarClass = computed(() => {
165-
return isVertical.value
166-
? 'flex-col h-full w-[40px] border-r border-base'
167-
: 'flex-row w-full border-b border-base'
180+
switch (store.position) {
181+
case 'bottom':
182+
return 'flex-row w-full border-t border-base'
183+
case 'top':
184+
return 'flex-row w-full border-b border-base'
185+
case 'left':
186+
return 'flex-col h-full w-[40px] border-r border-base'
187+
case 'right':
188+
return 'flex-col h-full w-[40px] border-l border-base'
189+
default:
190+
return 'flex-row w-full border-t border-base'
191+
}
168192
})
169193
170194
const contentClass = computed(() => {
@@ -178,7 +202,7 @@ const contentClass = computed(() => {
178202
<div
179203
id="vite-devtools-edge-panel"
180204
class="bg-glass:75 border border-base color-base shadow overflow-hidden z-floating-anchor font-sans text-[15px] box-border"
181-
:class="`flex ${isVertical ? 'flex-row' : 'flex-col'}`"
205+
:class="panelLayoutClass"
182206
:style="panelStyle"
183207
>
184208
<DockPanelResizer v-if="hasPanelContent" :panel="context.panel" edge-mode />

packages/rolldown/package.json

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
},
3636
"dependencies": {
3737
"@floating-ui/dom": "catalog:frontend",
38-
"@pnpm/read-project-manifest": "catalog:deps",
3938
"@rolldown/debug": "catalog:deps",
4039
"@vitejs/devtools-kit": "workspace:*",
4140
"birpc": "catalog:deps",
@@ -78,45 +77,5 @@
7877
"tsdown": "catalog:build",
7978
"unocss": "catalog:build",
8079
"vite-hot-client": "catalog:frontend"
81-
},
82-
"inlinedDependencies": {
83-
"@babel/code-frame": "7.29.0",
84-
"@babel/helper-validator-identifier": "7.28.5",
85-
"@gwhitney/detect-indent": "7.0.1",
86-
"@pnpm/constants": "1001.3.1",
87-
"@pnpm/core-loggers": "1001.0.9",
88-
"@pnpm/error": "1000.1.0",
89-
"@pnpm/graceful-fs": "1000.1.0",
90-
"@pnpm/logger": "1001.0.1",
91-
"@pnpm/manifest-utils": "1002.0.5",
92-
"@pnpm/read-project-manifest": "1001.2.6",
93-
"@pnpm/semver.peer-range": "1000.0.0",
94-
"@pnpm/text.comments-parser": "1000.0.0",
95-
"@pnpm/types": "1001.3.0",
96-
"@pnpm/write-project-manifest": "1000.0.16",
97-
"bole": "5.0.25",
98-
"error-ex": "1.3.4",
99-
"fast-deep-equal": "3.1.3",
100-
"fast-safe-stringify": "2.1.1",
101-
"graceful-fs": "4.2.11",
102-
"imurmurhash": "0.1.4",
103-
"individual": "3.0.0",
104-
"is-arrayish": "0.2.1",
105-
"is-windows": "1.0.2",
106-
"js-tokens": "4.0.0",
107-
"js-yaml": "4.1.1",
108-
"json-parse-even-better-errors": "2.3.1",
109-
"json5": "2.2.3",
110-
"lines-and-columns": "1.2.4",
111-
"parse-json": "5.2.0",
112-
"picocolors": "1.1.1",
113-
"read-yaml-file": "2.1.0",
114-
"semver": "7.8.0",
115-
"signal-exit": "4.1.0",
116-
"split2": "4.2.0",
117-
"strip-bom": "4.0.0",
118-
"strip-comments-strings": "1.2.0",
119-
"write-file-atomic": "5.0.1",
120-
"write-yaml-file": "5.0.0"
12180
}
12281
}

packages/rolldown/src/app/components/data/PackageDetailsLoader.vue

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,6 @@ const props = defineProps<{
1313
const emit = defineEmits<{
1414
(e: 'close'): void
1515
}>()
16-
const parsedPackage = computed(() => {
17-
const match = props.package.match(/^(@?[^@]+)@(.+)$/)
18-
const [, name, version] = match!
19-
return { name, version }
20-
})
2116
const rpc = useRpc()
2217
const { state, isLoading } = useAsyncState(
2318
async () => {
@@ -33,6 +28,7 @@ const { state, isLoading } = useAsyncState(
3328
)
3429
3530
const normalizedBundledFiles = computed(() => state.value?.files?.filter(f => !!f.transformedCodeSize) ?? [])
31+
const packageName = computed(() => state.value?.name ?? props.package)
3632
3733
const importers = computed(() => {
3834
const pathMap = new Map()
@@ -43,7 +39,7 @@ const importers = computed(() => {
4339
})
4440
4541
function openInNpm() {
46-
const url = `https://www.npmjs.com/package/${parsedPackage.value.name}`
42+
const url = `https://www.npmjs.com/package/${packageName.value}`
4743
window.open(url, '_blank')
4844
}
4945
</script>
@@ -56,7 +52,7 @@ function openInNpm() {
5652
<div flex="~ gap-3 items-center" :title="package">
5753
<div flex="~ items-center gap-1">
5854
<div>
59-
<DisplayHighlightedPackageName :name="parsedPackage.name!" />
55+
<DisplayHighlightedPackageName :name="packageName" />
6056
</div>
6157
<DisplayFileSizeBadge :bytes="state.transformedCodeSize" />
6258
</div>

packages/rolldown/src/app/components/packages/Duplicated.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ const groupedDuplicatePackages = computed(() =>
1919
<template>
2020
<div v-if="duplicatePackages.length" min-w-max flex="~ col gap-3">
2121
<div v-for="(p, i) of groupedDuplicatePackages" :key="i">
22-
<PackagesTable :packages="p" :session="session" group-view disable-size-sort />
22+
<PackagesTable :packages="p" :session="session" group-view disable-size-sort show-used-badge />
2323
</div>
2424
</div>
2525
<template v-else>

packages/rolldown/src/app/components/packages/Table.vue

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<script setup lang="ts">
22
import type { PackageInfo, SessionContext } from '~~/shared/types'
33
import DataVirtualList from '@vitejs/devtools-ui/components/DataVirtualList.vue'
4+
import DisplayBadge from '@vitejs/devtools-ui/components/DisplayBadge.vue'
45
import { useCycleList } from '@vueuse/core'
56
import { Tooltip, Menu as VMenu } from 'floating-vue'
67
import { settings } from '~~/app/state/settings'
@@ -14,12 +15,14 @@ withDefaults(defineProps<{
1415
itemSize?: number
1516
pageMode?: boolean
1617
scroller?: 'dynamic' | 'fixed' | 'window'
18+
showUsedBadge?: boolean
1719
}>(), {
1820
disableSizeSort: false,
1921
groupView: false,
2022
itemSize: 36,
2123
pageMode: false,
2224
scroller: 'fixed',
25+
showUsedBadge: false,
2326
})
2427
2528
const route = useRoute()
@@ -40,7 +43,7 @@ function toggleSizeSortType() {
4043
role="table"
4144
min-w-max h-full min-h-0 border="~ base rounded-xl"
4245
:items="packages"
43-
key-prop="dir"
46+
key-prop="id"
4447
:item-size="itemSize"
4548
:page-mode="pageMode"
4649
:scroller="scroller"
@@ -81,7 +84,7 @@ function toggleSizeSortType() {
8184
h-9
8285
class="border-base border-b-1 border-dashed"
8386
:class="[index === packages.length - 1 ? 'border-b-0' : '']"
84-
:to="{ path: route.path, query: { package: `${item.name}@${item.version}` } }"
87+
:to="{ path: route.path, query: { package: item.id } }"
8588
>
8689
<Tooltip
8790
:triggers="['hover']"
@@ -100,11 +103,17 @@ function toggleSizeSortType() {
100103
</span>
101104
</template>
102105
</Tooltip>
103-
<div role="cell" flex="~ items-center" text-left flex-none font-mono py1.5 px2 text-sm min-w40 op80 :class="{ 'text-primary': item.duplicated }">
104-
{{ item.version }}
106+
<div role="cell" flex="~ items-center gap-1" text-left flex-none font-mono py1.5 px2 text-sm min-w40 op80 :class="{ 'text-primary': item.duplicated }">
107+
<span>{{ item.version }}</span>
108+
<DisplayBadge
109+
v-if="showUsedBadge && item.isUsed === false"
110+
text="Unbundled"
111+
:color="30"
112+
as="span"
113+
/>
105114
</div>
106115
<div role="cell" flex="~ items-center justify-end" flex-none font-mono py1.5 px2 text-sm min-w40 op80>
107-
<VMenu :delay="{ show: 200, hide: 0 }">
116+
<VMenu v-if="item.transformedCodeSize > 0" :delay="{ show: 200, hide: 0 }">
108117
<DisplayFileSizeBadge :bytes="item.transformedCodeSize" />
109118
<template #popper>
110119
<div p2 flex="~ col gap-1">
@@ -117,6 +126,7 @@ function toggleSizeSortType() {
117126
</div>
118127
</template>
119128
</VMenu>
129+
<span v-else op50 ws-nowrap>-</span>
120130
</div>
121131
<div role="cell" flex="~ items-center" flex-1 font-mono py1.5 pl20 pr2 text-sm op80>
122132
<PackagesImporters :package="item" :session="session" :show-version="groupView" />

packages/rolldown/src/app/pages/compare/[sessions]/index.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ const sessions = ref<SessionCompareContext[]>([])
1414
const packages = ref<{ total: number, duplicated: number }[]>([])
1515
1616
async function getPackages(id: string) {
17-
const packages = await rpc.value.call('vite:rolldown:get-packages', { session: id })
17+
const packageMeta = await rpc.value.call('vite:rolldown:get-packages', { session: id })
18+
const packages = packageMeta.packages
1819
const duplicatedPackages = packages.filter(p => p.duplicated)
1920
return {
2021
total: packages.length,

packages/rolldown/src/app/pages/session/[session]/packages.vue

Lines changed: 49 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
import type { PackageInfo, SessionContext } from '~~/shared/types/data'
2+
import type { PackageInfo, PackageMeta, SessionContext } from '~~/shared/types/data'
33
import type { ClientSettings } from '~/state/settings'
44
import type { PackageChartInfo, PackageChartNode } from '~/types/chart'
55
import { computedWithControl, useAsyncState, useMouse } from '@vueuse/core'
@@ -33,13 +33,19 @@ const packageTypeRules = [
3333
description: 'Transitive Dependencies',
3434
icon: 'i-octicon:package-24 light:filter-invert-30!',
3535
},
36+
{
37+
match: /.*/,
38+
name: 'unbundled',
39+
description: 'Unbundled Dependencies',
40+
icon: 'i-ph-package-duotone',
41+
},
3642
]
3743
const rpc = useRpc()
38-
const searchValue = ref<{ search: string, selected: string[] }>({
44+
const searchValue = ref<{ search: string, selected: string[] | null }>({
3945
search: '',
4046
selected: ['direct', 'transitive'],
4147
})
42-
const { state: packages, isLoading } = useAsyncState(
48+
const { state: packageMeta, isLoading } = useAsyncState<PackageMeta | null>(
4349
async () => {
4450
return await rpc.value.call(
4551
'vite:rolldown:get-packages',
@@ -48,26 +54,43 @@ const { state: packages, isLoading } = useAsyncState(
4854
},
4955
null,
5056
)
57+
const isSupported = computed(() => packageMeta.value?.isSupported ?? true)
58+
const packages = computed(() => packageMeta.value?.packages ?? [])
5159
5260
const fuse = computedWithControl(
5361
() => packages.value,
54-
() => new Fuse(packages.value!, {
62+
() => new Fuse(packages.value, {
5563
includeScore: true,
5664
keys: ['name'],
5765
ignoreLocation: true,
5866
threshold: 0.4,
5967
}),
6068
)
6169
62-
const duplicatePackagesCount = computed(() => {
63-
if (!packages.value) {
64-
return 0
65-
}
66-
return Object.values(packages.value!.reduce((acc, p) => {
67-
acc[p.name] = (acc[p.name] || 0) + 1
68-
return acc
69-
}, {} as Record<string, number>)).filter(count => count > 1).length
70-
})
70+
const searched = computed(() => (
71+
searchValue.value.search
72+
? fuse.value.search(searchValue.value.search).map(r => r.item)
73+
: [...packages.value]),
74+
)
75+
76+
function matchesSelectedPackageType(item: PackageInfo) {
77+
const selected = searchValue.value.selected
78+
if (!selected)
79+
return true
80+
81+
if (item.isUsed === false)
82+
return selected.includes('unbundled')
83+
84+
return selected.includes(item.type || '')
85+
}
86+
87+
const filteredPackages = computed(() => searched.value.filter(matchesSelectedPackageType))
88+
89+
const duplicatePackagesCount = computed(() => new Set(
90+
packages.value
91+
.filter(item => item.duplicated)
92+
.map(item => item.name),
93+
).size)
7194
7295
const packageViewTypes = computed(() => [
7396
{
@@ -87,21 +110,15 @@ const packageViewTypes = computed(() => [
87110
},
88111
] as const)
89112
90-
const searched = computed(() => (
91-
searchValue.value.search
92-
? fuse.value.search(searchValue.value.search).map(r => r.item)
93-
: [...(packages.value || [])]),
94-
)
95-
96113
const normalizedPackages = computed(() => {
97114
const packagesSizeSortType = settings.value.packageSizeSortType
98-
const data = searched.value.toSorted((a, b) => (a.name || '').localeCompare(b.name || ''))
115+
const data = filteredPackages.value.toSorted((a, b) => (a.name || '').localeCompare(b.name || ''))
99116
100117
const sortedPackages = packagesSizeSortType
101118
? data.sort((a, b) => packagesSizeSortType === 'asc' ? a.transformedCodeSize - b.transformedCodeSize : b.transformedCodeSize - a.transformedCodeSize)
102119
: data
103120
104-
return sortedPackages.filter(item => !searchValue.value.selected || searchValue.value.selected.some(rule => rule.match(item.type!)))
121+
return sortedPackages
105122
})
106123
107124
function toggleDisplay(type: ClientSettings['packageViewType']) {
@@ -123,7 +140,7 @@ const { tree, chartOptions, graph, nodeHover, nodeSelected, selectedNode, select
123140
},
124141
onClick(node) {
125142
if (node.meta?.type === 'package') {
126-
router.replace({ query: { ...route.query, package: `${node.meta?.name}@${node.meta?.version}` } })
143+
router.replace({ query: { ...route.query, package: node.meta.id } })
127144
}
128145
},
129146
onLeave() {
@@ -151,6 +168,14 @@ watch(() => settings.value.packageViewType, () => {
151168

152169
<template>
153170
<VisualLoading v-if="isLoading" />
171+
<div v-else-if="!isSupported" h-full flex="~ col gap-2 items-center justify-center" p4 text-center>
172+
<p m0 op50>
173+
Package graph is not available for this build
174+
</p>
175+
<p m0 op40 text-sm>
176+
Rebuild with Rolldown 1.0.2 or later to generate it.
177+
</p>
178+
</div>
154179
<div v-else relative h-full min-h-0 flex="~ col">
155180
<div sticky left-4 right-4 top-4 z-panel-nav p-4>
156181
<DataSearchPanel v-model="searchValue" :rules="packageTypeRules">
@@ -179,7 +204,7 @@ watch(() => settings.value.packageViewType, () => {
179204
<div
180205
fixed bottom-4 py-1 px-2 bg-glass left="1/2" translate-x="-1/2" border="~ base rounded-full" text="center xs"
181206
>
182-
<span op50>{{ searched.length }} of {{ packages?.length || 0 }}</span>
207+
<span op50>{{ normalizedPackages.length }} of {{ packages.length }}</span>
183208
</div>
184209
</template>
185210
<template v-else-if="settings.packageViewType === 'treemap'">
@@ -203,7 +228,7 @@ watch(() => settings.value.packageViewType, () => {
203228
</span>
204229
</template>
205230
<template v-else-if="settings.packageViewType === 'duplicate-packages'">
206-
<PackagesDuplicated :packages="normalizedPackages" :session="session" />
231+
<PackagesDuplicated :packages="packages" :session="session" />
207232
</template>
208233
</div>
209234
<DisplayGraphHoverView :hover-x="mouse.x" :hover-y="mouse.y">

0 commit comments

Comments
 (0)