guix_mirror_bot pushed a commit to branch master
in repository guix.

commit ebb43a317a795a2d083d22f88f709759e392d7b5
Author: Jelle Licht <[email protected]>
AuthorDate: Thu Oct 15 13:07:38 2026 +0200

    build/node: Repack only files that npm would publish.
    
    * guix/build/node-build-system.scm (repack): Calculate the file list with 
'npm
    pack --dry-run --json'.  Delete devDependencies from package.json before
    packing.
---
 guix/build/node-build-system.scm | 37 +++++++++++++++++++++++++++++--------
 1 file changed, 29 insertions(+), 8 deletions(-)

diff --git a/guix/build/node-build-system.scm b/guix/build/node-build-system.scm
index 0ef1aff0dbc..0e641a59432 100644
--- a/guix/build/node-build-system.scm
+++ b/guix/build/node-build-system.scm
@@ -30,6 +30,8 @@
   #:use-module (guix build utils)
   #:use-module (ice-9 format)
   #:use-module (ice-9 ftw)
+  #:use-module (ice-9 popen)
+  #:use-module (ice-9 textual-ports)
   #:use-module (ice-9 regex)
   #:use-module (ice-9 match)
   #:use-module (json)
@@ -226,14 +228,33 @@ dependencies."
       (format #t "test suite not run~%")))
 
 (define* (repack #:key inputs #:allow-other-keys)
-  (invoke "tar"
-          ;; Add options suggested by 
https://reproducible-builds.org/docs/archives/
-          "--sort=name"
-          (string-append "--mtime=@" (getenv "SOURCE_DATE_EPOCH"))
-          "--owner=0"
-          "--group=0"
-          "--numeric-owner"
-          "-czf" "../package.tgz" "."))
+  ;; Use 'npm pack --dry-run --json' to get the canonical file list,
+  ;; respecting .npmignore, the 'files' field, and default exclusions (such as
+  ;; node_modules/).  This prevents build artifacts and store path references
+  ;; leaking into the installed package closure.
+  (let* ((npm (string-append (assoc-ref inputs "node") "/bin/npm"))
+         (port (open-pipe* OPEN_READ npm "pack" "--dry-run" "--json"))
+         (json-str (get-string-all port))
+         (_ (close-pipe port))
+         (pack-info (json->scm (open-input-string json-str)))
+         (files (map (lambda (f) (string-append "./" (assoc-ref f "path")))
+                     (vector->list
+                      (assoc-ref (vector-ref pack-info 0) "files")))))
+    ;; Remove dev dependencies from package.json before repacking.
+    ;; node_modules/ is excluded from the tarball via npm's file list, so lock
+    ;; file cleanup is not needed."
+    (modify-json "package.json" (delete-dev-dependencies))
+    (apply invoke
+           "tar"
+           ;; Options suggested by 
https://reproducible-builds.org/docs/archives/
+           "--sort=name"
+           (string-append "--mtime=@" (getenv "SOURCE_DATE_EPOCH"))
+           "--owner=0"
+           "--group=0"
+           "--numeric-owner"
+           "-czf" "../package.tgz"
+           "--"
+           files)))
 
 (define* (install #:key outputs inputs #:allow-other-keys)
   "Install the node module to the output store item."

Reply via email to