Skip to content

Commit 4f54ad4

Browse files
authored
feat: add the new package timeline page to the command palette (#2636)
1 parent 2de6a60 commit 4f54ad4

5 files changed

Lines changed: 67 additions & 9 deletions

File tree

app/components/Package/Header.vue

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -164,15 +164,7 @@ const diffLink = computed((): RouteLocationRaw | null => {
164164
165165
const timelineLink = computed((): RouteLocationRaw | null => {
166166
if (props.pkg == null || props.resolvedVersion == null) return null
167-
const split = props.pkg.name.split('/')
168-
return {
169-
name: 'timeline',
170-
params: {
171-
org: split.length === 2 ? split[0] : undefined,
172-
packageName: split.length === 2 ? split[1]! : split[0]!,
173-
version: props.resolvedVersion,
174-
},
175-
}
167+
return packageTimelineRoute(props.pkg.name, props.resolvedVersion)
176168
})
177169
178170
useShortcuts({

app/composables/useCommandPalettePackageCommands.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,20 @@ export function useCommandPalettePackageCommands(
8888
activeLabel: activeLabel(route.name === 'code', t('command_palette.here')),
8989
to: codeLink,
9090
},
91+
{
92+
id: 'package-timeline',
93+
group: 'package',
94+
label: t('package.links.timeline'),
95+
keywords: [
96+
resolvedContext.packageName,
97+
t('shortcuts.open_timeline'),
98+
t('package.links.timeline'),
99+
],
100+
iconClass: 'i-lucide:history',
101+
active: route.name === 'timeline',
102+
activeLabel: activeLabel(route.name === 'timeline', t('command_palette.here')),
103+
to: packageTimelineRoute(resolvedContext.packageName, resolvedContext.resolvedVersion),
104+
},
91105
{
92106
id: 'package-compare',
93107
group: 'package',

app/pages/package-timeline/[[org]]/[packageName].vue

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ const packageName = computed(() =>
2222
const version = computed(() => route.params.version)
2323
2424
const { data: pkg } = usePackage(packageName, version)
25+
const { versions: commandPaletteVersions, ensureLoaded: ensureCommandPaletteVersionsLoaded } =
26+
useCommandPalettePackageVersions(packageName)
2527
2628
const latestVersion = computed(() => {
2729
if (!pkg.value) return null
@@ -30,11 +32,32 @@ const latestVersion = computed(() => {
3032
return pkg.value.versions[latestTag] ?? null
3133
})
3234
35+
const commandPalettePackageContext = computed(() => {
36+
const packageData = pkg.value
37+
if (!packageData) return null
38+
39+
return {
40+
packageName: packageData.name,
41+
resolvedVersion: version.value ?? packageData['dist-tags']?.latest ?? null,
42+
latestVersion: packageData['dist-tags']?.latest ?? null,
43+
versions: commandPaletteVersions.value ?? Object.keys(packageData.versions ?? {}),
44+
}
45+
})
46+
47+
useCommandPalettePackageContext(commandPalettePackageContext, {
48+
onOpen: ensureCommandPaletteVersionsLoaded,
49+
})
50+
useCommandPalettePackageCommands(commandPalettePackageContext)
51+
3352
const versionUrlPattern = computed(() => {
3453
const { org, packageName: name } = route.params
3554
return `/package-timeline/${org ? `${org}/` : ''}${name}/v/{version}`
3655
})
3756
57+
useCommandPaletteVersionCommands(commandPalettePackageContext, nextVersion =>
58+
packageTimelineRoute(packageName.value, nextVersion),
59+
)
60+
3861
function packageRoute(ver: string): RouteLocationRaw {
3962
return {
4063
name: 'package-version',

app/utils/router.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,16 @@ export function diffRoute(
5252
},
5353
}
5454
}
55+
56+
export function packageTimelineRoute(packageName: string, version: string): RouteLocationRaw {
57+
const { org, name } = splitPackageName(packageName)
58+
59+
return {
60+
name: 'timeline',
61+
params: {
62+
org: org || undefined,
63+
packageName: name,
64+
version: version.replace(/\s+/g, ''),
65+
},
66+
}
67+
}

test/nuxt/composables/use-command-palette-commands.spec.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,14 @@ describe('useCommandPaletteCommands', () => {
230230
expect(flatCommands.value.find(command => command.id === 'package-diff')).toBeTruthy()
231231
expect(flatCommands.value.find(command => command.id === 'package-download')).toBeTruthy()
232232
expect(flatCommands.value.find(command => command.id === 'package-main')?.to).toBeTruthy()
233+
expect(flatCommands.value.find(command => command.id === 'package-timeline')?.to).toEqual({
234+
name: 'timeline',
235+
params: {
236+
org: undefined,
237+
packageName: 'vue',
238+
version: '3.4.0',
239+
},
240+
})
233241
expect(groupedCommands.value.at(-1)?.id).toBe('versions')
234242
expect(groupedCommands.value.at(-1)?.items[0]?.id).toBe('version:3.4.0')
235243
expect(groupedCommands.value.at(-1)?.items[0]?.active).toBe(true)
@@ -511,6 +519,14 @@ describe('useCommandPaletteCommands', () => {
511519
path: ['@scope', 'pkg', 'v', '1.0.0'],
512520
},
513521
})
522+
expect(flatCommands.value.find(command => command.id === 'package-timeline')?.to).toEqual({
523+
name: 'timeline',
524+
params: {
525+
org: '@scope',
526+
packageName: 'pkg',
527+
version: '1.0.0',
528+
},
529+
})
514530

515531
wrapper.unmount()
516532
})

0 commit comments

Comments
 (0)