@@ -3,90 +3,123 @@ import semver from "semver";
33import { gitHubCache , type GitHubRelease } from "$lib/server/github-cache" ;
44import { discoverer } from "$lib/server/package-discoverer" ;
55import type { Repository } from "$lib/repositories" ;
6+ import type { Prettify } from "$lib/types" ;
67
7- export async function load ( { params } ) {
8- const { package : slugPackage } = params ;
9- const categorizedPackages = await discoverer . getOrDiscoverCategorized ( ) ;
10-
8+ async function getReleases (
9+ packageName : string ,
10+ allPackages : Awaited < ReturnType < typeof discoverer . getOrDiscoverCategorized > >
11+ ) {
1112 let currentPackage :
12- | ( Omit < Repository , "dataFilter" | "metadataFromTag" | "changelogContentsReplacer" > &
13- Pick < ( typeof categorizedPackages ) [ number ] [ "packages" ] [ number ] , "pkg" > )
13+ | Prettify <
14+ Omit < Repository , "dataFilter" | "metadataFromTag" | "changelogContentsReplacer" > &
15+ Pick < ( typeof allPackages ) [ number ] [ "packages" ] [ number ] , "pkg" >
16+ >
1417 | undefined = undefined ;
1518 const foundVersions = new Set < string > ( ) ;
1619 const releases : ( { cleanName : string ; cleanVersion : string } & GitHubRelease ) [ ] = [ ] ;
1720
1821 // Discover releases
1922 console . log ( "Starting loading releases..." ) ;
20- for ( const { category, packages } of categorizedPackages ) {
23+ for ( const { category, packages } of allPackages ) {
2124 for ( const { pkg, ...repo } of packages ) {
22- if ( pkg . name . toLowerCase ( ) === slugPackage . toLowerCase ( ) ) {
23- // 1. Get releases
24- const cachedReleases = await gitHubCache . getReleases ( { ...repo , category } ) ;
25- console . log (
26- `${ cachedReleases . length } releases found for repo ${ repo . owner } /${ repo . repoName } `
27- ) ;
25+ if ( pkg . name . localeCompare ( packageName , undefined , { sensitivity : "base" } ) !== 0 ) continue ;
26+
27+ // 1. Get releases
28+ const cachedReleases = await gitHubCache . getReleases ( { ...repo , category } ) ;
29+ console . log (
30+ `${ cachedReleases . length } releases found for repo ${ repo . owner } /${ repo . repoName } `
31+ ) ;
2832
29- // 2. Filter out invalid ones
30- const validReleases = cachedReleases
31- . filter ( release => {
32- const [ name ] = repo . metadataFromTag ( release . tag_name ) ;
33- return (
34- ( repo . dataFilter ?.( release ) ?? true ) &&
35- slugPackage . localeCompare ( name , undefined , { sensitivity : "base" } ) === 0
36- ) ;
37- } )
38- . sort ( ( a , b ) => {
39- const [ , firstVersion ] = repo . metadataFromTag ( a . tag_name ) ;
40- const [ , secondVersion ] = repo . metadataFromTag ( b . tag_name ) ;
41- return semver . rcompare ( firstVersion , secondVersion ) ;
42- } ) ;
43- console . log ( "Length after filtering:" , validReleases . length ) ;
44- // Get the releases matching the slug, or all of them if none
45- // (the latter case for repos with no package in names)
46- console . log ( "Final filtered count:" , validReleases . length ) ;
33+ // 2. Filter out invalid ones
34+ const validReleases = cachedReleases
35+ . filter ( release => {
36+ const [ name ] = repo . metadataFromTag ( release . tag_name ) ;
37+ return (
38+ ( repo . dataFilter ?.( release ) ?? true ) &&
39+ pkg . name . localeCompare ( name , undefined , { sensitivity : "base" } ) === 0
40+ ) ;
41+ } )
42+ . sort ( ( a , b ) => {
43+ const [ , firstVersion ] = repo . metadataFromTag ( a . tag_name ) ;
44+ const [ , secondVersion ] = repo . metadataFromTag ( b . tag_name ) ;
45+ return semver . rcompare ( firstVersion , secondVersion ) ;
46+ } ) ;
47+ console . log ( "Length after filtering:" , validReleases . length ) ;
48+ // Get the releases matching the slug, or all of them if none
49+ // (the latter case for repos with no package in names)
50+ console . log ( "Final filtered count:" , validReleases . length ) ;
4751
48- // 3. For each release, check if it is already found, searching by versions
49- const { dataFilter, metadataFromTag, changelogContentsReplacer, ...rest } = repo ;
50- for ( const release of validReleases ) {
51- const [ cleanName , cleanVersion ] = repo . metadataFromTag ( release . tag_name ) ;
52- console . log ( `Release ${ release . tag_name } , extracted version: ${ cleanVersion } ` ) ;
53- if ( foundVersions . has ( cleanVersion ) ) continue ;
52+ // 3. For each release, check if it is already found, searching by versions
53+ const { dataFilter, metadataFromTag, changelogContentsReplacer, ...rest } = repo ;
54+ for ( const release of validReleases ) {
55+ const [ cleanName , cleanVersion ] = repo . metadataFromTag ( release . tag_name ) ;
56+ console . log ( `Release ${ release . tag_name } , extracted version: ${ cleanVersion } ` ) ;
57+ if ( foundVersions . has ( cleanVersion ) ) continue ;
5458
55- // If not, add its version to the set and itself to the final version
56- const currentNewestVersion = [ ...foundVersions ] . sort ( semver . rcompare ) [ 0 ] ;
57- console . log ( "Current newest version" , currentNewestVersion ) ;
58- foundVersions . add ( cleanVersion ) ;
59- releases . push ( { cleanName, cleanVersion, ...release } ) ;
59+ // If not, add its version to the set and itself to the final version
60+ const currentNewestVersion = [ ...foundVersions ] . sort ( semver . rcompare ) [ 0 ] ;
61+ console . log ( "Current newest version" , currentNewestVersion ) ;
62+ foundVersions . add ( cleanVersion ) ;
63+ releases . push ( { cleanName, cleanVersion, ...release } ) ;
6064
61- // If it is newer than the newest we got, set this repo as the "final repo"
62- if ( ! currentNewestVersion || semver . gt ( cleanVersion , currentNewestVersion ) ) {
63- console . log (
64- `Current newest version "${ currentNewestVersion } " doesn't exist or is lesser than ${ cleanVersion } , setting ${ rest . owner } /${ rest . repoName } as final repo`
65- ) ;
66- currentPackage = {
67- category,
68- pkg,
69- ...rest
70- } ;
71- }
65+ // If it is newer than the newest we got, set this repo as the "final repo"
66+ if ( ! currentNewestVersion || semver . gt ( cleanVersion , currentNewestVersion ) ) {
67+ console . log (
68+ `Current newest version "${ currentNewestVersion } " doesn't exist or is lesser than ${ cleanVersion } , setting ${ rest . owner } /${ rest . repoName } as final repo`
69+ ) ;
70+ currentPackage = {
71+ category,
72+ pkg,
73+ ...rest
74+ } ;
7275 }
73- console . log ( "Done" ) ;
7476 }
77+ console . log ( "Done" ) ;
7578 }
7679 }
7780
78- if ( currentPackage ) {
79- // Return the final sorted results
80- return {
81- currentPackage,
82- releases : releases . toSorted (
83- ( a , b ) =>
84- new Date ( b . published_at ?? b . created_at ) . getTime ( ) -
85- new Date ( a . published_at ?? a . created_at ) . getTime ( )
86- )
87- } ;
88- }
81+ return currentPackage
82+ ? {
83+ releasesRepo : currentPackage ,
84+ releases : releases . toSorted (
85+ ( a , b ) =>
86+ new Date ( b . published_at ?? b . created_at ) . getTime ( ) -
87+ new Date ( a . published_at ?? a . created_at ) . getTime ( )
88+ )
89+ }
90+ : undefined ;
91+ }
92+
93+ async function getAllOtherReleases ( exceptPackage : string ) {
94+ const discovery = await discoverer . getOrDiscoverCategorized ( ) ;
95+ const otherPackages = discovery . flatMap ( ( { packages } ) => packages ) ;
96+
97+ const otherReleases = await Promise . all (
98+ otherPackages . map ( async otherPackage => await getReleases ( otherPackage . pkg . name , discovery ) )
99+ ) ;
100+
101+ return otherReleases
102+ . filter ( o => o !== undefined )
103+ . filter (
104+ ( { releasesRepo : releasesPackage } ) =>
105+ releasesPackage . pkg . name . localeCompare ( exceptPackage , undefined , {
106+ sensitivity : "base"
107+ } ) !== 0
108+ ) ;
109+ }
110+
111+ export async function load ( { params } ) {
112+ const { package : slugPackage } = params ;
113+ const categorizedPackages = await discoverer . getOrDiscoverCategorized ( ) ;
114+
115+ const computedReleases = await getReleases ( slugPackage , categorizedPackages ) ;
116+
117+ if ( ! computedReleases ) error ( 404 ) ;
89118
90- // If this one doesn't exist, return 404
91- error ( 404 ) ;
119+ const { releasesRepo : currentPackage , releases } = computedReleases ;
120+ return {
121+ currentPackage,
122+ releases,
123+ otherReleases : getAllOtherReleases ( currentPackage . pkg . name )
124+ } ;
92125}
0 commit comments