@@ -16,18 +16,27 @@ const REPO = 'CynToolkit/pipelab'
1616
1717export const fetchAllReleases = async ( ) : Promise < Release [ ] > => {
1818 const { logger } = useLogger ( )
19+ const allReleases : Release [ ] = [ ]
1920 try {
20- const url = `https://api.github.com/repos/${ REPO } /releases`
21- logger ( ) . info ( 'Fetching releases from GitHub API:' , url )
22- const response = await fetch ( url , {
23- headers : {
24- 'User-Agent' : 'Pipelab'
21+ // Fetch up to 5 pages (500 items total) to bypass monorepo package release noise
22+ for ( let page = 1 ; page <= 5 ; page ++ ) {
23+ const url = `https://api.github.com/repos/${ REPO } /releases?per_page=100&page=${ page } `
24+ logger ( ) . info ( `Fetching releases from GitHub API (page ${ page } ):` , url )
25+ const response = await fetch ( url , {
26+ headers : {
27+ 'User-Agent' : 'Pipelab'
28+ }
29+ } )
30+ if ( ! response . ok ) {
31+ throw new Error ( `Failed to fetch releases page ${ page } : ${ response . statusText } ` )
2532 }
26- } )
27- if ( ! response . ok ) {
28- throw new Error ( `Failed to fetch releases: ${ response . statusText } ` )
33+ const pageReleases = ( await response . json ( ) ) as Release [ ]
34+ if ( pageReleases . length === 0 ) {
35+ break
36+ }
37+ allReleases . push ( ...pageReleases )
2938 }
30- return ( await response . json ( ) ) as Release [ ]
39+ return allReleases
3140 } catch ( error ) {
3241 logger ( ) . error ( 'Error fetching all releases:' , error )
3342 throw error
@@ -50,14 +59,17 @@ export const fetchLatestRelease = async (
5059 const { logger } = useLogger ( )
5160
5261 try {
62+ logger ( ) . info ( 'fetchLatestRelease called with options:' , options )
5363 const releases = await fetchAllReleases ( )
64+ logger ( ) . info ( `Total releases fetched from API: ${ releases . length } ` )
5465
5566 // Handle command-line override
5667 if ( overrideRelease ) {
5768 logger ( ) . info ( 'Using release override:' , overrideRelease )
5869 const targetTag = overrideRelease . includes ( '@' ) ? overrideRelease : `${ packageName } @${ overrideRelease } `
5970 const release = releases . find ( ( r ) => r . tag_name === targetTag )
6071 if ( release ) {
72+ logger ( ) . info ( 'Found matching release for override:' , release . tag_name )
6173 return release
6274 }
6375 logger ( ) . warn ( `Release override ${ overrideRelease } not found for package ${ packageName } ` )
@@ -66,21 +78,28 @@ export const fetchLatestRelease = async (
6678 // Helper to get version from tag name
6779 const getVersion = ( tagName : string ) => tagName . split ( '@' ) . pop ( ) || '0.0.0'
6880
81+ const matchedPrefixReleases = releases . filter ( ( r ) => r . tag_name . startsWith ( `${ packageName } @` ) )
82+ logger ( ) . info ( `Found ${ matchedPrefixReleases . length } releases matching prefix "${ packageName } @"` )
83+
6984 // Filter for releases that follow the {packageName}@X .Y.Z tag pattern and filter out prereleases unconditionally unless prerelease is true
70- const packageReleases = releases
71- . filter ( ( r ) => r . tag_name . startsWith ( `${ packageName } @` ) )
72- . filter ( ( r ) => {
73- if ( prerelease ) {
74- return true
75- }
76- if ( r . prerelease ) {
77- return false
78- }
79- const version = getVersion ( r . tag_name )
80- return ! semver . prerelease ( version )
81- } )
85+ const packageReleases = matchedPrefixReleases . filter ( ( r ) => {
86+ const version = getVersion ( r . tag_name )
87+ const isPrerelease = r . prerelease || semver . prerelease ( version )
88+
89+ if ( prerelease ) {
90+ logger ( ) . info ( `[prerelease-mode] Keeping release: ${ r . tag_name } (prerelease: ${ ! ! isPrerelease } )` )
91+ return true
92+ }
93+ if ( isPrerelease ) {
94+ logger ( ) . info ( `[stable-mode] Skipping prerelease: ${ r . tag_name } ` )
95+ return false
96+ }
97+ logger ( ) . info ( `[stable-mode] Keeping stable release: ${ r . tag_name } ` )
98+ return true
99+ } )
82100
83101 if ( packageReleases . length === 0 ) {
102+ logger ( ) . info ( 'No releases matched after filtering.' )
84103 return null
85104 }
86105
@@ -93,6 +112,9 @@ export const fetchLatestRelease = async (
93112 return new Date ( b . published_at ) . getTime ( ) - new Date ( a . published_at ) . getTime ( )
94113 } )
95114
115+ logger ( ) . info ( 'Filtered releases order (sorted descending):' , packageReleases . map ( ( r ) => r . tag_name ) )
116+ logger ( ) . info ( 'Selected latest release:' , packageReleases [ 0 ] . tag_name )
117+
96118 return packageReleases [ 0 ]
97119 } catch ( error ) {
98120 logger ( ) . error ( 'Failed to fetch latest release:' , error )
0 commit comments