Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions app/pages/package/[[org]]/[name]/versions.vue
Original file line number Diff line number Diff line change
Expand Up @@ -554,6 +554,14 @@ const flatItems = computed<FlatItem[]>(() => {
<span class="text-xs text-fg-muted truncate" :title="item.versions[0]" dir="ltr"
>v{{ item.versions[0] }}</span
>
<ProvenanceBadge
v-if="fullVersionMap?.get(item.versions[0]!)?.trustStatus?.provenance"
:package-name="packageName"
:version="item.versions[0]!"
compact
:linked="false"
class="relative z-10"
/>
<span
v-if="groupDownloadsMap.has(item.groupKey)"
class="ms-auto max-w-32 md:w-32 grid grid-flow-col auto-cols-max items-center justify-end gap-1 text-xs text-fg-muted tabular-nums shrink-0"
Expand Down
7 changes: 5 additions & 2 deletions app/utils/npm/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,11 @@ export async function fetchAllPackageVersions(packageName: string): Promise<Pack
.map(([version, meta]) => ({
version,
time: meta.time,
hasProvenance: meta.provenance,
hasTrustedPublisher: meta.trustedPublisher,
trustStatus: {
provenance: meta.provenance ?? false,
trustedPublisher: meta.trustedPublisher ?? false,
stagedPublish: meta.staged ?? false,
},
deprecated: meta.deprecated,
}))
.sort((a, b) => compare(b.version, a.version))
Expand Down
45 changes: 41 additions & 4 deletions test/nuxt/pages/PackageVersionsPage.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,27 @@ describe('package versions page', () => {
expect(component.text()).toContain('beta')
})
})

it('renders provenance badges for versions with provenance metadata', async () => {
nextFetchResponse = makeVersionData(['2.0.0', '1.0.0'], { latest: '2.0.0' })
mockFetchAllPackageVersions.mockResolvedValue([
{
version: '2.0.0',
time: '2024-01-15T00:00:00.000Z',
trustStatus: { provenance: true, trustedPublisher: true, stagedPublish: false },
},
{
version: '1.0.0',
time: '2024-01-10T00:00:00.000Z',
trustStatus: { provenance: false, trustedPublisher: false, stagedPublish: false },
},
])
const component = await mountPage()

await vi.waitFor(() => {
expect(component.findAllComponents({ name: 'ProvenanceBadge' })).not.toHaveLength(0)
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
})
})
})

describe('version history groups', () => {
Expand All @@ -135,8 +156,16 @@ describe('package versions page', () => {
it('expands a group and shows version rows on click', async () => {
nextFetchResponse = makeVersionData(['1.1.0', '1.0.0'], { latest: '1.1.0' })
mockFetchAllPackageVersions.mockResolvedValue([
{ version: '1.1.0', time: '2024-01-15T00:00:00.000Z', hasProvenance: false },
{ version: '1.0.0', time: '2024-01-10T00:00:00.000Z', hasProvenance: false },
{
version: '1.1.0',
time: '2024-01-15T00:00:00.000Z',
trustStatus: { provenance: false, trustedPublisher: false, stagedPublish: false },
},
{
version: '1.0.0',
time: '2024-01-10T00:00:00.000Z',
trustStatus: { provenance: false, trustedPublisher: false, stagedPublish: false },
},
])
const component = await mountPage()
await vi.waitFor(() => expect(component.text()).toContain('1.x'))
Expand All @@ -152,8 +181,16 @@ describe('package versions page', () => {
it('fetches full metadata automatically after phase 1 completes, exactly once', async () => {
nextFetchResponse = makeVersionData(['2.0.0', '1.0.0'], { latest: '2.0.0' })
mockFetchAllPackageVersions.mockResolvedValue([
{ version: '2.0.0', time: '2024-01-15T00:00:00.000Z', hasProvenance: false },
{ version: '1.0.0', time: '2024-01-10T00:00:00.000Z', hasProvenance: false },
{
version: '2.0.0',
time: '2024-01-15T00:00:00.000Z',
trustStatus: { provenance: false, trustedPublisher: false, stagedPublish: false },
},
{
version: '1.0.0',
time: '2024-01-10T00:00:00.000Z',
trustStatus: { provenance: false, trustedPublisher: false, stagedPublish: false },
},
])

await mountPage()
Expand Down
Loading