Skip to content

Commit 642dfdf

Browse files
authored
Merge branch 'main' into renovate/pnpm-11.x
2 parents 22ff001 + fe95911 commit 642dfdf

36 files changed

Lines changed: 1319 additions & 168 deletions

.github/workflows/ci.yml

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,24 @@ jobs:
7777

7878
- name: ⬆︎ Upload test results to Codecov
7979
if: ${{ !cancelled() }}
80-
uses: codecov/test-results-action@0fa95f0e1eeaafde2c782583b36b28ad0d8c77d3 # v1
80+
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6
81+
with:
82+
disable_search: true
83+
files: test-report.junit.xml
84+
flags: unit
85+
report_type: test_results
86+
env:
87+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
88+
89+
- name: ⬆︎ Upload coverage reports to Codecov
90+
if: ${{ !cancelled() }}
91+
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6
8192
with:
82-
token: ${{ secrets.CODECOV_TOKEN }}
93+
disable_search: true
94+
files: coverage/clover.xml
95+
flags: unit
96+
env:
97+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
8398

8499
test:
85100
name: 🧪 Component tests
@@ -101,15 +116,24 @@ jobs:
101116
- name: 🧪 Component tests
102117
run: vp test --project nuxt --coverage --reporter=default --reporter=junit --outputFile=test-report.junit.xml
103118

104-
- name: ⬆︎ Upload coverage reports to Codecov
119+
- name: ⬆︎ Upload test results to Codecov
120+
if: ${{ !cancelled() }}
105121
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6
106122
with:
123+
disable_search: true
124+
files: test-report.junit.xml
125+
flags: component
107126
report_type: test_results
108127
env:
109128
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
110129

111130
- name: ⬆︎ Upload coverage reports to Codecov
131+
if: ${{ !cancelled() }}
112132
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6
133+
with:
134+
disable_search: true
135+
files: coverage/clover.xml
136+
flags: component
113137
env:
114138
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
115139

@@ -140,6 +164,18 @@ jobs:
140164
- name: 🖥️ Test project (browser)
141165
run: vp run test:browser:prebuilt
142166

167+
- name: ⬆︎ Upload test results to Codecov
168+
if: ${{ !cancelled() }}
169+
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6
170+
with:
171+
disable_search: true
172+
files: test-report.junit.xml
173+
flags: browser
174+
report_type: test_results
175+
env:
176+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
177+
# TODO(serhalp): Upload browser *coverage* report once we've instrumented the prebuilt bundle
178+
143179
a11y:
144180
name: ♿ Accessibility audit
145181
runs-on: ubuntu-latest # See https://github.com/GoogleChrome/lighthouse/discussions/16834
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
name: chore
2+
3+
on:
4+
pull_request_target:
5+
branches:
6+
- release
7+
types:
8+
- opened
9+
- reopened
10+
- edited
11+
- synchronize
12+
13+
concurrency:
14+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
15+
16+
permissions: {}
17+
18+
jobs:
19+
enforce-source:
20+
if: github.repository == 'npmx-dev/npmx.dev'
21+
runs-on: ubuntu-slim
22+
name: 🚦 Enforce release source
23+
steps:
24+
- name: Check PR is from main
25+
env:
26+
HEAD_REPO: ${{ github.event.pull_request.head.repo.full_name }}
27+
HEAD_REF: ${{ github.event.pull_request.head.ref }}
28+
run: |
29+
if [ "$HEAD_REPO" != "npmx-dev/npmx.dev" ] || [ "$HEAD_REF" != "main" ]; then
30+
echo "::error::PRs to 'release' must come from npmx-dev/npmx.dev:main (got ${HEAD_REPO}:${HEAD_REF})"
31+
exit 1
32+
fi

.github/zizmor.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ rules:
77
- lunaria.yml:38
88
dangerous-triggers:
99
ignore:
10+
- enforce-release-source.yml
1011
- dependency-diff-comment.yml
1112
- lunaria.yml
1213
- semantic-pull-requests.yml

app/app.vue

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,17 @@ if (import.meta.client) {
128128
}
129129
}
130130
131-
// title and description will be inferred
132-
// this will be overridden by upstream pages that use different templates
133-
defineOgImage('Page.takumi', {}, { alt: 'npmx — a fast, modern browser for the npm registry' })
131+
const isBlogPostRoute = computed(() => {
132+
return route.path.startsWith('/blog/') && route.path !== '/blog/'
133+
})
134+
135+
// This is a priority bug that when we set og:image at the component level via useSeoMeta,
136+
// it is ignored and the image from app.vue is written over it.
137+
if (!isBlogPostRoute.value) {
138+
// title and description will be inferred
139+
// this will be overridden by upstream pages that use different templates
140+
defineOgImage('Page.takumi', {}, { alt: 'npmx — a fast, modern browser for the npm registry' })
141+
}
134142
</script>
135143

