Skip to content

Commit aa2a894

Browse files
committed
refined the routing for the changelog info api & latest will now only be cached for 2 hours while versioned stays 24 hours
1 parent 73dd529 commit aa2a894

File tree

8 files changed

+56
-48
lines changed

8 files changed

+56
-48
lines changed

app/composables/usePackageChangelog.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ export function usePackageChangelog(
88
const name = toValue(packageName)
99
if (!name) return 'data:text/json,null' // returns null
1010
const ver = toValue(version)
11-
const base = `/api/changelog/info/${name}`
12-
return ver ? `${base}/v/${ver}` : base
11+
return `/api/changelog/info/${name}/v/${ver || 'latest'}`
1312
})
1413
}

app/pages/package-changelog/[[org]]/[name].vue

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,13 +170,11 @@ defineOgImageComponent('Default', {
170170
:viewOnGit
171171
/>
172172
</LazyChangelogMarkdown>
173-
174-
<!-- <p class="mt-5" v-else-></p> -->
175173
</template>
176174
<template #fallback>
177175
<section class="flex flex-col gap-2 py-3">
178176
<SkeletonBlock class="h-8 w-40 rounded" />
179-
<ul class="ms-3 list-disc my-[1rem] ps-[1.5rem] marker:color-[--border-hover]">
177+
<ul class="ms-3 list-disc my-[1rem] ps-[1.5rem] marker:color-border-hover">
180178
<li class="mb-1" v-for="_n in 5">
181179
<SkeletonBlock class="h-7 w-full max-w-2xl rounded" />
182180
</li>

server/api/changelog/info/[...pkg].get.ts

Lines changed: 0 additions & 42 deletions
This file was deleted.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import type { ExtendedPackageJson } from '#shared/utils/package-analysis'
2+
import { VersionSchema, PackageNameSchema } from '#shared/schemas/package'
3+
import { ERROR_PACKAGE_DETECT_CHANGELOG, NPM_REGISTRY } from '#shared/utils/constants'
4+
import * as v from 'valibot'
5+
import { detectChangelog } from '~~/server/utils/changelog/detectChangelog'
6+
7+
function getChangelogRouteParams(event: Parameters<typeof getRouterParam>[0]) {
8+
const org = getRouterParam(event, 'org')
9+
const name = getRouterParam(event, 'name')
10+
const rawVersion = getRouterParam(event, 'version')
11+
const rawPackageName = org ? `${org}/${name}` : name
12+
13+
return { rawVersion, rawPackageName }
14+
}
15+
16+
// setting cache options
17+
export const defaultChangelogCacheOptions: Parameters<typeof defineCachedEventHandler>[1] = {
18+
maxAge: CACHE_MAX_AGE_ONE_DAY, // 24 hours
19+
swr: true,
20+
getKey: event => {
21+
const { rawPackageName = '', rawVersion = 'latest' } = getChangelogRouteParams(event)
22+
return `changelogInfo:v1:${rawPackageName.trim().replaceAll('/', ':')}:${rawVersion.trim()}`
23+
},
24+
shouldBypassCache: () => import.meta.dev,
25+
}
26+
27+
// handler
28+
export default defineCachedEventHandler(async event => {
29+
const { rawPackageName, rawVersion } = getChangelogRouteParams(event)
30+
31+
try {
32+
const packageName = v.parse(PackageNameSchema, rawPackageName)
33+
const version = v.parse(v.optional(VersionSchema), rawVersion)
34+
const encodedName = encodePackageName(packageName)
35+
const versionSuffix = version ? `/${version}` : '/latest'
36+
const pkg = await $fetch<ExtendedPackageJson>(`${NPM_REGISTRY}/${encodedName}${versionSuffix}`)
37+
38+
return await detectChangelog(pkg)
39+
} catch (error) {
40+
handleApiError(error, {
41+
statusCode: 502,
42+
message: ERROR_PACKAGE_DETECT_CHANGELOG,
43+
})
44+
}
45+
}, defaultChangelogCacheOptions)
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import eventHandler, { defaultChangelogCacheOptions } from './[version].get'
2+
3+
export default defineCachedEventHandler(eventHandler, {
4+
...defaultChangelogCacheOptions,
5+
maxAge: CACHE_MAX_AGE_ONE_HOUR * 2,
6+
})
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from '../../../[name]/v/[version].get'
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from '../../../[name]/v/latest.get'

shared/schemas/package.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export const PackageNameSchema = v.pipe(
1919
* Enforces a SemVer-like pattern to prevent directory traversal or complex injection attacks
2020
* includes: alphanumeric, dots, underscores, dashes, and plus signs (for build metadata)
2121
*/
22-
const VersionSchema = v.pipe(
22+
export const VersionSchema = v.pipe(
2323
v.string(),
2424
v.nonEmpty('Version is required'),
2525
v.regex(/^[\w.+-]+$/, 'Invalid version format'),

0 commit comments

Comments
 (0)