Subject: [bug#51838] [PATCH v6 05/41] guix: node-build-system: Add 'delete-dependencies' helper function.

From: Liliana Marie Prikler <[email-masked]>
Date: Thu, 30 Dec 2021 18:29:37 +0100

Am Donnerstag, dem 30.12.2021 um 02:38 -0500 schrieb Philip McGrath:
> * guix/build/node-build-system.scm (delete-dependencies): New
> exported procedure.  Functionally updates a "package.json"-like value
> by removing specified npm packages from the "dependencies" and
> "devDependencies" objects.
> ---
>  guix/build/node-build-system.scm | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
> 
> diff --git a/guix/build/node-build-system.scm b/guix/build/node-
> build-system.scm
> index dc8b6a41c2..9967223b86 100644
> --- a/guix/build/node-build-system.scm
> +++ b/guix/build/node-build-system.scm
> @@ -27,6 +27,7 @@ (define-module (guix build node-build-system)
>    #:use-module (srfi srfi-1)
>    #:export (%standard-phases
>              with-atomic-json-file-replacement
> +            delete-dependencies
>              node-build))
>  
>  ;; Commentary:
> @@ -325,6 +326,23 @@ (define resolve-dependencies
>                                 deps))))))
>    #t)
>  
> +(define (delete-dependencies pkg-meta absent-dependencies)
> +  "Functionally update PKG-META, a json object corresponding to a
> +'package.json' file, to allow building without the ABSENT-
> DEPENDENCIES.  To
> +avoid reintroducing the ABSENT-DEPENDENCIES, only use this procedure
> after the
> +'patch-dependencies' phase."
> +  (define delete-fom-jsobject
> +    (match-lambda
> +      (('@ . alist)
> +       (cons '@ (filter (match-lambda
> +                          ((k . v)
> +                           (not (member k absent-dependencies))))
> +                        alist)))))
> +  (jsobject-update*
> +   pkg-meta
> +   "devDependencies" '(@) delete-fom-jsobject
> +   "dependencies" '(@) delete-fom-jsobject))
Given this rather easy definition in terms of our helper functions, I
think this procedure can do more.  Particularly, I'd argue that we can
define it as such:

(define* (delete-dependencies dependencies #:key (file "package.json")
                              (json-keys 
                               '("dependencies" "devDependencies"))
  "Remove DEPENDENCIES from JSON_KEYS in FILE."
  (with-atomic-json-file-replacement ...))

This would in turn make it easier to delete dependencies from #:phases,
eliminating the need to shorten it to #:absent-dependencies.  WDYT?