|
| 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) |
0 commit comments