diff --git a/app/components/Package/Header.vue b/app/components/Package/Header.vue index 571dff4264..8af227e8a9 100644 --- a/app/components/Package/Header.vue +++ b/app/components/Package/Header.vue @@ -164,15 +164,7 @@ const diffLink = computed((): RouteLocationRaw | null => { const timelineLink = computed((): RouteLocationRaw | null => { if (props.pkg == null || props.resolvedVersion == null) return null - const split = props.pkg.name.split('/') - return { - name: 'timeline', - params: { - org: split.length === 2 ? split[0] : undefined, - packageName: split.length === 2 ? split[1]! : split[0]!, - version: props.resolvedVersion, - }, - } + return packageTimelineRoute(props.pkg.name, props.resolvedVersion) }) useShortcuts({ diff --git a/app/composables/useCommandPalettePackageCommands.ts b/app/composables/useCommandPalettePackageCommands.ts index 5533acd5c4..cf09fa5997 100644 --- a/app/composables/useCommandPalettePackageCommands.ts +++ b/app/composables/useCommandPalettePackageCommands.ts @@ -88,6 +88,20 @@ export function useCommandPalettePackageCommands( activeLabel: activeLabel(route.name === 'code', t('command_palette.here')), to: codeLink, }, + { + id: 'package-timeline', + group: 'package', + label: t('package.links.timeline'), + keywords: [ + resolvedContext.packageName, + t('shortcuts.open_timeline'), + t('package.links.timeline'), + ], + iconClass: 'i-lucide:history', + active: route.name === 'timeline', + activeLabel: activeLabel(route.name === 'timeline', t('command_palette.here')), + to: packageTimelineRoute(resolvedContext.packageName, resolvedContext.resolvedVersion), + }, { id: 'package-compare', group: 'package', diff --git a/app/composables/useCommandPaletteVersionCommands.ts b/app/composables/useCommandPaletteVersionCommands.ts index ecc676e50f..f02b563795 100644 --- a/app/composables/useCommandPaletteVersionCommands.ts +++ b/app/composables/useCommandPaletteVersionCommands.ts @@ -1,5 +1,6 @@ // @unocss-include -import type { MaybeRefOrGetter } from 'vue' +import type { MaybeRef, MaybeRefOrGetter } from 'vue' +import type { RouteLocationRaw } from 'vue-router' import type { CommandPaletteCommand, CommandPaletteContextCommandInput, @@ -7,6 +8,8 @@ import type { } from '~/types/command-palette' import { compare, satisfies, validRange } from 'semver' +type CommandPaletteVersionRoute = (version: string) => RouteLocationRaw + function getSortedVersions(context: CommandPalettePackageContext) { return [...context.versions].sort((a, b) => { if (a === context.resolvedVersion) return -1 @@ -19,7 +22,7 @@ function createVersionCommands( context: CommandPalettePackageContext, t: ReturnType['t'], versions = getSortedVersions(context), - urlPattern?: string | null, + routeForVersion?: CommandPaletteVersionRoute | null, ): CommandPaletteCommand[] { return versions.map(version => ({ id: `version:${version}`, @@ -28,13 +31,13 @@ function createVersionCommands( keywords: [context.packageName, version, t('command_palette.groups.versions')], iconClass: 'i-lucide:tag', active: version === context.resolvedVersion, - to: urlPattern?.replace('{version}', version) ?? packageRoute(context.packageName, version), + to: routeForVersion?.(version) ?? packageRoute(context.packageName, version), })) } export function useCommandPaletteVersionCommands( context: MaybeRefOrGetter, - urlPattern?: MaybeRefOrGetter, + routeForVersion?: MaybeRef, ) { const { t } = useI18n() @@ -43,7 +46,7 @@ export function useCommandPaletteVersionCommands( const resolvedContext = toValue(context) if (!resolvedContext?.resolvedVersion) return [] - return createVersionCommands(resolvedContext, t, undefined, toValue(urlPattern)) + return createVersionCommands(resolvedContext, t, undefined, unref(routeForVersion)) }), ) @@ -58,6 +61,6 @@ export function useCommandPaletteVersionCommands( satisfies(version, semverRange, { includePrerelease: true }), ) - return createVersionCommands(resolvedContext, t, matchingVersions, toValue(urlPattern)) + return createVersionCommands(resolvedContext, t, matchingVersions, unref(routeForVersion)) }) } diff --git a/app/pages/diff/[[org]]/[packageName]/v/[versionRange].vue b/app/pages/diff/[[org]]/[packageName]/v/[versionRange].vue index 1bc6ac2c94..3da147500d 100644 --- a/app/pages/diff/[[org]]/[packageName]/v/[versionRange].vue +++ b/app/pages/diff/[[org]]/[packageName]/v/[versionRange].vue @@ -116,19 +116,19 @@ const latestVersionDetailed = computed(() => { return pkg.value.versions[latestTag] ?? null }) -const normalizeRoutePath = (routeLocation: RouteLocationRaw) => { - const resolvedHref = router.resolve(routeLocation).href - return resolvedHref.replace(/%7B/g, '{').replace(/%7D/g, '}') +function diffVersionUrlPattern(from: string, to: string) { + const { org, packageName: name } = route.params + return `/diff/${org ? `${org}/` : ''}${name}/v/${from}...${to}` } -const fromVersionUrlPattern = computed(() => { - return normalizeRoutePath(diffRoute(packageName.value, '{version}', toVersion.value)) -}) -const toVersionUrlPattern = computed(() => { - return normalizeRoutePath(diffRoute(packageName.value, fromVersion.value, '{version}')) -}) +const fromVersionUrlPattern = computed(() => diffVersionUrlPattern('{version}', toVersion.value)) +const toVersionUrlPattern = computed(() => diffVersionUrlPattern(fromVersion.value, '{version}')) + +function fromVersionRoute(version: string): RouteLocationRaw { + return diffRoute(packageName.value, version, toVersion.value) +} -useCommandPaletteVersionCommands(commandPalettePackageContext, fromVersionUrlPattern) +useCommandPaletteVersionCommands(commandPalettePackageContext, fromVersionRoute) useSeoMeta({ title: () => { diff --git a/app/pages/package-code/[[org]]/[packageName]/v/[version]/[...filePath].vue b/app/pages/package-code/[[org]]/[packageName]/v/[version]/[...filePath].vue index 8c2e43988d..8bdfa23c43 100644 --- a/app/pages/package-code/[[org]]/[packageName]/v/[version]/[...filePath].vue +++ b/app/pages/package-code/[[org]]/[packageName]/v/[version]/[...filePath].vue @@ -1,4 +1,5 @@