Skip to content

Commit 0d06026

Browse files
authored
fix: use useFetch for useDependencyAnalysis (#551)
1 parent 94b4452 commit 0d06026

File tree

3 files changed

+8
-67
lines changed

3 files changed

+8
-67
lines changed

app/components/PackageVulnerabilityTree.vue

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,11 @@ const props = defineProps<{
77
version: string
88
}>()
99
10-
const {
11-
data: vulnTree,
12-
status,
13-
fetch: fetchVulnTree,
14-
} = useDependencyAnalysis(
10+
const { data: vulnTree, status } = useDependencyAnalysis(
1511
() => props.packageName,
1612
() => props.version,
1713
)
1814
19-
onMounted(() => fetchVulnTree())
20-
2115
const isExpanded = shallowRef(false)
2216
const showAllPackages = shallowRef(false)
2317
const showAllVulnerabilities = shallowRef(false)
Lines changed: 4 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import type { VulnerabilityTreeResult } from '#shared/types/dependency-analysis'
2-
31
/**
42
* Shared composable for dependency analysis data (vulnerabilities, deprecated packages).
53
* Fetches once and caches the result so multiple components can use it.
@@ -9,44 +7,8 @@ export function useDependencyAnalysis(
97
packageName: MaybeRefOrGetter<string>,
108
version: MaybeRefOrGetter<string>,
119
) {
12-
// Build a stable key from the current values
13-
const name = toValue(packageName)
14-
const ver = toValue(version)
15-
const key = `dep-analysis:v1:${name}@${ver}`
16-
17-
// Use useState for SSR-safe caching across components
18-
const data = useState<VulnerabilityTreeResult | null>(key, () => null)
19-
const status = useState<'idle' | 'pending' | 'success' | 'error'>(`${key}:status`, () => 'idle')
20-
const error = useState<Error | null>(`${key}:error`, () => null)
21-
22-
async function fetch() {
23-
const pkgName = toValue(packageName)
24-
const pkgVersion = toValue(version)
25-
26-
if (!pkgName || !pkgVersion) return
27-
28-
// Already fetched or fetching
29-
if (status.value === 'success' || status.value === 'pending') return
30-
31-
status.value = 'pending'
32-
error.value = null
33-
34-
try {
35-
const result = await $fetch<VulnerabilityTreeResult>(
36-
`/api/registry/vulnerabilities/${encodePackageName(pkgName)}/v/${pkgVersion}`,
37-
)
38-
data.value = result
39-
status.value = 'success'
40-
} catch (e) {
41-
error.value = e instanceof Error ? e : new Error('Failed to fetch dependency analysis')
42-
status.value = 'error'
43-
}
44-
}
45-
46-
return {
47-
data: readonly(data),
48-
status: readonly(status),
49-
error: readonly(error),
50-
fetch,
51-
}
10+
return useFetch(
11+
() =>
12+
`/api/registry/vulnerabilities/${encodePackageName(toValue(packageName))}/v/${toValue(version)}`,
13+
)
5214
}

app/pages/[...package].vue

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -93,24 +93,9 @@ const { copied: copiedPkgName, copy: copyPkgName } = useClipboard({
9393
9494
// Fetch dependency analysis (lazy, client-side)
9595
// This is the same composable used by PackageVulnerabilityTree and PackageDeprecatedTree
96-
const {
97-
data: vulnTree,
98-
status: vulnTreeStatus,
99-
fetch: fetchVulnTree,
100-
} = useDependencyAnalysis(packageName, () => displayVersion.value?.version ?? '')
101-
onMounted(() => {
102-
// Fetch vulnerability tree once displayVersion is available
103-
if (displayVersion.value) {
104-
fetchVulnTree()
105-
}
106-
})
107-
watch(
108-
() => displayVersion.value?.version,
109-
() => {
110-
if (displayVersion.value) {
111-
fetchVulnTree()
112-
}
113-
},
96+
const { data: vulnTree, status: vulnTreeStatus } = useDependencyAnalysis(
97+
packageName,
98+
() => displayVersion.value?.version ?? '',
11499
)
115100
116101
// Keep latestVersion for comparison (to show "(latest)" badge)

0 commit comments

Comments
 (0)