@@ -313,6 +313,16 @@ impl NodeProvider {
313313 find_latest_lts_version ( & versions)
314314 }
315315
316+ /// Get the absolute latest version, including non-LTS.
317+ ///
318+ /// # Errors
319+ ///
320+ /// Returns an error if no version is found or the version index cannot be fetched.
321+ pub async fn resolve_absolute_latest_version ( & self ) -> Result < Str , Error > {
322+ let versions = self . fetch_version_index ( ) . await ?;
323+ find_absolute_latest_version ( & versions)
324+ }
325+
316326 /// Check if a version string is an LTS alias (e.g., `lts/*`, `lts/iron`, `lts/-1`).
317327 ///
318328 /// Returns `true` for LTS alias formats:
@@ -461,6 +471,21 @@ fn find_latest_lts_version(versions: &[NodeVersionEntry]) -> Result<Str, Error>
461471 } )
462472}
463473
474+ /// Find the absolute latest version, regardless of LTS status.
475+ ///
476+ /// The version index is sorted newest-first, so we take the first entry.
477+ fn find_absolute_latest_version ( versions : & [ NodeVersionEntry ] ) -> Result < Str , Error > {
478+ versions
479+ . first ( )
480+ . map ( |entry| {
481+ let version_str = entry. version . strip_prefix ( 'v' ) . unwrap_or ( & entry. version ) ;
482+ version_str. into ( )
483+ } )
484+ . ok_or_else ( || Error :: VersionIndexParseFailed {
485+ reason : "No version found in version index" . into ( ) ,
486+ } )
487+ }
488+
464489/// Resolve a version requirement to a matching version from a list.
465490///
466491/// Prefers LTS versions over non-LTS versions. Returns the highest LTS version
@@ -1183,6 +1208,49 @@ fedcba987654 node-v22.13.1-win-x64.zip";
11831208 assert_eq ! ( result, "20.19.0" ) ;
11841209 }
11851210
1211+ // ========================================================================
1212+ // Absolute Latest Version Tests
1213+ // ========================================================================
1214+
1215+ #[ test]
1216+ fn test_find_absolute_latest_version ( ) {
1217+ use super :: find_absolute_latest_version;
1218+
1219+ let versions = vec ! [
1220+ NodeVersionEntry { version: "v25.5.0" . into( ) , lts: LtsInfo :: NotLts } ,
1221+ NodeVersionEntry { version: "v24.5.0" . into( ) , lts: LtsInfo :: Codename ( "Jod" . into( ) ) } ,
1222+ NodeVersionEntry { version: "v22.15.0" . into( ) , lts: LtsInfo :: Codename ( "Jod" . into( ) ) } ,
1223+ NodeVersionEntry { version: "v20.19.0" . into( ) , lts: LtsInfo :: Codename ( "Iron" . into( ) ) } ,
1224+ ] ;
1225+
1226+ // Should return the absolute highest version, not LTS
1227+ let result = find_absolute_latest_version ( & versions) . unwrap ( ) ;
1228+ assert_eq ! ( result, "25.5.0" ) ;
1229+ }
1230+
1231+ #[ test]
1232+ fn test_find_absolute_latest_version_all_lts ( ) {
1233+ use super :: find_absolute_latest_version;
1234+
1235+ let versions = vec ! [
1236+ NodeVersionEntry { version: "v24.5.0" . into( ) , lts: LtsInfo :: Codename ( "Jod" . into( ) ) } ,
1237+ NodeVersionEntry { version: "v22.15.0" . into( ) , lts: LtsInfo :: Codename ( "Jod" . into( ) ) } ,
1238+ ] ;
1239+
1240+ // When all versions are LTS, return the highest
1241+ let result = find_absolute_latest_version ( & versions) . unwrap ( ) ;
1242+ assert_eq ! ( result, "24.5.0" ) ;
1243+ }
1244+
1245+ #[ test]
1246+ fn test_find_absolute_latest_version_empty ( ) {
1247+ use super :: find_absolute_latest_version;
1248+
1249+ let versions: Vec < NodeVersionEntry > = vec ! [ ] ;
1250+ let result = find_absolute_latest_version ( & versions) ;
1251+ assert ! ( result. is_err( ) ) ;
1252+ }
1253+
11861254 // ========================================================================
11871255 // LTS Alias Tests
11881256 // ========================================================================
0 commit comments