Subject: [bug#49242] Update UglifyJs (& dependencies) and update dependents

From: Efraim Flashner <[email-masked]>
Date: Mon, 12 Jul 2021 15:52:19 +0300

This should be two patches, one to add node-uglify-js and one to switch
over to the new version. Other comments inline.

I'm torn on putting uglify-js in a separate package module. I'm not
entirely sure how deprecating packages works across modules, but I guess
that's what I suggested below.

It'd probably be best to put it in an uglifyjs.scm and rename the
package to uglifyjs instead of node-uglify-js.

On Sun, Jun 27, 2021 at 04:01:21PM +0000, Charles via Guix-patches via wrote:
> From 53b96b21be2946e84e9687096313557a83c2e103 Mon Sep 17 00:00:00 2001
> From: Charles <[email-masked]>
> Date: Sat, 26 Jun 2021 14:44:23 -0500
> Subject: [PATCH] gnu: Update UglifyJs.
> 
> This change is to update the UglifyJs library. This updated Javascript
> implementation is by the same author as the original Common Lisp version and
> is the official successor. It supports many commonly found features of
> ECMAscript 6.
> 
> * gnu/packages/lisp-xyz.scm (uglify-js): Remove variable.
> * gnu/packages/node-xyz.scm (node-uglify-js): Add new variable.
> * guix/build-system/minify.scm (default-uglify-js): Update module-ref.
> * gnu/packages/bioinformatics.scm (bismark): Update inputs.
> * gnu/packages/ci.scm (laminar): Update inputs.
> * gnu/packages/cran.scm (r-shiny): Update inputs.
> * gnu/packages/cran.scm (r-shinytree): Update inputs.
> * gnu/packages/cran.scm (r-colourpicker): Update inputs.
> * gnu/packages/cran.scm (r-threejs): Update inputs.
> * gnu/packages/cran.scm (r-flexdashboard): Update inputs.
> * gnu/packages/cran.scm (r-bios2cor): Update inputs.
> * gnu/packages/cran.scm (r-rintrojs): Update inputs.
> * gnu/packages/cran.scm (r-dygraphs): Update inputs.
> * gnu/packages/javascript.scm (js-mathjax): Update inputs.
> * gnu/packages/web.scm (hpcguix-web): Update inputs.
> ---
>  gnu/packages/bioinformatics.scm    |  6 ++--
>  gnu/packages/ci.scm                |  6 ++--
>  gnu/packages/cran.scm              | 36 ++++++++++-----------
>  gnu/packages/javascript.scm        |  6 ++--
>  gnu/packages/lisp-xyz.scm          | 52 ------------------------------
>  gnu/packages/node-xyz.scm          | 24 ++++++++++++++
>  gnu/packages/web.scm               |  4 +--
>  guix/build-system/minify.scm       |  4 +--
>  guix/build/minify-build-system.scm |  2 +-
>  9 files changed, 56 insertions(+), 84 deletions(-)
> 
> diff --git a/gnu/packages/bioinformatics.scm b/gnu/packages/bioinformatics.scm
> index 7a1c8cc8e3..d11159b88c 100644
> --- a/gnu/packages/bioinformatics.scm
> +++ b/gnu/packages/bioinformatics.scm
> @@ -105,7 +105,6 @@
>    #:use-module (gnu packages java-compression)
>    #:use-module (gnu packages jemalloc)
>    #:use-module (gnu packages linux)
> -  #:use-module (gnu packages lisp-xyz)
>    #:use-module (gnu packages logging)
>    #:use-module (gnu packages lsof)
>    #:use-module (gnu packages machine-learning)
> @@ -114,6 +113,7 @@
>    #:use-module (gnu packages mpi)
>    #:use-module (gnu packages ncurses)
>    #:use-module (gnu packages node)
> +  #:use-module (gnu packages node-xyz)
>    #:use-module (gnu packages ocaml)
>    #:use-module (gnu packages pcre)
>    #:use-module (gnu packages parallel)
> @@ -9245,7 +9245,7 @@ Browser.")
>             (lambda* (#:key inputs #:allow-other-keys)
>               (let* ((file (assoc-ref inputs "plotly.js"))
>                      (installed "plotly/plotly.js"))
> -               (let ((minified (open-pipe* OPEN_READ "uglify-js" file)))
> +               (let ((minified (open-pipe* OPEN_READ "uglifyjs" file)))
>                   (call-with-output-file installed
>                     (cut dump-port minified <>))))
>               #t))
> @@ -9303,7 +9303,7 @@ Browser.")
>                                 "v1.39.4/dist/plotly.js"))
>             (sha256
>              (base32 "138mwsr4nf5qif4mrxx286mpnagxd1xwl6k8aidrjgknaqg88zyr"))))
> -       ("uglify-js" ,uglify-js)))
> +       ("node-uglify-js" ,node-uglify-js)))
>      (home-page "https://www.bioinformatics.babraham.ac.uk/projects/bismark/")
>      (synopsis "Map bisulfite treated sequence reads and analyze methylation")
>      (description "Bismark is a program to map bisulfite treated sequencing
> diff --git a/gnu/packages/ci.scm b/gnu/packages/ci.scm
> index 0bcde0fad5..9f9f5d6c20 100644
> --- a/gnu/packages/ci.scm
> +++ b/gnu/packages/ci.scm
> @@ -38,7 +38,7 @@
>    #:use-module (gnu packages guile)
>    #:use-module (gnu packages guile-xyz)
>    #:use-module (gnu packages gnupg)
> -  #:use-module (gnu packages lisp-xyz)
> +  #:use-module (gnu packages node-xyz)
>    #:use-module (gnu packages mail)
>    #:use-module (gnu packages package-management)
>    #:use-module (gnu packages perl)
> @@ -252,7 +252,7 @@ intended as a replacement for Hydra.")
>                           (let* ((file
>                                   (assoc-ref inputs (string-append name ".js")))
>                                  (port
> -                                 (open-pipe* OPEN_READ "uglify-js" file))
> +                                 (open-pipe* OPEN_READ "uglifyjs" file))
>                                  (destination
>                                   (string-append
>                                    "../build/js/" name ".min.js")))
> @@ -282,7 +282,7 @@ intended as a replacement for Hydra.")
>         ("zlib" ,zlib)))
>      (native-inputs
>       `(("googletest" ,googletest)
> -       ("uglify-js" ,uglify-js)
> +       ("node-uglify-js" ,node-uglify-js)
>  
>         ("vue.js"
>          ,(origin (method url-fetch)
> diff --git a/gnu/packages/cran.scm b/gnu/packages/cran.scm
> index e01b2417d2..69d98d34aa 100644
> --- a/gnu/packages/cran.scm
> +++ b/gnu/packages/cran.scm
> @@ -83,13 +83,13 @@
>    #:use-module (gnu packages java)
>    #:use-module (gnu packages javascript)
>    #:use-module (gnu packages libevent)
> -  #:use-module (gnu packages lisp-xyz)
>    #:use-module (gnu packages machine-learning)
>    #:use-module (gnu packages maths)
>    #:use-module (gnu packages mpi)
>    #:use-module (gnu packages multiprecision)
>    #:use-module (gnu packages networking)
>    #:use-module (gnu packages node)
> +  #:use-module (gnu packages node-xyz)
>    #:use-module (gnu packages pcre)
>    #:use-module (gnu packages pdf)
>    #:use-module (gnu packages perl)
> @@ -1991,7 +1991,7 @@ previewing themes in real time.")
>         ("js-strftime" ,js-strftime)
>         ("js-highlight" ,js-highlight)))
>      (native-inputs
> -     `(("uglify-js" ,uglify-js)
> +     `(("node-uglify-js" ,node-uglify-js)
>         ("gfortran" ,gfortran)
>         ("js-bootstrap-accessibility"
>          ,(origin
> @@ -2058,7 +2058,7 @@ responsive, and powerful applications with minimal effort.")
>                     (for-each (lambda (source target)
>                                 (format #t "Processing ~a --> ~a~%"
>                                         source target)
> -                               (let ((minified (open-pipe* OPEN_READ "uglify-js" source)))
> +                               (let ((minified (open-pipe* OPEN_READ "uglifyjs" source)))
>                                   (call-with-output-file target
>                                     (lambda (port)
>                                       (dump-port minified port)))))
> @@ -2073,7 +2073,7 @@ responsive, and powerful applications with minimal effort.")
>      (inputs
>       `(("js-requirejs" ,js-requirejs)))
>      (native-inputs
> -     `(("uglify-js" ,uglify-js)
> +     `(("node-uglify-js" ,node-uglify-js)
>         ("js-jquery"
>          ,(origin
>             (method url-fetch)
> @@ -2111,7 +2111,7 @@ supports interactive trees, to enable rich, editable trees in Shiny.")
>             (lambda _
>               (with-directory-excursion "inst/AdminLTE"
>                 (delete-file "app.min.js")
> -               (let ((minified (open-pipe* OPEN_READ "uglify-js" "app.js")))
> +               (let ((minified (open-pipe* OPEN_READ "uglifyjs" "app.js")))
>                   (call-with-output-file "app.min.js"
>                     (lambda (port)
>                       (dump-port minified port))))))))))
> @@ -2120,7 +2120,7 @@ supports interactive trees, to enable rich, editable trees in Shiny.")
>         ("r-promises" ,r-promises)
>         ("r-shiny" ,r-shiny)))
>      (native-inputs
> -     `(("uglify-js" ,uglify-js)))
> +     `(("node-uglify-js" ,node-uglify-js)))
>      (home-page "https://rstudio.github.io/shinydashboard/")
>      (synopsis "Create dashboards with shiny")
>      (description "This package provides an extension to the Shiny web
> @@ -14849,7 +14849,7 @@ to easily call your own custom JavaScript functions from R.")
>                                 (format #t "Processing ~a --> ~a~%"
>                                         source target)
>                                 (delete-file target)
> -                               (let ((minified (open-pipe* OPEN_READ "uglify-js" source)))
> +                               (let ((minified (open-pipe* OPEN_READ "uglifyjs" source)))
>                                   (call-with-output-file target
>                                     (lambda (port)
>                                       (dump-port minified port)))))
> @@ -14865,7 +14865,7 @@ to easily call your own custom JavaScript functions from R.")
>         ("r-shinyjs" ,r-shinyjs)))
>      (native-inputs
>       `(("r-knitr" ,r-knitr)
> -       ("uglify-js" ,uglify-js)
> +       ("node-uglify-js" ,node-uglify-js)
>         ("js-jquery"
>          ,(origin
>             (method url-fetch)
> @@ -17276,7 +17276,7 @@ and Learning to Rank measures (LambdaMart).")
>                                 (format #t "Processing ~a --> ~a~%"
>                                         source target)
>                                 (delete-file target)
> -                               (let ((minified (open-pipe* OPEN_READ "uglify-js" source)))
> +                               (let ((minified (open-pipe* OPEN_READ "uglifyjs" source)))
>                                   (call-with-output-file target
>                                     (lambda (port)
>                                       (dump-port minified port)))))
> @@ -17288,7 +17288,7 @@ and Learning to Rank measures (LambdaMart).")
>         ("r-htmlwidgets" ,r-htmlwidgets)
>         ("r-igraph" ,r-igraph)))
>      (native-inputs
> -     `(("uglify-js" ,uglify-js)
> +     `(("node-uglify-js" ,node-uglify-js)
>         ("js-jquery"
>          ,(origin
>             (method url-fetch)
> @@ -17523,7 +17523,7 @@ etc.).  Text boxes with automatic word wrap are also supported.")
>                     (for-each (lambda (source target)
>                                 (format #t "Processing ~a --> ~a~%"
>                                         source target)
> -                               (let ((minified (open-pipe* OPEN_READ "uglify-js" source)))
> +                               (let ((minified (open-pipe* OPEN_READ "uglifyjs" source)))
>                                   (call-with-output-file target
>                                     (lambda (port)
>                                       (dump-port minified port)))))
> @@ -17537,7 +17537,7 @@ etc.).  Text boxes with automatic word wrap are also supported.")
>         ("r-rmarkdown" ,r-rmarkdown)
>         ("r-shiny" ,r-shiny)))
>      (native-inputs
> -     `(("uglify-js" ,uglify-js)
> +     `(("node-uglify-js" ,node-uglify-js)
>         ("js-raphael"
>          ,(origin
>             (method url-fetch)
> @@ -19380,14 +19380,14 @@ tools for help in data interpretation.")
>                     (for-each (lambda (source target)
>                                 (format #t "Processing ~a --> ~a~%"
>                                         source target)
> -                               (let ((minified (open-pipe* OPEN_READ "uglify-js" source)))
> +                               (let ((minified (open-pipe* OPEN_READ "uglifyjs" source)))
>                                   (call-with-output-file target
>                                     (lambda (port)
>                                       (dump-port minified port)))))
>                               sources targets))))
>               #t)))))
>      (native-inputs
> -     `(("uglify-js" ,uglify-js)
> +     `(("node-uglify-js" ,node-uglify-js)
>         ;; NOTE: Make sure that this version of d3 is still valid when
>         ;; upgrading the package.
>         ("d3.v4.js"
> @@ -19645,14 +19645,14 @@ cell free DNA} (cfDNA).")
>                     (for-each (lambda (source target)
>                                 (format #t "Processing ~a --> ~a~%"
>                                         source target)
> -                               (let ((minified (open-pipe* OPEN_READ "uglify-js" source)))
> +                               (let ((minified (open-pipe* OPEN_READ "uglifyjs" source)))
>                                   (call-with-output-file target
>                                     (lambda (port)
>                                       (dump-port minified port)))))
>                               sources targets))))
>               #t)))))
>      (native-inputs
> -     `(("uglify-js" ,uglify-js)
> +     `(("node-uglify-js" ,node-uglify-js)
>         ("intro.js"
>          ,(origin
>             (method url-fetch)
> @@ -23716,14 +23716,14 @@ documents, Shiny applications, Plumber APIs, plots, and static web content.")
>                     (for-each (lambda (source target)
>                                 (format #t "Processing ~a --> ~a~%"
>                                         source target)
> -                               (let ((minified (open-pipe* OPEN_READ "uglify-js" source)))
> +                               (let ((minified (open-pipe* OPEN_READ "uglifyjs" source)))
>                                   (call-with-output-file target
>                                     (lambda (port)
>                                       (dump-port minified port)))))
>                               sources targets))))
>               #t)))))
>      (native-inputs
> -     `(("uglify-js" ,uglify-js)
> +     `(("uglify-js" ,node-uglify-js)
>         ;; They actually use version 1.11.1, but this more recent version
>         ;; should be just fine.
>         ("js-jquery"
> diff --git a/gnu/packages/javascript.scm b/gnu/packages/javascript.scm
> index a935d321c5..2dc1c330a2 100644
> --- a/gnu/packages/javascript.scm
> +++ b/gnu/packages/javascript.scm
> @@ -26,7 +26,7 @@
>    #:use-module (gnu packages)
>    #:use-module (gnu packages base)
>    #:use-module (gnu packages compression)
> -  #:use-module (gnu packages lisp-xyz)
> +  #:use-module (gnu packages node-xyz)
>    #:use-module (gnu packages readline)
>    #:use-module (gnu packages web)
>    #:use-module (guix packages)
> @@ -163,7 +163,7 @@ context menu in TypeScript.")
>                  (cond
>                   ((string-match "\\.js$" file)
>                    (mkdir-p (dirname installed))
> -                  (let ((minified (open-pipe* OPEN_READ "uglify-js" file)))
> +                  (let ((minified (open-pipe* OPEN_READ "uglifyjs" file)))
>                      (call-with-output-file installed
>                        (lambda (port)
>                          (dump-port minified port)))
> @@ -179,7 +179,7 @@ context menu in TypeScript.")
>      (native-inputs
>       `(("font-mathjax" ,font-mathjax)
>         ("glibc-utf8-locales" ,glibc-utf8-locales)
> -       ("uglify-js" ,uglify-js)
> +       ("node-uglify-js" ,node-uglify-js)
>         ,@(package-native-inputs font-mathjax)))
>      (synopsis "JavaScript display engine for LaTeX, MathML, and AsciiMath")
>      (description "MathJax is a JavaScript display engine for LaTeX, MathML,
> diff --git a/gnu/packages/lisp-xyz.scm b/gnu/packages/lisp-xyz.scm
> index a4a5d6f543..3c891162ee 100644
> --- a/gnu/packages/lisp-xyz.scm
> +++ b/gnu/packages/lisp-xyz.scm
> @@ -1276,58 +1276,6 @@ compressor.  It works on data produced by @code{parse-js} to generate a
>  (define-public ecl-cl-uglify-js
>    (sbcl-package->ecl-package sbcl-cl-uglify-js))
>  

It would be better to keep this and deprecate it, then people will have
a warning that it's changed.

(define-public uglify-js
  (deprecated-package "uglify-js" node-uglify-js))

> -(define-public uglify-js
> -  (package
> -    (inherit sbcl-cl-uglify-js)
> -    (name "uglify-js")
> -    (build-system trivial-build-system)
> -    (arguments
> -     `(#:modules ((guix build utils))
> -       #:builder
> -       (let* ((bin    (string-append (assoc-ref %outputs "out") "/bin/"))
> -              (script (string-append bin "uglify-js")))
> -         (use-modules (guix build utils))
> -         (mkdir-p bin)
> -         (with-output-to-file script
> -           (lambda _
> -             (format #t "#!~a/bin/sbcl --script
> -
> - (require :asdf)
> - (asdf:initialize-source-registry
> -  #p\"~a/etc/common-lisp/source-registry.conf.d/\")
> - (asdf:initialize-output-translations
> -  #p\"~a/etc/common-lisp/asdf-output-translations.conf.d/\")"
> -                     (assoc-ref %build-inputs "sbcl")
> -                     (assoc-ref %build-inputs "sbcl-cl-uglify-js")
> -                     (assoc-ref %build-inputs "sbcl-cl-uglify-js"))
> -             ;; FIXME: cannot use progn here because otherwise it fails to
> -             ;; find cl-uglify-js.
> -             (for-each
> -              write
> -              '(;; Quiet, please!
> -                (let ((*standard-output* (make-broadcast-stream))
> -                      (*error-output* (make-broadcast-stream)))
> -                  (asdf:load-system :cl-uglify-js))
> -                (let ((file (cadr *posix-argv*)))
> -                  (if file
> -                      (format t "~a"
> -                              (cl-uglify-js:ast-gen-code
> -                               (cl-uglify-js:ast-mangle
> -                                (cl-uglify-js:ast-squeeze
> -                                 (with-open-file (in file)
> -                                                 (parse-js:parse-js in))))
> -                               :beautify nil))
> -                      (progn
> -                       (format *error-output*
> -                               "Please provide a JavaScript file.~%")
> -                       (sb-ext:exit :code 1))))))))
> -         (chmod script #o755)
> -         #t)))
> -    (inputs
> -     `(("sbcl" ,sbcl)
> -       ("sbcl-cl-uglify-js" ,sbcl-cl-uglify-js)))
> -    (synopsis "JavaScript compressor")))
> -
>  (define-public sbcl-cl-strings
>    (let ((revision "1")
>          (commit "c5c5cbafbf3e6181d03c354d66e41a4f063f00ae"))
> diff --git a/gnu/packages/node-xyz.scm b/gnu/packages/node-xyz.scm
> index 7818b44d9e..3661fdb0c4 100644
> --- a/gnu/packages/node-xyz.scm
> +++ b/gnu/packages/node-xyz.scm
> @@ -357,3 +357,27 @@ if desired.")
>      (description "Acornjs is a Javascrip parser with many options and an
>  architecture supporting plugins.")
>      (license license:expat)))
> +
> +(define-public node-uglify-js
> +  (package
> +    (name "node-uglify-js")
> +    (version "3.13.9")
> +    (source
> +     (origin
> +       (method url-fetch)
> +       (uri (string-append
> +             "https://github.com/mishoo/UglifyJS/archive/refs/tags/v"
> +             version ".tar.gz"))

This one also should be downloaded using git-fetch.

> +       (sha256
> +        (base32 "0dpgkqwyrkqlvixwl841375s134slnj3h0viff1cpxq81mxqph09"))))
> +    (build-system node-build-system)
> +    (inputs
> +     `(("semver" ,node-semver)
> +       ("acorn" ,node-acorn)))
> +    (home-page "https://lisperator.net/uglifyjs/")
> +    (synopsis "JavaScript parser / mangler / compressor / beautifier toolkit")

Make sure you have two spaces between each sentence.

> +    (description "UglifyJS is a JavaScript compressor/minifier written in
> +JavaScript. It also contains tools that allow one to automate working with
> +JavaScript code: parser, code generator, compressor, mangler, scope analyzer,
> +tree walker, and tree transformer.")
> +    (license license:bsd-2)))
> diff --git a/gnu/packages/web.scm b/gnu/packages/web.scm
> index 412308b417..6d39103b5b 100644
> --- a/gnu/packages/web.scm
> +++ b/gnu/packages/web.scm
> @@ -138,7 +138,7 @@
>    #:use-module (gnu packages libunistring)
>    #:use-module (gnu packages libunwind)
>    #:use-module (gnu packages linux)
> -  #:use-module (gnu packages lisp-xyz)
> +  #:use-module (gnu packages node-xyz)
>    #:use-module (gnu packages lsof)
>    #:use-module (gnu packages lua)
>    #:use-module (gnu packages mail)
> @@ -7759,7 +7759,7 @@ compressed JSON header blocks.
>        (native-inputs
>         `(("autoconf" ,autoconf)
>           ("automake" ,automake)
> -         ("uglify-js" ,uglify-js)
> +         ("node-uglify-js" ,node-uglify-js)
>           ("pkg-config" ,pkg-config)))
>        (inputs
>         `(("guile" ,@(assoc-ref (package-native-inputs guix) "guile"))
> diff --git a/guix/build-system/minify.scm b/guix/build-system/minify.scm
> index 28a6781c06..add6b9f080 100644
> --- a/guix/build-system/minify.scm
> +++ b/guix/build-system/minify.scm
> @@ -44,8 +44,8 @@
>  (define (default-uglify-js)
>    "Return the default package to minify JavaScript source files."
>    ;; Lazily resolve the binding to avoid a circular dependency.
> -  (let ((mod (resolve-interface '(gnu packages lisp-xyz))))
> -    (module-ref mod 'uglify-js)))
> +  (let ((mod (resolve-interface '(gnu packages node-xyz))))
> +    (module-ref mod 'node-uglify-js)))
>  
>  (define* (lower name
>                  #:key source inputs native-inputs outputs system
> diff --git a/guix/build/minify-build-system.scm b/guix/build/minify-build-system.scm
> index 92158a033f..c5a876726f 100644
> --- a/guix/build/minify-build-system.scm
> +++ b/guix/build/minify-build-system.scm
> @@ -39,7 +39,7 @@
>    (format #t "minifying ~a\n" file)
>    (let* ((base (basename file ".js"))
>           (installed (or target (string-append directory base ".min.js")))
> -         (minified (open-pipe* OPEN_READ "uglify-js" file)))
> +         (minified (open-pipe* OPEN_READ "uglifyjs" file)))
>      (call-with-output-file installed
>        (cut dump-port minified <>))
>      #t))
> -- 
> 2.32.0
> 

-- 
Efraim Flashner   <[email-masked]>   אפרים פלשנר
GPG key = A28B F40C 3E55 1372 662D  14F7 41AA E7DC CA3D 8351
Confidentiality cannot be guaranteed on emails sent or received unencrypted