136144
<template>

app/components/CopyToClipboardButton.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ function handleClick() {
3434
<button
3535
type="button"
3636
@click="handleClick"
37-
class="absolute z-20 inset-is-0 top-full inline-flex items-center gap-1 px-2 py-1 rounded border text-xs font-mono whitespace-nowrap transition-all duration-150 opacity-0 -translate-y-1 pointer-events-none group-hover:opacity-100 group-hover:translate-y-0 group-hover:pointer-events-auto focus-visible:opacity-100 focus-visible:translate-y-0 focus-visible:pointer-events-auto"
37+
class="absolute z-70 inset-is-0 top-full inline-flex items-center gap-1 px-2 py-1 rounded border text-xs font-mono whitespace-nowrap transition-all duration-150 opacity-0 -translate-y-1 pointer-events-none group-hover:opacity-100 group-hover:translate-y-0 group-hover:pointer-events-auto focus-visible:opacity-100 focus-visible:translate-y-0 focus-visible:pointer-events-auto"
3838
:class="[
3939
$style.copyButton,
4040
copied ? ['text-accent', $style.copiedBg] : 'text-fg-muted bg-bg border-border',

app/components/Package/Card.vue

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const props = defineProps<{
1616
searchQuery?: string
1717
}>()
1818
19+
const { selectable } = usePackageSelectionContext()
1920
const { isPackageSelected, togglePackageSelection, canSelectMore } = usePackageSelection()
2021
const isSelected = computed<boolean>(() => {
2122
return isPackageSelected(props.result.package.name)
@@ -65,6 +66,7 @@ const numberFormatter = useNumberFormatter()
6566
</component>
6667

6768
<PackageSelectionCheckbox
69+
v-if="selectable"
6870
:package-name="result.package.name"
6971
:disabled="!canSelectMore && !isSelected"
7072
:checked="isSelected"

app/components/Package/Dependencies.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ function getDepVersionTooltip(dep: string, version: string) {
7979
function getDepVersionClass(dep: string) {
8080
const outdated = outdatedDeps.value[dep]
8181
if (outdated) return getVersionClass(outdated)
82-
if (getVulnerableDepInfo(dep) || getDeprecatedDepInfo(dep)) return getVersionClass(undefined)
8382
if (replacementDeps.value[dep]) return 'text-amber-700 dark:text-amber-500'
83+
if (getVulnerableDepInfo(dep) || getDeprecatedDepInfo(dep)) return getVersionClass(undefined)
8484
return getVersionClass(undefined)
8585
}
8686

app/components/Package/List.vue

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ const props = defineProps<{
3333
currentPage?: number
3434
/** When true, shows search-specific UI (relevance sort, no filters) */
3535
searchContext?: boolean
36+
/** Whether package cards should show selection checkboxes. */
37+
selectable?: boolean
3638
}>()
3739
3840
const emit = defineEmits<{
@@ -46,6 +48,8 @@ const emit = defineEmits<{
4648
'clickKeyword': [keyword: string]
4749
}>()
4850
51+
providePackageSelectionContext(props.selectable ?? false)
52+
4953
// Reference to WindowVirtualizer for infinite scroll detection
5054
const listRef = useTemplateRef<WindowVirtualizerHandle>('listRef')
5155

app/components/Package/SelectionView.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ const { data, pending } = useAsyncData(
5252
:view-mode="viewMode"
5353
:results="data"
5454
heading-level="h2"
55+
selectable
5556
/>
5657
<p v-else class="text-fg-muted text-sm">
5758
{{ $t('filters.table.no_packages') }}

app/components/Package/Table.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,16 @@ const columnLabels = computed(() => ({
9696
function getColumnLabel(id: ColumnId): string {
9797
return columnLabels.value[id]
9898
}
99+
100+
const { selectable } = usePackageSelectionContext()
99101
</script>
100102

101103
<template>
102104
<div class="overflow-x-auto">
103105
<table class="w-full text-start">
104106
<thead class="border-b border-border">
105107
<tr>
106-
<th scope="col" class="w-8">
108+
<th scope="col" class="w-8" v-if="selectable">
107109
<span class="sr-only">{{ getColumnLabel('selection') }}</span>
108110
</th>
109111
<!-- Name (always visible) -->
@@ -265,7 +267,7 @@ function getColumnLabel(id: ColumnId): string {
265267
<!-- Loading skeleton rows -->
266268
<template v-if="isLoading && results.length === 0">
267269
<tr v-for="i in 5" :key="`skeleton-${i}`" class="border-b border-border">
268-
<td class="py-3 px-3 w-8">
270+
<td v-if="selectable" class="py-3 px-3 w-8">
269271
<div class="h-4 w-4 bg-bg-muted rounded animate-pulse ms-auto" />
270272
</td>
271273
<td class="py-3 px-3">

0 commit comments

Comments
 (0)