From 472f334c8ab11eed41db05a6897b838d4b94eafd Mon Sep 17 00:00:00 2001 From: "Calvin A. Allen" Date: Mon, 20 Apr 2026 13:41:19 -0400 Subject: [PATCH] fix(node): keep odd versions Current through maintenance window Odd-numbered Node.js release lines (e.g., v25) have a maintenance date several weeks before their end date, but no LTS phase. The lifecycle resolver was mapping that window directly to EOL, so v25.9.0 rendered as EOL despite still being the Current release per nodejs.org. Treat the post-maintenance, pre-end window as Current for odd versions to match nodejs.org's release schedule page. --- src/runtimes/node/lifecycle.go | 6 ++++-- src/runtimes/node/lifecycle_test.go | 13 +++++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/runtimes/node/lifecycle.go b/src/runtimes/node/lifecycle.go index 735b569..58ad977 100644 --- a/src/runtimes/node/lifecycle.go +++ b/src/runtimes/node/lifecycle.go @@ -91,8 +91,10 @@ func (lp *lifecycleProvider) resolve(e scheduleEntry) string { if e.LTS != "" { return string(lifecycle.MaintenanceLTS) } - // Odd releases enter "maintenance" before EOL but are not LTS. - return string(lifecycle.EOL) + // Odd releases have a maintenance window before EOL but are not LTS; + // keep them labeled Current until their end date so the display + // matches nodejs.org's release schedule page. + return string(lifecycle.Current) } if lts := parseDate(e.LTS); !lts.IsZero() && !today.Before(lts) { diff --git a/src/runtimes/node/lifecycle_test.go b/src/runtimes/node/lifecycle_test.go index a14ed5f..a29eea4 100644 --- a/src/runtimes/node/lifecycle_test.go +++ b/src/runtimes/node/lifecycle_test.go @@ -55,10 +55,10 @@ func TestLifecycleProvider_VersionStatus(t *testing.T) { want: string(lifecycle.Current), }, { - name: "v23 odd version in maintenance is EOL (not LTS)", + name: "v23 odd version in maintenance window is still Current (not LTS)", now: "2025-04-15", version: "23.5.0", - want: string(lifecycle.EOL), + want: string(lifecycle.Current), }, { name: "v23 after end is EOL", @@ -66,6 +66,15 @@ func TestLifecycleProvider_VersionStatus(t *testing.T) { version: "23.5.0", want: string(lifecycle.EOL), }, + // v25: start 2025-10-15, maintenance 2026-04-01, end 2026-06-01 (no LTS) + // Regression for #241: odd version past maintenance but before end + // should show as Current, not EOL. + { + name: "v25 past maintenance but before end is Current", + now: "2026-04-20", + version: "25.9.0", + want: string(lifecycle.Current), + }, // Edge cases { name: "unknown major returns empty",