Skip to content

Commit 0028fa7

Browse files
OrbisKantfu
andauthored
feat: apply filter to MultipleVersions (#3)
Co-authored-by: Anthony Fu <github@antfu.me>
1 parent f3fb6bc commit 0028fa7

File tree

5 files changed

+37
-20
lines changed

5 files changed

+37
-20
lines changed

packages/node-modules-inspector/src/app/components/panel/PackageDetails.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import type { PackageNode } from 'node-modules-tools'
33
import { DisplayNumberBadge } from '#components'
44
import { Menu as VMenu } from 'floating-vue'
55
import { computed } from 'vue'
6-
import { getPackageFromSpec, packageVersionsMap } from '~/state/data'
6+
import { getPackageFromSpec } from '~/state/data'
7+
import { packageVersionsMap } from '~/state/filters'
78
import { query } from '~/state/query'
89
import { settings } from '~/state/settings'
910
@@ -12,7 +13,7 @@ const props = defineProps<{
1213
}>()
1314
1415
const duplicated = computed(() => {
15-
const value = packageVersionsMap.get(props.pkg.name)
16+
const value = packageVersionsMap.value.get(props.pkg.name)
1617
if (value && value?.length > 1)
1718
return value
1819
return undefined

packages/node-modules-inspector/src/app/components/report/MultipleVersions.vue

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
11
<script setup lang="ts">
2+
import { computed } from 'vue'
23
import { compareSemver } from '~~/shared/utils'
34
import { selectedNode } from '~/state/current'
4-
import { packageVersionsMap } from '~/state/data'
5+
import { filteredPackages } from '~/state/filters'
6+
import { buildVersionToPackagesMap } from '~/utils/maps'
57
6-
const duplicated = Array.from(packageVersionsMap.values())
8+
const versionMap = computed(() => buildVersionToPackagesMap(filteredPackages.value))
9+
const duplicated = computed(() => Array.from(versionMap.value.values())
710
.filter(packages => packages.length > 1)
8-
.sort((a, b) => b.length - a.length)
11+
.sort((a, b) => b.length - a.length))
912
10-
duplicated.forEach((packages) => {
11-
packages.sort((a, b) => compareSemver(a.version, b.version))
12-
})
13+
const sorted = computed(() => duplicated.value.map((packages) => {
14+
return packages.sort((a, b) => compareSemver(a.version, b.version))
15+
}))
1316
</script>
1417

1518
<template>
1619
<div grid="~ cols-minmax-200px gap-4">
1720
<div
18-
v-for="pkgs of duplicated" :key="pkgs[0].spec"
21+
v-for="pkgs of sorted" :key="pkgs[0].spec"
1922
border="~ base rounded-lg" bg-glass
2023
flex="~ col"
2124
:class="selectedNode && pkgs.includes(selectedNode) ? 'border-primary ring-4 ring-primary:20' : ''"

packages/node-modules-inspector/src/app/state/data.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import type { ListPackageDependenciesResult, PackageNode } from 'node-modules-tools'
22
import { useAsyncState } from '@vueuse/core'
3-
import { shallowReactive, shallowRef } from 'vue'
3+
import { shallowRef } from 'vue'
44
import { rpc } from '../composables/rpc'
55

66
export const packageData = shallowRef<ListPackageDependenciesResult | null>(null)
7-
export const packageVersionsMap = shallowReactive(new Map<string, PackageNode[]>())
87

98
export function fetchListDependenciesData() {
109
const { state } = useAsyncState(async () => {
@@ -15,12 +14,6 @@ export function fetchListDependenciesData() {
1514
Object.freeze(pkg)
1615

1716
packageData.value = data
18-
packageVersionsMap.clear()
19-
for (const pkg of packageData.value?.packages.values() || []) {
20-
if (!packageVersionsMap.has(pkg.name))
21-
packageVersionsMap.set(pkg.name, [])
22-
packageVersionsMap.get(pkg.name)!.push(pkg)
23-
}
2417

2518
return packageData.value
2619
}, null)

packages/node-modules-inspector/src/app/state/filters.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { PackageModuleType } from 'node-modules-tools'
22
import { useDebounce } from '@vueuse/core'
33
import pm from 'picomatch'
44
import { computed, reactive } from 'vue'
5+
import { buildVersionToPackagesMap } from '~/utils/maps'
56
import { getModuleType } from '../utils/module-type'
67
import { packageData } from './data'
78

@@ -41,16 +42,22 @@ const debouncedSearch = useDebounce(computed(() => filters.search), 200)
4142
export const avaliablePackages = computed(() => {
4243
// TODO: exclude packages
4344
return Array.from(packageData.value?.packages.values() || [])
45+
.filter((pkg) => {
46+
if (filters.excludes && filters.excludes.some(i => pkg.name.includes(i)))
47+
return false
48+
return true
49+
})
4450
})
4551

4652
export const workspacePackages = computed(() => avaliablePackages.value.filter(i => i.workspace))
4753

4854
export const filteredPackages = computed(() => Array.from((function *() {
49-
for (const pkg of packageData.value?.packages.values() || []) {
55+
for (const pkg of avaliablePackages.value) {
5056
if (filters.modules && !filters.modules.includes(getModuleType(pkg)))
5157
continue
5258
if (filters.licenses && !filters.licenses.includes(pkg.resolved.license || ''))
5359
continue
60+
5461
if (debouncedSearch.value) {
5562
if (debouncedSearch.value.match(/[*[\]]/)) {
5663
if (!pm.isMatch(pkg.name, debouncedSearch.value))
@@ -63,8 +70,7 @@ export const filteredPackages = computed(() => Array.from((function *() {
6370
}
6471

6572
// TODO: better excludes
66-
if (filters.excludes && filters.excludes.some(i => pkg.name.includes(i)))
67-
continue
73+
6874
if (filters.sourceType) {
6975
if (filters.sourceType === 'prod' && !pkg.prod && !pkg.workspace)
7076
continue
@@ -74,3 +80,6 @@ export const filteredPackages = computed(() => Array.from((function *() {
7480
yield pkg
7581
}
7682
})()))
83+
84+
export const packageVersionsMap = computed(() => buildVersionToPackagesMap(avaliablePackages.value))
85+
export const filteredPackageVersionsMap = computed(() => buildVersionToPackagesMap(filteredPackages.value))
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import type { PackageNode } from 'node-modules-tools'
2+
3+
export function buildVersionToPackagesMap(packages: PackageNode[]) {
4+
const map = new Map<string, PackageNode[]>()
5+
for (const pkg of packages) {
6+
if (!map.has(pkg.name))
7+
map.set(pkg.name, [])
8+
map.get(pkg.name)!.push(pkg)
9+
}
10+
return map
11+
}

0 commit comments

Comments
 (0)