|
36 | 36 | ? undefined |
37 | 37 | : data.releases.toSorted((a, b) => semver.rcompare(a.cleanVersion, b.cleanVersion))[0] |
38 | 38 | ); |
39 | | - let earliestOfLatestMajor = $derived( |
40 | | - data.currentPackage.category.slug === ALL_SLUG |
41 | | - ? undefined |
42 | | - : data.releases |
43 | | - .filter( |
44 | | - ({ prerelease, cleanVersion }) => |
45 | | - (latestRelease |
46 | | - ? semver.major(cleanVersion) === semver.major(latestRelease.cleanVersion) |
47 | | - : false) && !prerelease |
48 | | - ) |
49 | | - .sort((a, b) => semver.compare(a.cleanVersion, b.cleanVersion))[0] |
50 | | - ); |
| 39 | + let earliestForMajors = $derived.by<Record<number, (typeof data.releases)[number]>>(() => { |
| 40 | + if (data.currentPackage.category.slug === ALL_SLUG) return {}; |
| 41 | + const allWithSemver = data.releases |
| 42 | + .map(release => ({ coerced: semver.coerce(release.cleanVersion), ...release })) |
| 43 | + .filter(({ coerced }) => coerced); |
| 44 | + const uniqueMajors = [...new Set(allWithSemver.map(({ coerced }) => coerced!.major))]; |
| 45 | + return Object.fromEntries( |
| 46 | + uniqueMajors.map(major => { |
| 47 | + const sorted = allWithSemver |
| 48 | + .filter(({ coerced, prerelease }) => coerced!.major === major && !prerelease) |
| 49 | + .sort((a, b) => semver.compare(a.coerced!, b.coerced!)); |
| 50 | + const { coerced, ...rest } = sorted[0]!; |
| 51 | + return [major, rest]; |
| 52 | + }) |
| 53 | + ); |
| 54 | + }); |
51 | 55 | const sharedSettings = getPackageSettings(); |
52 | 56 | let packageSettings = $derived(sharedSettings.get(data.currentPackage.pkg.name)); |
53 | 57 |
|
|
242 | 246 | {/if} |
243 | 247 | {#each displayableReleases as release, index (release.id)} |
244 | 248 | {@const semVersion = semver.coerce(release.cleanVersion)} |
| 249 | + {@const semLatest = semver.coerce(latestRelease?.cleanVersion)} |
245 | 250 | {@const isMajorRelease = |
246 | 251 | !release.prerelease && |
247 | 252 | semVersion?.minor === 0 && |
248 | 253 | semVersion?.patch === 0 && |
249 | 254 | !semVersion?.prerelease.length} |
250 | | - {@const releaseDate = new Date(release.published_at ?? release.created_at)} |
251 | | - {@const isLatest = release.id === latestRelease?.id} |
252 | | - {@const isMaintenance = earliestOfLatestMajor |
253 | | - ? !isMajorRelease && |
254 | | - /* `semVersion` and `latestRelease` can't be undefined here */ |
255 | | - semVersion!.major < semver.major(latestRelease!.cleanVersion) && |
256 | | - releaseDate > |
257 | | - new Date(earliestOfLatestMajor.published_at ?? earliestOfLatestMajor.created_at) |
258 | | - : false} |
| 255 | + {@const earliestOfNextMajor = semVersion |
| 256 | + ? earliestForMajors[semVersion.major + 1] |
| 257 | + : undefined} |
| 258 | + {@const isMaintenance = |
| 259 | + semVersion && semLatest && earliestOfNextMajor |
| 260 | + ? !isMajorRelease && |
| 261 | + semVersion.major < semLatest.major && |
| 262 | + new Date(release.published_at ?? release.created_at) > |
| 263 | + new Date(earliestOfNextMajor.published_at ?? earliestOfNextMajor.created_at) |
| 264 | + : false} |
259 | 265 | <ReleaseCard |
260 | 266 | {index} |
261 | 267 | repo={{ owner: data.currentPackage.repoOwner, name: data.currentPackage.repoName }} |
262 | 268 | {release} |
263 | | - {isLatest} |
| 269 | + isLatest={release.id === latestRelease?.id} |
264 | 270 | {isMaintenance} |
265 | 271 | /> |
266 | 272 | {:else} |
|
0 commit comments