guix_mirror_bot pushed a commit to branch master
in repository guix.

commit 69e039ee338494c407dfa066d4435e4793b0e1d3
Author: Maxim Cournoyer <[email protected]>
AuthorDate: Wed Sep 16 12:16:46 2026 +0900

    gnu: node: Add a release-monitoring-url package property.
    
    Along some tooling to make it easier to update the package to its latest LTS
    version.
    
    * gnu/packages/node.scm (latest-node-lts-version): New procedure.
    (%current-node-lts-major-version): New variable.
    (node-lts) [properties]: Add a release-monitoring-url property.
---
 gnu/packages/node.scm | 32 +++++++++++++++++++++++++++++---
 1 file changed, 29 insertions(+), 3 deletions(-)

diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 88d8eda3b2a..9a17349bb4f 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -14,6 +14,7 @@
 ;;; Copyright © 2022 Hilton Chain <[email protected]>
 ;;; Copyright © 2024 Efraim Flashner <[email protected]>
 ;;; Copyright © 2024, 2025 Daniel Khodabakhsh <[email protected]>
+;;; Copyright © 2026 Maxim Cournoyer <[email protected]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -56,12 +57,16 @@
   #:use-module (guix gexp)
   #:use-module (guix git-download)
   #:use-module (guix gexp)
+  #:autoload (guix http-client) (http-fetch/cached)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (guix packages)
   #:use-module (guix utils)
   #:use-module (ice-9 match)
+  #:autoload (json parser) (json->scm)
   #:use-module (srfi srfi-1)
-  #:use-module (srfi srfi-26))
+  #:use-module (srfi srfi-26)
+
+  #:export (latest-node-lts-version))
 
 ;; Stripped-down build phases for JS packages.  Uses esbuild + NODE_PATH 
instead
 ;; of npm, so editing node-build-system does not rebuild node-lts.  Set the
@@ -286,6 +291,24 @@
 parser definition into a C output.")
     (license license:expat)))
 
+(define (latest-node-lts-version)
+  "Return the last Node.js LTS release version string, or #f."
+  (define release-index-url "https://nodejs.org/dist/index.json";)
+  (define releases (vector->list
+                    (call-with-port (http-fetch/cached release-index-url)
+                      json->scm)))
+  (let ((version (and=> (find (lambda (release)
+                                (assoc-ref release "lts"))
+                              releases)
+                        (cut assoc-ref <> "version"))))
+    (if (string-prefix? "v" version)
+        (string-drop version 1)
+        version)))
+
+;;; To find out if %current-node-lts-major-version needs to be updated, you
+;;; can use: (version-major (latest-node-lts-version))
+(define %current-node-lts-major-version "24")
+
 (define-public node-lts
   (package
     (name "node")
@@ -656,9 +679,12 @@ devices.")
     (supported-systems (fold delete %supported-systems '("powerpc-linux")))
     (home-page "https://nodejs.org/";)
     (license license:expat)
-    (properties '((max-silent-time . 7200)   ;2h, needed on ARM
+    (properties `((max-silent-time . 7200)   ;2h, needed on ARM
                   (timeout . 21600)          ;6h
-                  (cpe-name . "node.js")))))
+                  (cpe-name . "node.js")
+                  (release-monitoring-url
+                   . ,(format #f "https://nodejs.org/dist/latest-v~a.x/";
+                              %current-node-lts-major-version))))))
 
 (define-public node node-lts)
 

Reply via email to