Skip to content

Commit 3339224

Browse files
committed
feat(web): accept av=prev and resolve relative to bv URL param
1 parent cbd29ab commit 3339224

2 files changed

Lines changed: 41 additions & 3 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "pkg-diff",
33
"private": true,
44
"type": "module",
5-
"version": "1.0.0",
5+
"version": "1.0.1",
66
"license": "GPL-3.0-only",
77
"packageManager": "pnpm@10.26.1",
88
"bin": {

src/components/DiffApp.vue

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,51 @@
6666
const activePath = ref<string | null>(null)
6767
const pendingPath = ref<string | null>(null)
6868
69+
function compareSemver (a: string, b: string): number {
70+
const [aMain, aPre] = a.split('-', 2)
71+
const [bMain, bPre] = b.split('-', 2)
72+
const aParts = aMain.split('.').map(Number)
73+
const bParts = bMain.split('.').map(Number)
74+
75+
for (let i = 0; i < 3; i++) {
76+
if (aParts[i] !== bParts[i]) return (aParts[i] ?? 0) - (bParts[i] ?? 0)
77+
}
78+
if (aPre === bPre) return 0
79+
if (aPre === undefined) return 1
80+
if (bPre === undefined) return -1
81+
return aPre < bPre ? -1 : 1
82+
}
83+
84+
const isPrerelease = (v: string): boolean => v.includes('-')
85+
const baseVersion = (v: string): string => v.split('-', 1)[0]
86+
87+
async function resolvePrevVersion (name: string, anchorVersion: string): Promise<string> {
88+
const [{ versions }, { version }] = await Promise.all([
89+
listVersions(name),
90+
resolveTarball(name, anchorVersion),
91+
])
92+
93+
const anchorIsPrerelease = isPrerelease(version)
94+
const prereleaseAllowed = (v: string) => anchorIsPrerelease && baseVersion(v) === baseVersion(version)
95+
const candidates = versions.filter(v =>
96+
(!isPrerelease(v) || prereleaseAllowed(v)) && compareSemver(v, version) < 0,
97+
)
98+
99+
return candidates.toSorted(compareSemver).at(-1) ?? 'latest'
100+
}
101+
69102
// ---- URL params (?a=&b=, optional &av=&bv=&path=) — read on load, write on compare.
70-
function readUrl () {
103+
async function readUrl () {
71104
const p = new URLSearchParams(globalThis.location.search)
72105
if (p.get('a')) a.name = p.get('a')!
73106
if (p.get('b')) b.name = p.get('b')!
74-
if (p.get('av')) a.version = p.get('av')!
75107
if (p.get('bv')) b.version = p.get('bv')!
108+
const av = p.get('av')
109+
if (av === 'prev') {
110+
a.version = a.name === b.name ? await resolvePrevVersion(a.name, b.version).catch(() => 'latest') : 'latest'
111+
} else if (av) {
112+
a.version = av
113+
}
76114
pendingPath.value = p.get('path')
77115
}
78116

0 commit comments

Comments
 (0)