Skip to content

Commit 73a46ef

Browse files
committed
chore: release v0.13.0 (#2713)
2 parents 5fd8148 + c757f1a commit 73a46ef

113 files changed

Lines changed: 5331 additions & 2349 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 42 additions & 6 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@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
8181
with:
82-
token: ${{ secrets.CODECOV_TOKEN }}
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@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
92+
with:
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,23 +116,32 @@ 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
105-
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6
119+
- name: ⬆︎ Upload test results to Codecov
120+
if: ${{ !cancelled() }}
121+
uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
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
112-
uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6
131+
if: ${{ !cancelled() }}
132+
uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
133+
with:
134+
disable_search: true
135+
files: coverage/clover.xml
136+
flags: component
113137
env:
114138
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
115139

116140
browser:
117141
name: 🖥️ Browser tests
118142
runs-on: ubuntu-24.04-arm
119143
container:
120-
image: mcr.microsoft.com/playwright:v1.58.2-noble@sha256:6446946a1d9fd62d9ae501312a2d76a43ee688542b21622056a372959b65d63d
144+
image: mcr.microsoft.com/playwright:v1.60.0-noble@sha256:9bd26ad900bb5e0f4dee75839e957a89ae89c2b7ab1e76050e559790e946b948
121145

122146
steps:
123147
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
@@ -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@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1
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

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ The command palette is a first-class navigation surface. When you add a new user
452452

453453
### Cursor and navigation
454454

455-
**npmx** uses `cursor: pointer` only for links to match users’ everyday experience. For all other interactive elements, including buttons, use the default cursor (_or another appropriate cursor to indicate state_).
455+
**npmx** uses `cursor: pointer` for links and buttons to match users’ everyday experience. For all other interactive elements, use the default cursor (_or another appropriate cursor to indicate state_).
456456

457457
> [!NOTE]
458458
> A link is any element that leads to another content (_go to another page, authorize_)

README.md

Lines changed: 57 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ What npmx offers:
2222
- **Speed** – Fast searching, filtering, and navigation.
2323
- **Simplicity** – Get the information you need when you need it in an intuitive UI.
2424
- **URL Compatibility** – Replace `npmjs.com` with `xnpmjs.com` or `npmx.dev` in any URL and it just works.
25+
- **First-class accessibility** – Keyboard-friendly, screen-reader-aware experience baked in from the start.
26+
- **Internationalized UI** – Use npmx in dozens of locales, including RTL languages.
2527
- **Enhanced admin experience** – Manage your packages, teams, and organizations from the browser, powered by your local npm CLI.
28+
- **Shareable URLs** – Every view on every page is shareable through the URL, making sharing a breeze.
2629

2730
## Shortcuts
2831

@@ -39,62 +42,86 @@ What npmx offers:
3942
### Package browsing
4043

4144
- **Dark mode and light mode** – plus customize the color palette to your preferences
45+
- **Translated interface** – localized UI across 39+ locales, including RTL support
46+
- **First-class accessibility** – accessible components, keyboard workflows, and automated axe/Lighthouse checks
47+
- **URL-driven feature views** – share exact package versions, search results, compare sets, source files and lines, diffs, docs, changelogs, and timelines
4248
- **Fast search** – quick package search with instant results
4349
- **Package details** – READMEs, versions, dependencies, and metadata
4450
- **Code viewer** – browse package source code with syntax highlighting and permalink to specific lines
51+
- **Generated API docs** – browse generated docs for typed packages when available
52+
- **Version diff** – inspect source and dependency changes between package versions
53+
- **Changelog view** – read release notes when packages publish them
54+
- **Timeline view** – scan publish history and notable version events such as deprecations and install size changes
4555
- **Provenance indicators** – verified build badges and provenance section below the README
4656
- **Multi-provider repository support** – stars/forks from GitHub, GitLab, Bitbucket, Codeberg, Gitee, Sourcehut, Forgejo, Gitea, Radicle, and Tangled
4757
- **JSR availability** – see if scoped packages are also available on JSR
4858
- **Package badges** – module format (ESM/CJS/dual), TypeScript types (with `@types/*` links), and engine constraints
4959
- **Outdated dependency indicators** – visual cues showing which dependencies are behind
5060
- **Vulnerability warnings** – security advisories from the OSV database
61+
- **License, replacement, install script, and size-change warnings** – spot package health and maintenance signals quickly
5162
- **Download statistics** – weekly download counts with sparkline charts
5263
- **Install size** – total install size (including transitive dependencies)
64+
- **Package comparison** – compare packages by downloads, size, dependencies, types, security, repository health, and more
65+
- **Social signals** – like packages, view profile likes, and browse the most-liked packages leaderboard
5366
- **Playground links** – quick access to StackBlitz, CodeSandbox, and other demo environments from READMEs
5467
- **Infinite search** – auto-load additional search pages as you scroll
5568
- **Keyboard navigation** – press `/` to focus search, `.` to open code viewer, arrow keys to navigate results
5669
- **Deprecation notices** – clear warnings for deprecated packages and versions
5770
- **Version range resolution** – dependency ranges (e.g., `^1.0.0`) resolve to actual installed versions
58-
- **Claim new packages** – register new package names directly from search results (via local connector)
71+
- **Claim new packages** – register new package names directly from search results
5972
- **Clickable version tags** – navigate directly to any version from the versions list
6073

6174
### User & org pages
6275

6376
- **User profiles** – view any npm user's public packages at `/~username`
6477
- **Organization pages** – browse org packages at `/@orgname`
78+
- **Package access and owner management** – grant package access, revoke team access, and add/remove package owners
79+
- **Organization member and team management** – add/remove org members, change roles, create teams, and manage team membership
6580
- **Search, filter & sort** – find packages within user/org lists
6681
- **Infinite scroll** – paginated lists that load as you scroll
6782

6883
### Comparison with npmjs.com
6984

70-
| Feature | npmjs.com | npmx.dev |
71-
| ------------------------------ | :-------: | :------: |
72-
| Package search |||
73-
| Package details & README |||
74-
| Version history |||
75-
| Dependencies list |||
76-
| User profiles |||
77-
| Organization pages |||
78-
| Provenance indicators |||
79-
| Code browser |||
80-
| Dark mode |||
81-
| Outdated dependency warnings |||
82-
| Module format badges (ESM/CJS) |||
83-
| TypeScript types indicator |||
84-
| Install size calculation |||
85-
| JSR cross-reference |||
86-
| Vulnerability warnings |||
87-
| Deprecation notices |||
88-
| Download charts |||
89-
| Playground links |||
90-
| Keyboard navigation |||
91-
| Multi-provider repo support |||
92-
| Version range resolution |||
93-
| Dependents list || 🚧 |
94-
| Package admin (access/owners) || 🚧 |
95-
| Org/team management || 🚧 |
96-
| 2FA/account settings |||
97-
| Claim new package names |||
85+
| Feature | npmjs.com | npmx.dev |
86+
| ----------------------------------- | :-------: | :------: |
87+
| Package search |||
88+
| Package details & README |||
89+
| Version history |||
90+
| Dependencies list |||
91+
| Dependents list || 🚧 |
92+
| User profiles |||
93+
| Organization pages |||
94+
| Package comparison |||
95+
| URL-driven/shareable feature views |||
96+
| Provenance indicators |||
97+
| Code browser |||
98+
| Generated API docs |||
99+
| Version diff |||
100+
| Changelog view |||
101+
| Timeline view |||
102+
| Dark mode | ✅ 🆕 ||
103+
| Internationalization |||
104+
| Accessibility statement and audits |||
105+
| Outdated dependency warnings |||
106+
| Module format badges (ESM/CJS/WASM) |||
107+
| TypeScript types indicator |||
108+
| Install size calculation |||
109+
| Install script warnings |||
110+
| License change warnings |||
111+
| Module replacement suggestions |||
112+
| JSR cross-reference |||
113+
| Vulnerability warnings |||
114+
| Deprecation notices |||
115+
| Download charts |||
116+
| Package likes and leaderboard |||
117+
| Playground links |||
118+
| Keyboard navigation |||
119+
| Multi-provider repo support |||
120+
| Version range resolution |||
121+
| Package admin (access/owners) |||
122+
| Org/team management |||
123+
| 2FA/account settings |||
124+
| Claim new package names |||
98125

99126
🚧 = coming soon
100127

@@ -118,7 +145,7 @@ npmx.dev supports npm permalinks – just replace `npmjs.com` with `npmx.dev
118145
119146
#### Not yet supported
120147

121-
- `/package/<name>/access` &ndash; package access settings
148+
- `/package/<name>/access` &ndash; dedicated npm-compatible access settings URL
122149
- `/package/<name>/dependents` &ndash; dependent packages list
123150
- `/settings/*` &ndash; account settings pages
124151

app/components/AppFooter.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ const socialLinks = computed(() => [
3636
},
3737
])
3838
39-
const footerSections: Array<{ label: string; links: FooterLink[] }> = [
39+
const footerSections = computed<Array<{ label: string; links: FooterLink[] }>>(() => [
4040
{
4141
label: t('footer.resources'),
4242
links: [
@@ -93,7 +93,7 @@ const footerSections: Array<{ label: string; links: FooterLink[] }> = [
9393
},
9494
],
9595
},
96-
]
96+
])
9797
</script>
9898

9999
<template>

app/components/Button/Base.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ defineExpose({
4444
<template>
4545
<button
4646
ref="el"
47-
class="group gap-x-1 items-center justify-center font-mono border border-border rounded-md transition-all duration-200 disabled:(opacity-40 cursor-not-allowed border-transparent)"
47+
class="group gap-x-1 items-center justify-center font-mono border border-border rounded-md transition-all duration-200 cursor-pointer disabled:(opacity-40 cursor-not-allowed border-transparent)"
4848
:class="{
4949
'inline-flex': !block,
5050
'flex': block,

app/components/Changelog/Card.vue

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<script setup lang="ts">
2+
import type { ReleaseData } from '~~/shared/types/changelog'
3+
import { slugify } from '~~/shared/utils/html'
4+
5+
const { release } = defineProps<{
6+
release: ReleaseData
7+
}>()
8+
const formattedDate = computed(() => {
9+
if (!release.publishedAt) {
10+
return
11+
}
12+
return new Date(release.publishedAt).toISOString().split('T')[0]
13+
})
14+
15+
const cardId = computed(() => (formattedDate.value ? `date-${formattedDate.value}` : undefined))
16+
17+
const navId = computed(() => `release-${slugify(release.title)}`)
18+
19+
function navigateToTitle() {
20+
navigateTo(`#${navId.value}`)
21+
}
22+
</script>
23+
<template>
24+
<section
25+
class="border border-border rounded-lg p-4 pt-2 sm:p-6 sm:pt-4 scroll-mt-18"
26+
:id="cardId"
27+
>
28+
<div
29+
class="flex gap-2 items-center sticky z-3 text-2xl p-2 border-border bg-bg top-[--combined-header-height]"
30+
>
31+
<h2
32+
class="text-1xl sm:text-2xl font-medium min-w-0 break-words py-2 scroll-mt-20"
33+
:id="navId"
34+
>
35+
<a
36+
class="hover:decoration-accent hover:text-accent focus-visible:decoration-accent focus-visible:text-accent transition-colors duration-200"
37+
:class="$style.linkTitle"
38+
:href="`#${navId}`"
39+
@click.prevent="navigateToTitle()"
40+
>
41+
{{ release.title }}
42+
</a>
43+
</h2>
44+
<TagStatic v-if="release.prerelease" variant="default" class="h-unset">
45+
{{ $t('changelog.pre_release') }}
46+
</TagStatic>
47+
<TagStatic v-if="release.draft" variant="default" class="h-unset">
48+
{{ $t('changelog.draft') }}
49+
</TagStatic>
50+
<div class="flex-1" aria-hidden="true"></div>
51+
<ReadmeTocDropdown
52+
v-if="release?.toc && release.toc.length > 1"
53+
:toc="release.toc"
54+
class="ms-auto"
55+
/>
56+
<!-- :active-id="activeTocId" -->
57+
</div>
58+
<DateTime
59+
v-if="release.publishedAt"
60+
:datetime="release.publishedAt"
61+
date-style="medium"
62+
class="mb-2 block"
63+
/>
64+
<Readme v-if="release.html" :html="release.html"></Readme>
65+
</section>
66+
</template>
67+
68+
<style module>
69+
.linkTitle::after {
70+
content: '__';
71+
@apply inline i-lucide:link rtl-flip ms-1 opacity-0;
72+
font-size: 0.75em;
73+
}
74+
75+
.linkTitle:hover::after {
76+
@apply opacity-100;
77+
}
78+
</style>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<script setup lang="ts">
2+
const { pkgName, changelogLink, viewOnGit } = defineProps<{
3+
pkgName?: string
4+
changelogLink: string
5+
viewOnGit: string
6+
}>()
7+
</script>
8+
<template>
9+
<div class="w-full flex items-center flex-col gap-2 mt-4">
10+
<p>{{ $t('changelog.error.p1', { package: pkgName }) }}</p>
11+
<i18n-t keypath="changelog.error.p2" tag="p" #viewon>
12+
<LinkBase :to="changelogLink" class="lowercase">{{ viewOnGit }}</LinkBase>
13+
</i18n-t>
14+
</div>
15+
</template>

0 commit comments

Comments
 (0)