[PATCH 00/13] node going forward

  • Done
  • quality assurance status badge
Details
6 participants
  • Efraim Flashner
  • Jelle Licht
  • Lars-Dominik Braun
  • Lars-Dominik Braun
  • Léo Le Bouter
  • Timothy Sample
Owner
unassigned
Submitted by
Jelle Licht
Severity
normal
J
J
Jelle Licht wrote on 20 Mar 2021 15:57
(address . guix-patches@gnu.org)
20210320145706.12308-1-jlicht@fsfe.org
So, some people seem to be interested in this one; please review and test.

Thanks again to Timothy Sample, who made quite some of these things happen.

Jelle Licht (13):
build-system: Rewrite node build system.
gnu: Add libuv-node
gnu: node: Use license prefix.
gnu: node: Add node-bootstrap.
gnu: node: Add node-semver-bootstrap.
gnu: node: Add node-ms-bootstrap.
gnu: node: Add node-binary-search-bootstrap.
gnu: node: Add node-debug-bootstrap.
gnu: node: Add node-llparse-builder-bootstrap.
gnu: node: Add node-llparse-frontend-bootstrap.
gnu: node: Add node-llparse-bootstrap.
gnu: node: Add llhttp-bootstrap.
gnu: node: Add node-lts

gnu/packages/libevent.scm | 16 +
gnu/packages/node-xyz.scm | 74 +++--
gnu/packages/node.scm | 547 ++++++++++++++++++++++++++++++-
guix/build-system/node.scm | 39 +--
guix/build/node-build-system.scm | 203 ++++++------
5 files changed, 720 insertions(+), 159 deletions(-)

--
2.31.0
J
J
Jelle Licht wrote on 20 Mar 2021 15:59
[PATCH 02/13] gnu: Add libuv-node
(address . 47282@debbugs.gnu.org)
20210320145925.12500-2-jlicht@fsfe.org
* gnu/packages/libevent.scm (libuv-node): New variable.
---
gnu/packages/libevent.scm | 16 ++++++++++++++++
1 file changed, 16 insertions(+)

Toggle diff (29 lines)
diff --git a/gnu/packages/libevent.scm b/gnu/packages/libevent.scm
index 7109d9a88d..699d0705dd 100644
--- a/gnu/packages/libevent.scm
+++ b/gnu/packages/libevent.scm
@@ -134,6 +134,22 @@ resolution, asynchronous file system operations, and threading primitives.")
;; details. Documentation is CC-BY 4.0 as of 1.12.0; see 'LICENSE-docs'.
(license (list expat cc-by4.0))))
+(define-public libuv-node
+ ;; When upgrading Node, also upgrade this. Get the version from
+ ;; https://github.com/nodejs/node/blob/master/deps/uv/include/uv/version.h
+ (package
+ (inherit libuv)
+ (name "libuv-node")
+ (version "1.40.0")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "https://dist.libuv.org/dist/v" version
+ "/libuv-v" version ".tar.gz"))
+ (sha256
+ (base32
+ "1551k3ab27vbg9517l9b4iqbramwxdkwgpf53knas05cbfwhvab1"))))))
+
+
(define-public perl-anyevent
(package
(name "perl-anyevent")
--
2.31.0
J
J
Jelle Licht wrote on 20 Mar 2021 15:59
[PATCH 01/13] build-system: Rewrite node build system.
(address . 47282@debbugs.gnu.org)(name . Timothy Sample)(address . samplet@ngyro.com)
20210320145925.12500-1-jlicht@fsfe.org
* guix/build/node-build-system.scm: Rewrite it.
* guix/build-system/node.scm: Adjust accordingly.
* gnu/packages/node-xyz.scm (node-color-name, node-env-variable, node-far,
node-long-stack-traces, node-mersenne, node-oop, node-stack-trace,
node-statsd-parser, node-utils-deprecate, node-semver): Likewise.

Co-authored-by: Timothy Sample <samplet@ngyro.com>
---
gnu/packages/node-xyz.scm | 74 +++++++----
guix/build-system/node.scm | 37 ++----
guix/build/node-build-system.scm | 203 ++++++++++++++-----------------
3 files changed, 158 insertions(+), 156 deletions(-)

Toggle diff (491 lines)
diff --git a/gnu/packages/node-xyz.scm b/gnu/packages/node-xyz.scm
index b1d6d4ce59..7d7f0251d1 100644
--- a/gnu/packages/node-xyz.scm
+++ b/gnu/packages/node-xyz.scm
@@ -38,6 +38,11 @@
(base32
"09rbmj16nfwcwkhrybqxyy66bkrs50vpw6hkdqqb14l3gsyxpr74"))))
(build-system node-build-system)
+ (arguments
+ `(#:phases
+ (modify-phases
+ %standard-phases
+ (delete 'build))))
(home-page "https://github.com/colorjs/color-name")
(synopsis "JSON with CSS color names")
(description
@@ -59,7 +64,11 @@
(base32
"0nnpxjxfhy4na7fixb7p3ww6ard5xgggfm83b78i333867r4gmsq"))))
(build-system node-build-system)
- (arguments '(#:tests? #f)) ; No tests.
+ (arguments '(#:tests? #f ; No tests.
+ #:phases
+ (modify-phases
+ %standard-phases
+ (delete 'build))))
(home-page "https://github.com/bigpipe/env-variable")
(synopsis "Environment variables for Node with fallbacks")
(description "This package provides environment variables with
@@ -85,6 +94,7 @@
(arguments
'(#:phases
(modify-phases %standard-phases
+ (delete 'build)
(replace 'check
(lambda _
;; We skip the two tests which are supposed to fail.
@@ -113,7 +123,10 @@ codes.")
(base32
"0famwsyc6xawi30v25zi65d8fhbvlvh976bqydf1dqn5gz200cl3"))))
(build-system node-build-system)
- (arguments '(#:tests? #f)) ; No tests.
+ (arguments '(#:tests? #f ; No tests.
+ #:phases
+ (modify-phases %standard-phases
+ (delete 'build))))
(home-page "https://github.com/tlrobinson/long-stack-traces")
(synopsis "Long stacktraces implemented in user-land JavaScript")
(description "This package provides long stacktraces for V8 implemented in
@@ -136,7 +149,10 @@ user-land JavaScript.")
(base32
"034iaiq2pdqn342p2404cpz364g282d2hkp9375hysnh9i968wbb"))))
(build-system node-build-system)
- (arguments '(#:tests? #f)) ; No tests.
+ (arguments '(#:tests? #f ; No tests.
+ #:phases
+ (modify-phases %standard-phases
+ (delete 'build))))
(home-page "http://www.enchantedage.com/node-mersenne")
(synopsis "Node.js module for generating Mersenne Twister random numbers")
(description "Thix package provides a node.js port of the Mersenne Twister
@@ -161,7 +177,11 @@ random number generator.")
(base32
"0mqrcf0xi2jbwffwkk00cljpqfsri1jk8s6kz8jny45apn7zjds1"))))
(build-system node-build-system)
- (arguments '(#:tests? #f)) ; Tests run during build phase.
+ (arguments '(#:tests? #f ; Tests run during build phase.
+ #:phases
+ (modify-phases
+ %standard-phases
+ (delete 'build))))
(home-page "https://github.com/felixge/node-oop")
(synopsis "Simple, light-weight oop module for Node")
(description "This library tries to bring basic oop features to JavaScript
@@ -189,11 +209,12 @@ while being as light-weight and simple as possible.")
(arguments
'(#:phases
(modify-phases %standard-phases
- (add-before 'check 'skip-intentionally-failing-test
- (lambda _
- (substitute* "test/run.js"
- (("far.include") "far.exclude(/test-parse.js/)\nfar.include"))
- #t)))))
+ (delete 'build)
+ (add-before 'check 'skip-intentionally-failing-test
+ (lambda _
+ (substitute* "test/run.js"
+ (("far.include") "far.exclude(/test-parse.js/)\nfar.include"))
+ #t)))))
(native-inputs
`(("node-far" ,node-far)
("node-long-stack-traces" ,node-long-stack-traces)))
@@ -207,17 +228,20 @@ while being as light-weight and simple as possible.")
(name "node-statsd-parser")
(version "0.0.4")
(source
- (origin
- (method git-fetch)
- (uri (git-reference
- (url "https://github.com/dscape/statsd-parser")
- (commit version)))
- (file-name (git-file-name name version))
- (sha256
- (base32
- "049rnczsd6pv6bk282q4w72bhqc5cs562djgr7yncy7lk0wzq5j3"))))
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/dscape/statsd-parser")
+ (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "049rnczsd6pv6bk282q4w72bhqc5cs562djgr7yncy7lk0wzq5j3"))))
(build-system node-build-system)
- (arguments '(#:tests? #f)) ; No tests.
+ (arguments '(#:tests? #f ; No tests.
+ #:phases
+ (modify-phases %standard-phases
+ (delete 'build))))
(home-page "https://github.com/dscape/statsd-parser")
(synopsis "Streaming parser for the statsd protocol")
(description "This package provides a streaming parser for the statsd
@@ -239,7 +263,10 @@ protocol used in @code{node-lynx}.")
(base32
"1rk94nl3qc7znsk8400bnga30v0m7j2mmvz9ldwjinxv1d3n11xc"))))
(build-system node-build-system)
- (arguments '(#:tests? #f)) ; No test suite.
+ (arguments '(#:tests? #f ; No tests.
+ #:phases
+ (modify-phases %standard-phases
+ (delete 'build))))
(home-page "https://github.com/TooTallNate/util-deprecate")
(synopsis "Node.js `util.deprecate()` function with browser support")
(description "This package provides the Node.js @code{util.deprecate()}
@@ -261,7 +288,12 @@ function with browser support.")
"06biknqb05r9xsmcflm3ygh50pjvdk84x6r79w43kmck4fn3qn5p"))))
(build-system node-build-system)
(arguments
- `(#:tests? #f)) ;; FIXME: Tests depend on node-tap
+ '(#:tests? #f
+ #:phases
+ (modify-phases
+ %standard-phases
+ (delete 'configure)
+ (delete 'build)))) ;; FIXME: Tests depend on node-tap
(home-page "https://github.com/npm/node-semver")
(synopsis "Parses semantic versions strings")
(description
diff --git a/guix/build-system/node.scm b/guix/build-system/node.scm
index 05c24c47d5..560f0ee4da 100644
--- a/guix/build-system/node.scm
+++ b/guix/build-system/node.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016 Jelle Licht <jlicht@fsfe.org>
+;;; Copyright © 2019 Timothy Sample <samplet@ngyro.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -17,32 +18,22 @@
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (guix build-system node)
- #:use-module (guix store)
- #:use-module (guix build json)
- #:use-module (guix build union)
- #:use-module (guix utils)
- #:use-module (guix packages)
- #:use-module (guix derivations)
- #:use-module (guix search-paths)
#:use-module (guix build-system)
#:use-module (guix build-system gnu)
+ #:use-module (guix derivations)
+ #:use-module (guix packages)
+ #:use-module (guix search-paths)
+ #:use-module (guix utils)
#:use-module (ice-9 match)
- #:export (npm-meta-uri
- %node-build-system-modules
+ #:export (%node-build-system-modules
node-build
node-build-system))
-(define (npm-meta-uri name)
- "Return a URI string for the metadata of node module NAME found in the npm
-registry."
- (string-append "https://registry.npmjs.org/" name))
-
(define %node-build-system-modules
;; Build-side modules imported by default.
`((guix build node-build-system)
(guix build json)
- (guix build union)
- ,@%gnu-build-system-modules)) ;; TODO: Might be not needed
+ ,@%gnu-build-system-modules))
(define (default-node)
"Return the default Node package."
@@ -78,7 +69,7 @@ registry."
(define* (node-build store name inputs
#:key
- (npm-flags ''())
+ (test-target "test")
(tests? #t)
(phases '(@ (guix build node-build-system)
%standard-phases))
@@ -88,8 +79,6 @@ registry."
(guile #f)
(imported-modules %node-build-system-modules)
(modules '((guix build node-build-system)
- (guix build json)
- (guix build union)
(guix build utils))))
"Build SOURCE using NODE and INPUTS."
(define builder
@@ -99,12 +88,10 @@ registry."
#:source ,(match (assoc-ref inputs "source")
(((? derivation? source))
(derivation->output-path source))
- ((source)
- source)
- (source
- source))
+ ((source) source)
+ (source source))
#:system ,system
- #:npm-flags ,npm-flags
+ #:test-target ,test-target
#:tests? ,tests?
#:phases ,phases
#:outputs %outputs
@@ -131,5 +118,5 @@ registry."
(define node-build-system
(build-system
(name 'node)
- (description "The standard Node build system")
+ (description "The Node build system")
(lower lower)))
diff --git a/guix/build/node-build-system.scm b/guix/build/node-build-system.scm
index 7799f03595..ecba27166b 100644
--- a/guix/build/node-build-system.scm
+++ b/guix/build/node-build-system.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015 David Thompson <davet@gnu.org>
-;;; Copyright © 2016 Jelle Licht <jlicht@fsfe.org>
+;;; Copyright © 2016, 2020 Jelle Licht <jlicht@fsfe.org>
+;;; Copyright © 2019 Timothy Sample <samplet@ngyro.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -19,144 +20,126 @@
(define-module (guix build node-build-system)
#:use-module ((guix build gnu-build-system) #:prefix gnu:)
- #:use-module (guix build json)
- #:use-module (guix build union)
#:use-module (guix build utils)
+ #:use-module (guix build json)
+ #:use-module (ice-9 ftw)
#:use-module (ice-9 match)
- #:use-module (ice-9 popen)
- #:use-module (ice-9 regex)
#:use-module (srfi srfi-1)
- #:use-module (srfi srfi-26)
#:export (%standard-phases
node-build))
;; Commentary:
;;
-;; Builder-side code of the standard Node/npm package build procedure.
+;; Builder-side code of the standard Node/NPM package install procedure.
;;
;; Code:
-(define* (read-package-data #:key (filename "package.json"))
- (call-with-input-file filename
- (lambda (port)
- (read-json port))))
+(define (set-home . _)
+ (with-directory-excursion ".."
+ (let loop ((i 0))
+ (let ((dir (string-append "npm-home-" (number->string i))))
+ (if (directory-exists? dir)
+ (loop (1+ i))
+ (begin
+ (mkdir dir)
+ (setenv "HOME" (string-append (getcwd) "/" dir))
+ (format #t "Set HOME to ~s~%" (getenv "HOME")))))))
+ #t)
-(define* (build #:key inputs #:allow-other-keys)
- (define (build-from-package-json? package-file)
- (let* ((package-data (read-package-data #:filename package-file))
- (scripts (assoc-ref package-data "scripts")))
- (assoc-ref scripts "build")))
- "Build a new node module using the appropriate build system."
- ;; XXX: Develop a more robust heuristic, allow override
- (cond ((file-exists? "gulpfile.js")
- (invoke "gulp"))
- ((file-exists? "gruntfile.js")
- (invoke "grunt"))
- ((file-exists? "Makefile")
- (invoke "make"))
- ((and (file-exists? "package.json")
- (build-from-package-json? "package.json"))
- (invoke "npm" "run" "build")))
+(define (module-name module)
+ (let* ((package.json (string-append module "/package.json"))
+ (package-meta (call-with-input-file package.json read-json)))
+ (assoc-ref package-meta "name")))
+
+(define (index-modules input-paths)
+ (define (list-modules directory)
+ (append-map (lambda (x)
+ (if (string-prefix? "@" x)
+ (list-modules (string-append directory "/" x))
+ (list (string-append directory "/" x))))
+ (filter (lambda (x)
+ (not (member x '("." ".."))))
+ (or (scandir directory) '()))))
+ (let ((index (make-hash-table (* 2 (length input-paths)))))
+ (for-each (lambda (dir)
+ (let ((nm (string-append dir "/lib/node_modules")))
+ (for-each (lambda (module)
+ (hash-set! index (module-name module) module))
+ (list-modules nm))))
+ input-paths)
+ index))
+
+(define* (patch-dependencies #:key inputs #:allow-other-keys)
+
+ (define index (index-modules (map cdr inputs)))
+
+ (define (resolve-dependencies package-meta meta-key)
+ (fold (lambda (key+value acc)
+ (match key+value
+ ('@ acc)
+ ((key . value) (acons key (hash-ref index key value) acc))))
+ '()
+ (or (assoc-ref package-meta meta-key) '())))
+
+ (with-atomic-file-replacement "package.json"
+ (lambda (in out)
+ (let ((package-meta (read-json in)))
+ (assoc-set! package-meta "dependencies"
+ (append
+ '(@)
+ (resolve-dependencies package-meta "dependencies")
+ (resolve-dependencies package-meta "peerDependencies")))
+ (assoc-set! package-meta "devDependencies"
+ (append
+ '(@)
+ (resolve-dependencies package-meta "devDependencies")))
+ (write-json package-meta out))))
#t)
-(define* (link-npm-dependencies #:key inputs #:allow-other-keys)
- (define (inputs->node-inputs inputs)
- "Filter the directory part from INPUTS."
- (filter (lambda (input)
- (match input
- ((name . _) (node-package? name))))
- inputs))
- (define (inputs->directories inputs)
- "Extract the directory part from INPUTS."
- (match inputs
- (((names . directories) ...)
- directories)))
- (define (make-node-path root)
- (string-append root "/lib/node_modules/"))
-
- (let ((input-node-directories (inputs->directories
- (inputs->node-inputs inputs))))
- (union-build "node_modules"
- (map make-node-path input-node-directories))
+(define* (configure #:key outputs inputs #:allow-other-keys)
+ (let ((npm (string-append (assoc-ref inputs "node") "/bin/npm")))
+ (invoke npm "--offline" "--ignore-scripts" "install")
#t))
-(define configure link-npm-dependencies)
+(define* (build #:key inputs #:allow-other-keys)
+ (let ((npm (string-append (assoc-ref inputs "node") "/bin/npm")))
+ (invoke npm "run" "build")
+ #t))
-(define* (check #:key tests? #:allow-other-keys)
+
+(define* (check #:key tests? inputs #:allow-other-keys)
"Run 'npm test' if TESTS?"
(if tests?
- ;; Should only be enabled once we know that there are tests
- (invoke "npm" "test"))
+ (let ((npm (string-append (assoc-ref inputs "node") "/bin/npm")))
+ (invoke npm "test"))
+ (format #t "test suite not run~%"))
#t)
-(define (node-package? name)
- "Check if NAME correspond to the name of an Node package."
- (string-prefix? "node-" name))
+(define* (repack #:key inputs #:allow-other-keys)
+ (invoke "tar" "-czf" "../package.tgz" ".")
+ #t)
(define* (install #:key outputs inputs #:allow-other-keys)
- "Install the node module to the output store item. The module itself is
-installed in a subdirectory of @file{node_modules} and its runtime dependencies
-as defined by @file{package.json} are symlinked into a @file{node_modules}
-subdirectory of the module's directory. Additionally, binaries are installed in
-the @file{bin} directory."
- (let* ((out (assoc-ref outputs "out"))
- (target (string-append out "/lib"))
- (binaries (string-append out "/bin"))
- (data (read-package-data))
- (modulename (assoc-ref data "name"))
- (binary-configuration (match (assoc-ref data "bin")
- (('@ configuration ...) configuration)
- ((? string? configuration) configuration)
- (#f #f)))
- (dependencies (match (assoc-ref data "dependencies")
- (('@ deps ...) deps)
- (#f #f))))
- (mkdir-p target)
- (copy-recursively "." (string-append target "/node_modules/" modulename))
- ;; Remove references to dependencies
- (delete-file-recursively
- (string-append target "/node_modules/" modulename "/node_modules"))
- (cond
- ((string? binary-configuration)
- (begin
- (mkdir-p binaries)
- (symlink (string-append target "/node_modules/" modulename "/"
- binary-configuration)
- (string-append binaries "/" modulename))))
- ((list? binary-configuration)
- (for-each
- (lambda (conf)
- (match conf
- ((key . value)
- (begin
- (mkdir-p (dirname (string-append binaries "/" key)))
- (symlink (string-append target "/node_modules/" modulename "/"
- value)
- (string-append binaries "/" key))))))
- binary-configuration)))
- (when dependencies
- (mkdir-p
- (string-append target "/node_modules/" modulename "/node_modules"))
- (for-each
- (lambda (dependency)
- (let ((dependency (car dependency)))
- (symlink
- (string-append (assoc-ref inputs (string-append "node-" dependency))
- "/lib/node_modules/" dependency)
- (string-append target "/node_modules/" modulename
- "/node_modules/" dependency))))
- dependencies))
+ "Install the node module to the output store item."
+ (let ((out (assoc-ref outputs "out"))
+ (npm (string-append (assoc-ref inputs "node") "/bin/npm")))
+ (invoke npm "--prefix" out
+ "--global"
+ "--offline"
+ "--loglevel" "silly"
+ "--production"
+ "install" "../package.tgz")
#t))
-
(define %standard-phases
(modify-phases gnu:%standard-phases
+ (add-after 'unpack 'set-home set-home)
+ (add-before 'configure 'patch-dependencies patch-dependencies)
(replace 'configure configure)
(replace 'build build)
- (replace 'install install)
- (delete 'check)
- (add-after 'install 'check check)
- (delete 'strip)))
+ (replace 'check check)
+ (add-before 'install 'repack repack)
+ (replace 'install install)))
(define* (node-build #:key inputs (phases %standard-phases)
#:allow-other-keys #:rest args)
--
2.31.0
J
J
Jelle Licht wrote on 20 Mar 2021 15:59
[PATCH 03/13] gnu: node: Use license prefix.
(address . 47282@debbugs.gnu.org)
20210320145925.12500-3-jlicht@fsfe.org
* gnu/packages/node.scm (node)[license]: Use prefix for license.
---
gnu/packages/node.scm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

Toggle diff (24 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index a0df3d2cad..82a2ca7ce0 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -26,7 +26,7 @@
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (gnu packages node)
- #:use-module ((guix licenses) #:select (expat))
+ #:use-module ((guix licenses) #:prefix license:)
#:use-module ((guix build utils) #:select (alist-replace))
#:use-module (guix packages)
#:use-module (guix derivations)
@@ -207,7 +207,7 @@ event-driven, non-blocking I/O model that makes it lightweight and efficient,
perfect for data-intensive real-time applications that run across distributed
devices.")
(home-page "https://nodejs.org/")
- (license expat)
+ (license license:expat)
(properties '((max-silent-time . 7200) ;2h, needed on ARM
(timeout . 21600))))) ;6h
--
2.31.0
J
J
Jelle Licht wrote on 20 Mar 2021 15:59
[PATCH 04/13] gnu: node: Add node-bootstrap.
(address . 47282@debbugs.gnu.org)
20210320145925.12500-4-jlicht@fsfe.org
* gnu/packages/node (node-bootstrap): Add hidden alias for node.
---
gnu/packages/node.scm | 5 +++++
1 file changed, 5 insertions(+)

Toggle diff (18 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 82a2ca7ce0..9baf3719d7 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -211,6 +211,11 @@ devices.")
(properties '((max-silent-time . 7200) ;2h, needed on ARM
(timeout . 21600))))) ;6h
+;; This should be the latest version of node that still builds without
+;; depending on lltthp.
+(define-public node-bootstrap
+ (hidden-package node))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
J
J
Jelle Licht wrote on 20 Mar 2021 15:59
[PATCH 05/13] gnu: node: Add node-semver-bootstrap.
(address . 47282@debbugs.gnu.org)
20210320145925.12500-5-jlicht@fsfe.org
* gnu/packages/node.scm (node-semver-bootstrap): New package.
---
gnu/packages/node.scm | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)

Toggle diff (52 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 9baf3719d7..f332d33536 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -41,6 +41,7 @@
#:use-module (gnu packages icu4c)
#:use-module (gnu packages libevent)
#:use-module (gnu packages linux)
+ #:use-module (gnu packages node-xyz)
#:use-module (gnu packages perl)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages python)
@@ -216,6 +217,37 @@ devices.")
(define-public node-bootstrap
(hidden-package node))
+;; Duplicate of node-semver
+(define-public node-semver-bootstrap
+ (package
+ (name "node-semver")
+ (version "7.2.1")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/npm/node-semver")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "06biknqb05r9xsmcflm3ygh50pjvdk84x6r79w43kmck4fn3qn5p"))))
+ (build-system node-build-system)
+ (arguments
+ `(#:node ,node-bootstrap
+ #:tests? #f
+ #:phases
+ (modify-phases
+ %standard-phases
+ (delete 'configure)
+ (delete 'build))))
+ (home-page "https://github.com/npm/node-semver")
+ (properties '((hidden? . #t)))
+ (synopsis "Parses semantic versions strings")
+ (description
+ "@code{node-semver} is a JavaScript implementation of the
+@uref{https://semver.org/, SemVer.org} specification.")
+ (license license:isc)))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
J
J
Jelle Licht wrote on 20 Mar 2021 15:59
[PATCH 06/13] gnu: node: Add node-ms-bootstrap.
(address . 47282@debbugs.gnu.org)
20210320145925.12500-6-jlicht@fsfe.org
* gnu/packages/node.scm (node-ms-bootstrap): New package.
---
gnu/packages/node.scm | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)

Toggle diff (55 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index f332d33536..6cc8a2d0d1 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -31,8 +31,10 @@
#:use-module (guix packages)
#:use-module (guix derivations)
#:use-module (guix download)
+ #:use-module (guix git-download)
#:use-module (guix utils)
#:use-module (guix build-system gnu)
+ #:use-module (guix build-system node)
#:use-module (gnu packages)
#:use-module (gnu packages adns)
#:use-module (gnu packages base)
@@ -248,6 +250,37 @@ devices.")
@uref{https://semver.org/, SemVer.org} specification.")
(license license:isc)))
+(define-public node-ms-bootstrap
+ (package
+ (name "node-ms")
+ (version "2.1.2")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/vercel/ms.git")
+ (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1pjxzbi4j8pinlsc7yxvfrh0b47kb2dc4lfc2rjq4wx5bdwl33fj"))))
+ (build-system node-build-system)
+ (arguments
+ `(#:node ,node-bootstrap
+ #:tests? #f
+ #:phases
+ (modify-phases
+ %standard-phases
+ (delete 'configure)
+ (delete 'build))))
+ (home-page "https://github.com/zeit/ms#readme")
+ (properties '((hidden? . #t)))
+ (synopsis "Tiny millisecond conversion utility")
+ (description
+ "Use this package to easily convert various time formats to
+milliseconds.")
+ (license license:expat)))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
J
J
Jelle Licht wrote on 20 Mar 2021 15:59
[PATCH 07/13] gnu: node: Add node-binary-search-bootstrap.
(address . 47282@debbugs.gnu.org)
20210320145925.12500-7-jlicht@fsfe.org
* gnu/packages/node.scm (node-binary-search-bootstrap): New package.
---
gnu/packages/node.scm | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)

Toggle diff (45 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 6cc8a2d0d1..b7937b29f4 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -281,6 +281,38 @@ devices.")
milliseconds.")
(license license:expat)))
+(define-public node-binary-search-bootstrap
+ (package
+ (name "node-binary-search")
+ (version "1.3.6")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/darkskyapp/binary-search.git")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1xr2msdc143cd3xwgq7n3rhzy7j8wrnaidxl0r6l6b6g3mpbpjig"))))
+ (build-system node-build-system)
+ (arguments
+ `(#:node ,node-bootstrap
+ #:tests? #f
+ #:phases
+ (modify-phases
+ %standard-phases
+ (delete 'configure)
+ (delete 'build))))
+ (home-page
+ "https://github.com/darkskyapp/binary-search#readme")
+ (properties '((hidden? . #t)))
+ (synopsis
+ "Tiny binary search function with comparators")
+ (description
+ "This package is a binary search function for @code{Node.js}.")
+ (license license:cc0)))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
J
J
Jelle Licht wrote on 20 Mar 2021 15:59
[PATCH 08/13] gnu: node: Add node-debug-bootstrap.
(address . 47282@debbugs.gnu.org)
20210320145925.12500-8-jlicht@fsfe.org
* gnu/packages/node.scm (node-debug-bootstrap): New package.
---
gnu/packages/node.scm | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)

Toggle diff (46 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index b7937b29f4..58e3fd1acc 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -313,6 +313,39 @@ milliseconds.")
"This package is a binary search function for @code{Node.js}.")
(license license:cc0)))
+(define-public node-debug-bootstrap
+ (package
+ (name "node-debug")
+ (version "4.3.0")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/visionmedia/debug.git")
+ (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "08g52r1d4yqcsfdfb7n5if33d4cghaq75gx5n9hj6m6fd8jfp2pi"))))
+ (build-system node-build-system)
+ (arguments
+ `(#:node ,node-bootstrap
+ #:tests? #f
+ #:phases
+ (modify-phases
+ %standard-phases
+ (delete 'configure)
+ (delete 'build))))
+ (inputs `(("node-ms" ,node-ms-bootstrap)))
+ (home-page
+ "https://github.com/visionmedia/debug#readme")
+ (properties '((hidden? . #t)))
+ (synopsis "Small debugging utility")
+ (description "This packages contains a tiny JavaScript debugging utility
+modelled after @code{Node.js} core's debugging technique. It works in
+@code{Node.js} and web browsers.")
+ (license license:expat)))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
J
J
Jelle Licht wrote on 20 Mar 2021 15:59
[PATCH 09/13] gnu: node: Add node-llparse-builder-bootstrap.
(address . 47282@debbugs.gnu.org)
20210320145925.12500-9-jlicht@fsfe.org
* gnu/packages/node.scm (node-llparse-builder-bootstrap): New package.
---
gnu/packages/node.scm | 71 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 71 insertions(+)

Toggle diff (84 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 58e3fd1acc..85e57f5f2d 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -346,6 +346,77 @@ modelled after @code{Node.js} core's debugging technique. It works in
@code{Node.js} and web browsers.")
(license license:expat)))
+(define-public node-llparse-builder-bootstrap
+ (package
+ (name "node-llparse-builder")
+ (version "1.5.2")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/indutny/llparse-builder.git")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0r82iiwqsb73k2fxw7842rjjiixllxpyc6yl9cq4ma6ybkf6xmzm"))
+ (modules '((guix build utils)))
+ (snippet
+ '(begin
+ ;; FIXME: Unneeded runtime dependency
+ ;; https://github.com/indutny/llparse-builder/pull/2
+ (substitute* "package.json"
+ (("\"@types/debug.*,") ""))
+ ;; Fix incorrect import semantics
+ ;; https://github.com/evanw/esbuild/issues/477
+ (substitute* (list
+ "src/node/invoke.ts"
+ "src/node/base.ts"
+ "src/node/consume.ts"
+ "src/node/match.ts"
+ "src/node/error.ts"
+ "src/node/pause.ts"
+ "src/edge.ts"
+ "src/utils.ts"
+ "src/loop-checker/index.ts"
+ "src/loop-checker/lattice.ts"
+ "src/code/field.ts"
+ "src/span-allocator.ts")
+ (("\\* as assert") "assert")
+ (("\\* as debugAPI") "debugAPI"))
+ #t))))
+ (build-system node-build-system)
+ (arguments
+ `(#:node ,node-bootstrap
+ #:tests? #f
+ #:phases
+ (modify-phases
+ %standard-phases
+ (delete 'configure)
+ (replace 'build
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((esbuild (string-append
+ (assoc-ref inputs "esbuild")
+ "/bin/esbuild")))
+ (invoke esbuild
+ "--platform=node"
+ "--outfile=lib/builder.js"
+ "--bundle"
+ "src/builder.ts")))))))
+ (inputs
+ `(("node-binary-search" ,node-binary-search-bootstrap)
+ ("node-debug" ,node-debug-bootstrap)))
+ (native-inputs
+ `(("esbuild" ,esbuild)))
+ (home-page
+ "https://github.com/indutny/llparse-builder#readme")
+ (properties '((hidden? . #t)))
+ (synopsis
+ "Graph builder for consumption by @code{llparse}")
+ (description
+ "This package builds graphs for consumption by @code{llparse}.")
+ (license license:expat)))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
J
J
Jelle Licht wrote on 20 Mar 2021 15:59
[PATCH 10/13] gnu: node: Add node-llparse-frontend-bootstrap.
(address . 47282@debbugs.gnu.org)
20210320145925.12500-10-jlicht@fsfe.org
* gnu/packages/node.scm (node-llparse-frontend-bootstrap): New package.
---
gnu/packages/node.scm | 60 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 60 insertions(+)

Toggle diff (73 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 85e57f5f2d..41c50e209e 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -417,6 +417,66 @@ modelled after @code{Node.js} core's debugging technique. It works in
"This package builds graphs for consumption by @code{llparse}.")
(license license:expat)))
+(define-public node-llparse-frontend-bootstrap
+ (package
+ (name "node-llparse-frontend")
+ (version "3.0.0")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/indutny/llparse-frontend.git")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "1rm9g4ifyip30svm5cgnf0gx7d45jgh4mpf2hkd092xhngmfvicc"))
+ (modules '((guix build utils)))
+ (snippet
+ '(begin
+ ;; Fix incorrect import semantics
+ ;; https://github.com/evanw/esbuild/issues/477
+ (substitute* (list "src/frontend.ts"
+ "src/code/field-value.ts"
+ "src/container/index.ts"
+ "src/container/wrap.ts"
+ "src/node/sequence.ts"
+ "src/node/single.ts"
+ "src/node/table-lookup.ts"
+ "src/trie/index.ts")
+ (("\\* as assert") "assert")
+ (("\\* as debugAPI") "debugAPI"))
+ #t))))
+ (build-system node-build-system)
+ (arguments
+ `(#:node ,node-bootstrap
+ #:tests? #f
+ #:phases
+ (modify-phases
+ %standard-phases
+ (delete 'configure)
+ (replace 'build
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((esbuild (string-append
+ (assoc-ref inputs "esbuild")
+ "/bin/esbuild")))
+ (invoke esbuild
+ "--platform=node"
+ "--outfile=lib/frontend.js"
+ "--bundle"
+ "src/frontend.ts")))))))
+ (inputs
+ `(("node-debug" ,node-debug-bootstrap)
+ ("node-llparse-builder" ,node-llparse-builder-bootstrap)))
+ (native-inputs
+ `(("esbuild" ,esbuild)))
+ (home-page
+ "https://github.com/indutny/llparse-frontend#readme")
+ (properties '((hidden? . #t)))
+ (synopsis "Frontend for @code{llparse} compiler")
+ (description "This package is a frontend for the @code{llparse}
+compiler.")
+ (license license:expat)))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
J
J
Jelle Licht wrote on 20 Mar 2021 15:59
[PATCH 11/13] gnu: node: Add node-llparse-bootstrap.
(address . 47282@debbugs.gnu.org)
20210320145925.12500-11-jlicht@fsfe.org
* gnu/packages/node.scm (node-llparse-bootstrap): New package.
---
gnu/packages/node.scm | 62 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 62 insertions(+)

Toggle diff (75 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 41c50e209e..380e959a58 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -477,6 +477,68 @@ modelled after @code{Node.js} core's debugging technique. It works in
compiler.")
(license license:expat)))
+(define-public node-llparse-bootstrap
+ (package
+ (name "node-llparse")
+ (version "7.1.0")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/indutny/llparse.git")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "10da273iy2if88hp79cwms6c8qpsl1fkgzll6gmqyx5yxv5mkyp6"))
+ (modules '((guix build utils)))
+ (snippet
+ '(begin
+ ;; Fix incorrect import semantics
+ ;; https://github.com/evanw/esbuild/issues/477
+ (substitute* (list "src/compiler/index.ts"
+ "src/implementation/c/node/base.ts"
+ "src/implementation/c/node/table-lookup.ts"
+ "src/implementation/c/compilation.ts"
+ "src/implementation/c/helpers/match-sequence.ts"
+ "src/implementation/c/code/mul-add.ts")
+ (("\\* as assert") "assert")
+ (("\\* as debugAPI") "debugAPI"))
+ #t))))
+ (build-system node-build-system)
+ (arguments
+ `(#:node ,node-bootstrap
+ #:tests? #f
+ #:phases
+ (modify-phases
+ %standard-phases
+ (delete 'configure)
+ (replace 'build
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((esbuild (string-append
+ (assoc-ref inputs "esbuild")
+ "/bin/esbuild")))
+ (invoke esbuild
+ "--platform=node"
+ "--outfile=lib/api.js"
+ "--bundle"
+ "src/api.ts")))))))
+ (inputs
+ `(("node-debug" ,node-debug-bootstrap)
+ ("node-llparse-frontend"
+ ,node-llparse-frontend-bootstrap)))
+ (native-inputs
+ `(("esbuild" ,esbuild)))
+ (home-page
+ "https://github.com/nodejs/llparse#readme")
+ (properties '((hidden? . #t)))
+ (synopsis
+ "Compile incremental parsers to C code")
+ (description
+ "This package offers an API for compiling an incremental parser
+definition into a C output.")
+ (license license:expat)))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
J
J
Jelle Licht wrote on 20 Mar 2021 15:59
[PATCH 12/13] gnu: node: Add llhttp-bootstrap.
(address . 47282@debbugs.gnu.org)
20210320145925.12500-12-jlicht@fsfe.org
* gnu/packages/node.scm (llhttp-bootstrap): New package.
---
gnu/packages/node.scm | 67 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 67 insertions(+)

Toggle diff (80 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 380e959a58..d44bec7ca4 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -539,6 +539,73 @@ compiler.")
definition into a C output.")
(license license:expat)))
+(define-public llhttp-bootstrap
+ (package
+ (name "llhttp")
+ (version "2.1.0")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/nodejs/llhttp.git")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "08ylnirqrk63h0ww1m79p0bh6rwayrhd4v28p353qlp3qcffwwb0"))
+ (modules '((guix build utils)))
+ (snippet
+ '(begin
+ ;; Fix incorrect import semantics
+ ;; https://github.com/evanw/esbuild/issues/477
+ (substitute* "src/llhttp/http.ts"
+ (("\\* as assert")
+ "assert"))
+ (substitute* "Makefile"
+ (("npx ts-node bin/generate.ts")
+ "node bin/generate.js"))
+ #t))))
+ (build-system gnu-build-system)
+ (arguments
+ `(#:tests? #f ; no tests
+ #:make-flags (list "CLANG=gcc"
+ (string-append "DESTDIR=" (assoc-ref %outputs "out"))
+ "PREFIX=")
+ #:phases (modify-phases %standard-phases
+ (replace 'configure
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((esbuild (string-append
+ (assoc-ref inputs "esbuild")
+ "/bin/esbuild")))
+ (invoke esbuild
+ "--platform=node"
+ "--outfile=bin/generate.js"
+ "--bundle" "bin/generate.ts"))))
+ (add-before 'install 'create-install-directories
+ (lambda* (#:key outputs #:allow-other-keys)
+ (let ((out (assoc-ref outputs "out")))
+ (for-each (lambda (dir)
+ (mkdir-p (string-append out dir)))
+ (list "/lib" "/include" "/src"))
+ #t)))
+ (add-after 'install 'install-src
+ (lambda* (#:key outputs #:allow-other-keys)
+ (let* ((out (assoc-ref outputs "out"))
+ (src-dir (string-append out "/src")))
+ (install-file "build/c/llhttp.c" src-dir)
+ #t))))))
+ (native-inputs
+ `(("esbuild" ,esbuild)
+ ("node" ,node-bootstrap)
+ ("node-semver" ,node-semver-bootstrap)
+ ("node-llparse-bootstrap" ,node-llparse-bootstrap)))
+ (home-page "https://github.com/nodejs/llhttp")
+ (properties '((hidden? . #t)))
+ (synopsis "Port of @code{http_parser} to @code{llparse}")
+ (description "@code{llhttp} is a port of @code{http_parser} to TypeScript.
+@code{llparse} is used to generate the output C source file, which can be
+compiled and linked with the embedder's program (like @code{Node.js}).")
+ (license license:expat)))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
J
J
Jelle Licht wrote on 20 Mar 2021 15:59
[PATCH 13/13] gnu: node: Add node-lts
(address . 47282@debbugs.gnu.org)
20210320145925.12500-13-jlicht@fsfe.org
* gnu/packages/node.scm (node-lts): New package.

wip
---
gnu/packages/node.scm | 156 ++++++++++++++++++++++++++++++++++++-
guix/build-system/node.scm | 2 +-
2 files changed, 153 insertions(+), 5 deletions(-)

Toggle diff (216 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index d44bec7ca4..2a7e9ca2fa 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -542,7 +542,7 @@ definition into a C output.")
(define-public llhttp-bootstrap
(package
(name "llhttp")
- (version "2.1.0")
+ (version "2.2.1")
(source (origin
(method git-fetch)
(uri (git-reference
@@ -551,7 +551,7 @@ definition into a C output.")
(file-name (git-file-name name version))
(sha256
(base32
- "08ylnirqrk63h0ww1m79p0bh6rwayrhd4v28p353qlp3qcffwwb0"))
+ "093ag8w0y8irsy0ph7sk06rrs03ic3is41wgxjkgwvc2qys9iqdr"))
(modules '((guix build utils)))
(snippet
'(begin
@@ -566,7 +566,7 @@ definition into a C output.")
#t))))
(build-system gnu-build-system)
(arguments
- `(#:tests? #f ; no tests
+ `(#:tests? #f ; no tests
#:make-flags (list "CLANG=gcc"
(string-append "DESTDIR=" (assoc-ref %outputs "out"))
"PREFIX=")
@@ -592,6 +592,8 @@ definition into a C output.")
(let* ((out (assoc-ref outputs "out"))
(src-dir (string-append out "/src")))
(install-file "build/c/llhttp.c" src-dir)
+ (install-file "src/native/api.c" src-dir)
+ (install-file "src/native/http.c" src-dir)
#t))))))
(native-inputs
`(("esbuild" ,esbuild)
@@ -599,13 +601,159 @@ definition into a C output.")
("node-semver" ,node-semver-bootstrap)
("node-llparse-bootstrap" ,node-llparse-bootstrap)))
(home-page "https://github.com/nodejs/llhttp")
- (properties '((hidden? . #t)))
+ ;; (properties '((hidden? . #t)))
(synopsis "Port of @code{http_parser} to @code{llparse}")
(description "@code{llhttp} is a port of @code{http_parser} to TypeScript.
@code{llparse} is used to generate the output C source file, which can be
compiled and linked with the embedder's program (like @code{Node.js}).")
(license license:expat)))
+(define-public node-lts
+ (package
+ (inherit node)
+ (version "14.16.0")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "https://nodejs.org/dist/v" version
+ "/node-v" version ".tar.xz"))
+ (sha256
+ (base32
+ "19nz2mhmn6ikahxqyna1dn25pb5v3z9vsz9zb2flb6zp2yk4hxjf"))
+ (modules '((guix build utils)))
+ (snippet
+ `(begin
+ ;; Remove bundled software, where possible
+ (for-each delete-file-recursively
+ '("deps/cares"
+ "deps/icu-small"
+ "deps/nghttp2"
+ "deps/openssl"
+ "deps/zlib"))
+ (substitute* "Makefile"
+ ;; Remove references to bundled software.
+ (("deps/uv/uv.gyp") "")
+ (("deps/zlib/zlib.gyp") ""))
+ #t))))
+ (arguments
+ (substitute-keyword-arguments (package-arguments node)
+ ((#:configure-flags configure-flags)
+ ''("--shared-cares"
+ "--shared-libuv"
+ "--shared-nghttp2"
+ "--shared-openssl"
+ "--shared-zlib"
+ "--shared-brotli"
+ "--with-intl=system-icu"))
+ ((#:phases phases)
+ `(modify-phases ,phases
+ (replace 'configure
+ ;; Node's configure script is actually a python script, so we can't
+ ;; run it with bash.
+ (lambda* (#:key outputs (configure-flags '()) inputs
+ #:allow-other-keys)
+ (let* ((prefix (assoc-ref outputs "out"))
+ (flags (cons (string-append "--prefix=" prefix)
+ configure-flags)))
+ (format #t "build directory: ~s~%" (getcwd))
+ (format #t "configure flags: ~s~%" flags)
+ ;; Node's configure script expects the CC environment variable to
+ ;; be set.
+ (setenv "CC" (string-append (assoc-ref inputs "gcc") "/bin/gcc"))
+ (apply invoke
+ (string-append (assoc-ref inputs "python")
+ "/bin/python3")
+ "configure" flags))))
+ (replace 'patch-files
+ (lambda* (#:key inputs #:allow-other-keys)
+ ;; Fix hardcoded /bin/sh references.
+ (substitute* '("lib/child_process.js"
+ "lib/internal/v8_prof_polyfill.js"
+ "test/parallel/test-child-process-spawnsync-shell.js"
+ "test/parallel/test-stdio-closed.js"
+ "test/sequential/test-child-process-emfile.js")
+ (("'/bin/sh'")
+ (string-append "'" (which "sh") "'")))
+
+ ;; Fix hardcoded /usr/bin/env references.
+ (substitute* '("test/parallel/test-child-process-default-options.js"
+ "test/parallel/test-child-process-env.js"
+ "test/parallel/test-child-process-exec-env.js")
+ (("'/usr/bin/env'")
+ (string-append "'" (which "env") "'")))
+ ;; Because we have a custom version of llhttp, we should expect a superset of supported http methods.
+ (substitute* '("test/parallel/test-http-methods.js")
+ (("assert\\.deepStrictEqual\\(http\\.METHODS, methods\\.sort\\(\\)\\);")
+ "methods.every(v => assert(http.METHODS.includes(v)));"))
+
+ ;; FIXME: These tests fail in the build container, but they don't
+ ;; seem to be indicative of real problems in practice.
+ (for-each delete-file
+ '("test/parallel/test-cluster-master-error.js"
+ "test/parallel/test-cluster-master-kill.js"))
+
+ ;; This requires a DNS resolver.
+ (for-each delete-file
+ '("test/parallel/test-dns.js"
+ "test/parallel/test-dns-lookupService-promises.js"))
+
+ ;; TODO: why does this fail. It seems to _almost_ pass, but it parses 1 byte?
+ (delete-file "test/parallel/test-http-server-destroy-socket-on-client-error.js")
+
+ ;; TODO: this seems to fail because of spawning processes?
+ (delete-file "test/parallel/test-fs-write-sigxfsz.js")
+
+ ;; FIXME: This test fails randomly:
+ ;; https://github.com/nodejs/node/issues/31213
+ (delete-file "test/parallel/test-net-listen-after-destroying-stdin.js")
+
+ ;; FIXME: These tests fail on armhf-linux:
+ ;; https://github.com/nodejs/node/issues/31970
+ ,@(if (string-prefix? "arm" (%current-system))
+ '((for-each delete-file
+ '("test/parallel/test-zlib.js"
+ "test/parallel/test-zlib-brotli.js"
+ "test/parallel/test-zlib-brotli-flush.js"
+ "test/parallel/test-zlib-brotli-from-brotli.js"
+ "test/parallel/test-zlib-brotli-from-string.js"
+ "test/parallel/test-zlib-convenience-methods.js"
+ "test/parallel/test-zlib-random-byte-pipes.js"
+ "test/parallel/test-zlib-write-after-flush.js")))
+ '())
+
+ ;; These tests have an expiry date: they depend on the validity of
+ ;; TLS certificates that are bundled with the source. We want this
+ ;; package to be reproducible forever, so remove those.
+ ;; TODO: Regenerate certs instead.
+ (for-each delete-file
+ '("test/parallel/test-tls-passphrase.js"
+ "test/parallel/test-tls-server-verify.js"))
+
+ ;; Replace pre-generated llhttp sources
+ (let ((llhttp (assoc-ref inputs "llhttp"))
+ ;; (llhttp-src (assoc-ref inputs "llhttp-sources"))
+ )
+ (copy-file (string-append llhttp "/src/llhttp.c")
+ "deps/llhttp/src/llhttp.c")
+ (copy-file (string-append llhttp "/src/api.c")
+ "deps/llhttp/src/api.c")
+ (copy-file (string-append llhttp "/src/http.c")
+ "deps/llhttp/src/http.c")
+ (copy-file (string-append llhttp "/include/llhttp.h")
+ "deps/llhttp/include/llhttp.h"))
+ #t))))))
+ (inputs
+ `(("c-ares" ,c-ares)
+ ("icu4c" ,icu4c-67)
+ ("libuv" ,libuv-node)
+ ("llhttp" ,llhttp-bootstrap)
+ ("google-brotli" ,google-brotli)
+ ("nghttp2" ,nghttp2 "lib")
+ ("openssl" ,openssl)
+ ("zlib" ,zlib)))
+ (native-inputs
+ (alist-replace "python" (list python-3)
+ (package-native-inputs node)))))
+
(define-public libnode
(package/inherit node
(name "libnode")
diff --git a/guix/build-system/node.scm b/guix/build-system/node.scm
index 560f0ee4da..5737c8ea6e 100644
--- a/guix/build-system/node.scm
+++ b/guix/build-system/node.scm
@@ -39,7 +39,7 @@
"Return the default Node package."
;; Lazily resolve the binding to avoid a circular dependency.
(let ((node (resolve-interface '(gnu packages node))))
- (module-ref node 'node)))
+ (module-ref node 'node-lts)))
(define* (lower name
#:key source inputs native-inputs outputs system target
--
2.31.0
L
L
Lars-Dominik Braun wrote on 23 Mar 2021 10:05
Re: [bug#47282] [PATCH 00/13] node going forward
(name . Jelle Licht)(address . jlicht@fsfe.org)(address . 47282@debbugs.gnu.org)
20210323090557.GA3185@zpidnp36
Hi,

Toggle quote (1 lines)
> So, some people seem to be interested in this one; please review and test.
that would be me :)

The first patch currently does not apply cleanly to master, but it’s an easy
merge.

There is a stray “wip” in the commit message of the last patch.

I imported (using the “binary” importer from wip-node-14 and some private
fixes) and built more than 18000 NPM packages with this patchset and the
resulting RStudio is working fine, so this is a welcome improvement for
guix-science.

Cheers,
Lars

--
Lars-Dominik Braun
Wissenschaftlicher Mitarbeiter/Research Associate

www.leibniz-psychology.org
ZPID - Leibniz-Institut für Psychologie /
ZPID - Leibniz Institute for Psychology
Universitätsring 15
D-54296 Trier - Germany
Tel.: +49–651–201-4964
-----BEGIN PGP SIGNATURE-----

iQGzBAABCgAdFiEEyk+M9DfXR4/aBV/UQhN3ARo3hEYFAmBZr3AACgkQQhN3ARo3
hEayzAwA1V7nNhdTzxUvjySmEX0wxqdc/buzY9tWSykd9k1zDUQQ3olDrbLZ+Hhk
JoytN+7PZKtiYNR1nD7woqLdLthjpOqHB8fmT2+LiTeOpIxRrXG3TpRRclWULxkB
ZLkyG55mwZ0Brb4ys6vYSZdHJf20+TvWLp01MnEJM/bk4RsaN22pid9hjbrH+ply
9Sef0a5be0/a7swlormlaD1/Tux6rydkZ4N6y801SGvRMxXVbrQYIRL6z4WD2gnO
zeQn5GWqjY+4Zf4Nuh5pdVcHQK6IMF6AEvTAnPfR/XtV5syFN1XaY6HY7zuGiVAY
CpD1tN3mZMIndgiIxxVKCwjTMDu/CS2bOXVwFfeZy3Ep4DPHHcv0JIG48aflt1Vq
7yCkZDw+OKsJudx1vVAVEn00kpnfMrzinQHOORG7s/OZ1IA5E9SRMoD41bD1Gmzb
aiyYSfGdoh9bjyA1QnvYPFs8QWHtlCheBfA4qVrJdNOOIZ44iV840js6mYJpyq3k
nIPt3S7c
=YHmn
-----END PGP SIGNATURE-----


L
L
Léo Le Bouter wrote on 25 Mar 2021 16:51
(address . 47282@debbugs.gnu.org)
418b981098dc0d8e48ec82745e0269b1e19dfe1b.camel@zaclys.net
On Tue, 2021-03-23 at 10:05 +0100, Lars-Dominik Braun wrote:
Toggle quote (8 lines)
> I imported (using the “binary” importer from wip-node-14 and some
> private
> fixes) and built more than 18000 NPM packages with this patchset and
> the
> resulting RStudio is working fine, so this is a welcome improvement
> for
> guix-science.

There's somewhere with 18000+ GNU Guix package definitions for NPM
packages? Please share where.

Thank you
-----BEGIN PGP SIGNATURE-----

iQIzBAABCgAdFiEEFIvLi9gL+xax3g6RRaix6GvNEKYFAmBcsZYACgkQRaix6GvN
EKZ3nQ/+M3wzF1O6TWTpmA1nKKg1j1+lkNlTdapUsBv3vyeyFPoP4YN7Sc+dKLL6
LEzikU8PHYF2FEUPaXEILQoF7oPoOIVzfgGwxzOByKq95Ag44t/uwswi/e9tWrPk
WTTGHIm0CkS4qfbYBNRW8Gk/cwFqpmyNU/PGIh3k/X0YGRPz2N+CoxGMTXS+W72M
u5QbAaY+tUHdmh5AsAWaNqJQaqipUtkNihALpJVlh15mjyn6MsdqIISd+FLil0mb
dt7VLrV9hg6wFSq2X/GgNwzD5UIAo+SAoGltf6vC/Xm1bBGAk0TlvXpYmK6pJ/hk
PERxnkm/J4H6jxuzweV/LjSUs9SQYm7PYUn30v80nhfLr/tzOJd/L3Ut+ub2nzSq
pdUd48OmRi8jVkSWsWs55GSeHcRZ8ZTHRY0fQA4hC/iy1KvWEKDe0FGv5uDQC/xQ
DQQ4Dufory+Z1cV4Nh1n+2wv0A+RiGmJ6Snnd3rqYC0ZDZKuTp24KtA9m3HqF/b3
D7S7i8N2hfFGqbp9W44KhJoTjcrBYutu3gjHdIv8Ew2c/zUXG1lPI1YQQ+IUupoI
J8nY4n9It+LnpsAP3Y6xwDWTilVNGovWS2oAPCKVU9WFvl4aTFnky5IuaPucVMtK
NR9AGM6lpy4tQzmnmvGtMBCfPighZEPtz+JzG2z0GhWW15OW8lE=
=KNH3
-----END PGP SIGNATURE-----


L
L
Lars-Dominik Braun wrote on 25 Mar 2021 17:14
(name . Léo Le Bouter)(address . lle-bout@zaclys.net)
YFy2+PZX4V1ngLgK@noor.fritz.box
Hi Léo,

Toggle quote (2 lines)
> There's somewhere with 18000+ GNU Guix package definitions for NPM
> packages? Please share where.
sorry, the number is completely wrong, no idea why. It’s “just” 473
packages, which is still an insane amount. They’re part of my efforts to
build RStudio 1.4, see

Lars
T
T
Timothy Sample wrote on 30 Mar 2021 07:24
Re: bug#47282: [PATCH 00/13] node going forward
(name . Jelle Licht)(address . jlicht@fsfe.org)(address . 47282@debbugs.gnu.org)
87k0pprz6n.fsf@ngyro.com
Hi Jelle,

Jelle Licht <jlicht@fsfe.org> writes:

Toggle quote (2 lines)
> So, some people seem to be interested in this one; please review and test.

Now that I’ve finally taken the time to dig into what you’ve done here –
I must say it’s very impressive!

I’ve taken the presumptuous step of re-rolling the series. The reason
is that all the “(delete 'build)” bits were bothering me. I decided to
have the build system check the “package.json” file for a build script
before trying to run it. Since that change required changing all the
other patches, I thought it would be easier to just post the updated
patches. Also, I’m hoping to spare you some trouble (since you’ve
already gone to a lot!).

Of course, this approach gave me free reign to pick nits. :) Below is
a list of bigger things that I changed, but I also adjusted some commit
messages, indentation, descriptions, and other minor things.

• Add the check for a “build” script as explained above, and adjust
the “npm-build-system” packages accordingly.

• Rename “libuv-node” to “libuv-for-node”, as this style is used for
similar packages. I also changed the name to just “libuv” and
marked it hidden.

• Change the “Fix incorrect import semantics” comments to “Fix
imports for esbuild”. To me, if TypeScript’s tsc likes the
imports, they are correct TypeScript (despite the esbuild bug
report).

• Set the llhttp version to 2.1.3, and add a patch to fix
CVE-2020-8287. The resulting C source files are identical to the
ones shipped with Node.js 14.16.0. This makes the tests a little
simpler, allowing the removal of the HTTP method superset change
and fixing the reading one byte failure.

• Fix the SIGXFSZ failure by fixing a “/bin/sh” in the test.

The final result is still a little messy, but I don’t think we should
hold this back any longer. It’s a significant step forward, and it puts
us in better shape to improve things incrementally.

WDYT? Let me know if I made anything worse! :) If the altered patches
look good to you, I suggest you go ahead and push them.


-- Tim
T
T
Timothy Sample wrote on 30 Mar 2021 07:27
[PATCH v2 01/13] build-system: Rewrite node build system.
(address . 47282@debbugs.gnu.org)
20210330052743.575-1-samplet@ngyro.com
From: Jelle Licht <jlicht@fsfe.org>

* guix/build/node-build-system.scm: Rewrite it.
* guix/build-system/node.scm: Adjust accordingly.
* gnu/packages/node-xyz.scm (node-semver): Likewise.

Co-authored-by: Timothy Sample <samplet@ngyro.com>
---
gnu/packages/node-xyz.scm | 6 +-
guix/build-system/node.scm | 27 ++--
guix/build/node-build-system.scm | 207 +++++++++++++++----------------
3 files changed, 110 insertions(+), 130 deletions(-)

Toggle diff (357 lines)
diff --git a/gnu/packages/node-xyz.scm b/gnu/packages/node-xyz.scm
index b1d6d4ce59..60cc005ea4 100644
--- a/gnu/packages/node-xyz.scm
+++ b/gnu/packages/node-xyz.scm
@@ -261,7 +261,11 @@ function with browser support.")
"06biknqb05r9xsmcflm3ygh50pjvdk84x6r79w43kmck4fn3qn5p"))))
(build-system node-build-system)
(arguments
- `(#:tests? #f)) ;; FIXME: Tests depend on node-tap
+ '(#:tests? #f ; FIXME: Tests depend on node-tap
+ #:phases
+ (modify-phases %standard-phases
+ ;; The only dependency to check for is tap, which we don't have.
+ (delete 'configure))))
(home-page "https://github.com/npm/node-semver")
(synopsis "Parses semantic versions strings")
(description
diff --git a/guix/build-system/node.scm b/guix/build-system/node.scm
index a8c5eed09b..4991ed53a5 100644
--- a/guix/build-system/node.scm
+++ b/guix/build-system/node.scm
@@ -1,5 +1,6 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2016 Jelle Licht <jlicht@fsfe.org>
+;;; Copyright © 2019 Timothy Sample <samplet@ngyro.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -17,7 +18,6 @@
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (guix build-system node)
- #:use-module (guix store)
#:use-module (guix utils)
#:use-module (guix packages)
#:use-module (guix derivations)
@@ -25,22 +25,15 @@
#:use-module (guix build-system)
#:use-module (guix build-system gnu)
#:use-module (ice-9 match)
- #:export (npm-meta-uri
- %node-build-system-modules
+ #:export (%node-build-system-modules
node-build
node-build-system))
-(define (npm-meta-uri name)
- "Return a URI string for the metadata of node module NAME found in the npm
-registry."
- (string-append "https://registry.npmjs.org/" name))
-
(define %node-build-system-modules
;; Build-side modules imported by default.
`((guix build node-build-system)
(guix build json)
- (guix build union)
- ,@%gnu-build-system-modules)) ;; TODO: Might be not needed
+ ,@%gnu-build-system-modules))
(define (default-node)
"Return the default Node package."
@@ -76,7 +69,7 @@ registry."
(define* (node-build store name inputs
#:key
- (npm-flags ''())
+ (test-target "test")
(tests? #t)
(phases '(@ (guix build node-build-system)
%standard-phases))
@@ -86,8 +79,6 @@ registry."
(guile #f)
(imported-modules %node-build-system-modules)
(modules '((guix build node-build-system)
- (guix build json)
- (guix build union)
(guix build utils))))
"Build SOURCE using NODE and INPUTS."
(define builder
@@ -97,12 +88,10 @@ registry."
#:source ,(match (assoc-ref inputs "source")
(((? derivation? source))
(derivation->output-path source))
- ((source)
- source)
- (source
- source))
+ ((source) source)
+ (source source))
#:system ,system
- #:npm-flags ,npm-flags
+ #:test-target ,test-target
#:tests? ,tests?
#:phases ,phases
#:outputs %outputs
@@ -129,5 +118,5 @@ registry."
(define node-build-system
(build-system
(name 'node)
- (description "The standard Node build system")
+ (description "The Node build system")
(lower lower)))
diff --git a/guix/build/node-build-system.scm b/guix/build/node-build-system.scm
index 7799f03595..a55cab237c 100644
--- a/guix/build/node-build-system.scm
+++ b/guix/build/node-build-system.scm
@@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015 David Thompson <davet@gnu.org>
-;;; Copyright © 2016 Jelle Licht <jlicht@fsfe.org>
+;;; Copyright © 2016, 2020 Jelle Licht <jlicht@fsfe.org>
+;;; Copyright © 2019, 2021 Timothy Sample <samplet@ngyro.com>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -19,144 +20,130 @@
(define-module (guix build node-build-system)
#:use-module ((guix build gnu-build-system) #:prefix gnu:)
- #:use-module (guix build json)
- #:use-module (guix build union)
#:use-module (guix build utils)
+ #:use-module (guix build json)
+ #:use-module (ice-9 ftw)
#:use-module (ice-9 match)
- #:use-module (ice-9 popen)
- #:use-module (ice-9 regex)
#:use-module (srfi srfi-1)
- #:use-module (srfi srfi-26)
#:export (%standard-phases
node-build))
;; Commentary:
;;
-;; Builder-side code of the standard Node/npm package build procedure.
+;; Builder-side code of the standard Node/NPM package install procedure.
;;
;; Code:
-(define* (read-package-data #:key (filename "package.json"))
- (call-with-input-file filename
- (lambda (port)
- (read-json port))))
+(define (set-home . _)
+ (with-directory-excursion ".."
+ (let loop ((i 0))
+ (let ((dir (string-append "npm-home-" (number->string i))))
+ (if (directory-exists? dir)
+ (loop (1+ i))
+ (begin
+ (mkdir dir)
+ (setenv "HOME" (string-append (getcwd) "/" dir))
+ (format #t "set HOME to ~s~%" (getenv "HOME")))))))
+ #t)
-(define* (build #:key inputs #:allow-other-keys)
- (define (build-from-package-json? package-file)
- (let* ((package-data (read-package-data #:filename package-file))
- (scripts (assoc-ref package-data "scripts")))
- (assoc-ref scripts "build")))
- "Build a new node module using the appropriate build system."
- ;; XXX: Develop a more robust heuristic, allow override
- (cond ((file-exists? "gulpfile.js")
- (invoke "gulp"))
- ((file-exists? "gruntfile.js")
- (invoke "grunt"))
- ((file-exists? "Makefile")
- (invoke "make"))
- ((and (file-exists? "package.json")
- (build-from-package-json? "package.json"))
- (invoke "npm" "run" "build")))
+(define (module-name module)
+ (let* ((package.json (string-append module "/package.json"))
+ (package-meta (call-with-input-file package.json read-json)))
+ (assoc-ref package-meta "name")))
+
+(define (index-modules input-paths)
+ (define (list-modules directory)
+ (append-map (lambda (x)
+ (if (string-prefix? "@" x)
+ (list-modules (string-append directory "/" x))
+ (list (string-append directory "/" x))))
+ (filter (lambda (x)
+ (not (member x '("." ".."))))
+ (or (scandir directory) '()))))
+ (let ((index (make-hash-table (* 2 (length input-paths)))))
+ (for-each (lambda (dir)
+ (let ((nm (string-append dir "/lib/node_modules")))
+ (for-each (lambda (module)
+ (hash-set! index (module-name module) module))
+ (list-modules nm))))
+ input-paths)
+ index))
+
+(define* (patch-dependencies #:key inputs #:allow-other-keys)
+
+ (define index (index-modules (map cdr inputs)))
+
+ (define (resolve-dependencies package-meta meta-key)
+ (fold (lambda (key+value acc)
+ (match key+value
+ ('@ acc)
+ ((key . value) (acons key (hash-ref index key value) acc))))
+ '()
+ (or (assoc-ref package-meta meta-key) '())))
+
+ (with-atomic-file-replacement "package.json"
+ (lambda (in out)
+ (let ((package-meta (read-json in)))
+ (assoc-set! package-meta "dependencies"
+ (append
+ '(@)
+ (resolve-dependencies package-meta "dependencies")
+ (resolve-dependencies package-meta "peerDependencies")))
+ (assoc-set! package-meta "devDependencies"
+ (append
+ '(@)
+ (resolve-dependencies package-meta "devDependencies")))
+ (write-json package-meta out))))
#t)
-(define* (link-npm-dependencies #:key inputs #:allow-other-keys)
- (define (inputs->node-inputs inputs)
- "Filter the directory part from INPUTS."
- (filter (lambda (input)
- (match input
- ((name . _) (node-package? name))))
- inputs))
- (define (inputs->directories inputs)
- "Extract the directory part from INPUTS."
- (match inputs
- (((names . directories) ...)
- directories)))
- (define (make-node-path root)
- (string-append root "/lib/node_modules/"))
-
- (let ((input-node-directories (inputs->directories
- (inputs->node-inputs inputs))))
- (union-build "node_modules"
- (map make-node-path input-node-directories))
+(define* (configure #:key outputs inputs #:allow-other-keys)
+ (let ((npm (string-append (assoc-ref inputs "node") "/bin/npm")))
+ (invoke npm "--offline" "--ignore-scripts" "install")
#t))
-(define configure link-npm-dependencies)
+(define* (build #:key inputs #:allow-other-keys)
+ (let ((package-meta (call-with-input-file "package.json" read-json)))
+ (if (and=> (assoc-ref package-meta "scripts")
+ (lambda (scripts)
+ (assoc-ref scripts "build")))
+ (let ((npm (string-append (assoc-ref inputs "node") "/bin/npm")))
+ (invoke npm "run" "build"))
+ (format #t "there is no build script to run~%"))
+ #t))
-(define* (check #:key tests? #:allow-other-keys)
+(define* (check #:key tests? inputs #:allow-other-keys)
"Run 'npm test' if TESTS?"
(if tests?
- ;; Should only be enabled once we know that there are tests
- (invoke "npm" "test"))
+ (let ((npm (string-append (assoc-ref inputs "node") "/bin/npm")))
+ (invoke npm "test"))
+ (format #t "test suite not run~%"))
#t)
-(define (node-package? name)
- "Check if NAME correspond to the name of an Node package."
- (string-prefix? "node-" name))
+(define* (repack #:key inputs #:allow-other-keys)
+ (invoke "tar" "-czf" "../package.tgz" ".")
+ #t)
(define* (install #:key outputs inputs #:allow-other-keys)
- "Install the node module to the output store item. The module itself is
-installed in a subdirectory of @file{node_modules} and its runtime dependencies
-as defined by @file{package.json} are symlinked into a @file{node_modules}
-subdirectory of the module's directory. Additionally, binaries are installed in
-the @file{bin} directory."
- (let* ((out (assoc-ref outputs "out"))
- (target (string-append out "/lib"))
- (binaries (string-append out "/bin"))
- (data (read-package-data))
- (modulename (assoc-ref data "name"))
- (binary-configuration (match (assoc-ref data "bin")
- (('@ configuration ...) configuration)
- ((? string? configuration) configuration)
- (#f #f)))
- (dependencies (match (assoc-ref data "dependencies")
- (('@ deps ...) deps)
- (#f #f))))
- (mkdir-p target)
- (copy-recursively "." (string-append target "/node_modules/" modulename))
- ;; Remove references to dependencies
- (delete-file-recursively
- (string-append target "/node_modules/" modulename "/node_modules"))
- (cond
- ((string? binary-configuration)
- (begin
- (mkdir-p binaries)
- (symlink (string-append target "/node_modules/" modulename "/"
- binary-configuration)
- (string-append binaries "/" modulename))))
- ((list? binary-configuration)
- (for-each
- (lambda (conf)
- (match conf
- ((key . value)
- (begin
- (mkdir-p (dirname (string-append binaries "/" key)))
- (symlink (string-append target "/node_modules/" modulename "/"
- value)
- (string-append binaries "/" key))))))
- binary-configuration)))
- (when dependencies
- (mkdir-p
- (string-append target "/node_modules/" modulename "/node_modules"))
- (for-each
- (lambda (dependency)
- (let ((dependency (car dependency)))
- (symlink
- (string-append (assoc-ref inputs (string-append "node-" dependency))
- "/lib/node_modules/" dependency)
- (string-append target "/node_modules/" modulename
- "/node_modules/" dependency))))
- dependencies))
+ "Install the node module to the output store item."
+ (let ((out (assoc-ref outputs "out"))
+ (npm (string-append (assoc-ref inputs "node") "/bin/npm")))
+ (invoke npm "--prefix" out
+ "--global"
+ "--offline"
+ "--loglevel" "info"
+ "--production"
+ "install" "../package.tgz")
#t))
-
(define %standard-phases
(modify-phases gnu:%standard-phases
+ (add-after 'unpack 'set-home set-home)
+ (add-before 'configure 'patch-dependencies patch-dependencies)
(replace 'configure configure)
(replace 'build build)
- (replace 'install install)
- (delete 'check)
- (add-after 'install 'check check)
- (delete 'strip)))
+ (replace 'check check)
+ (add-before 'install 'repack repack)
+ (replace 'install install)))
(define* (node-build #:key inputs (phases %standard-phases)
#:allow-other-keys #:rest args)
--
2.31.0
T
T
Timothy Sample wrote on 30 Mar 2021 07:27
[PATCH v2 02/13] gnu: Add libuv-for-node
(address . 47282@debbugs.gnu.org)(name . Jelle Licht)(address . jlicht@fsfe.org)
20210330052743.575-2-samplet@ngyro.com
From: Jelle Licht <jlicht@fsfe.org>

* gnu/packages/libevent.scm (libuv-for-node): New variable.
---
gnu/packages/libevent.scm | 16 ++++++++++++++++
1 file changed, 16 insertions(+)

Toggle diff (29 lines)
diff --git a/gnu/packages/libevent.scm b/gnu/packages/libevent.scm
index 7109d9a88d..0e683570d3 100644
--- a/gnu/packages/libevent.scm
+++ b/gnu/packages/libevent.scm
@@ -134,6 +134,22 @@ resolution, asynchronous file system operations, and threading primitives.")
;; details. Documentation is CC-BY 4.0 as of 1.12.0; see 'LICENSE-docs'.
(license (list expat cc-by4.0))))
+(define-public libuv-for-node
+ ;; When upgrading Node, also upgrade this. Get the version from
+ ;; https://github.com/nodejs/node/blob/master/deps/uv/include/uv/version.h
+ (package
+ (inherit libuv)
+ (name "libuv")
+ (version "1.40.0")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "https://dist.libuv.org/dist/v" version
+ "/libuv-v" version ".tar.gz"))
+ (sha256
+ (base32
+ "1551k3ab27vbg9517l9b4iqbramwxdkwgpf53knas05cbfwhvab1"))))
+ (properties '((hidden? . #t)))))
+
(define-public perl-anyevent
(package
(name "perl-anyevent")
--
2.31.0
T
T
Timothy Sample wrote on 30 Mar 2021 07:27
[PATCH v2 03/13] gnu: node: Use license prefix.
(address . 47282@debbugs.gnu.org)(name . Jelle Licht)(address . jlicht@fsfe.org)
20210330052743.575-3-samplet@ngyro.com
From: Jelle Licht <jlicht@fsfe.org>

* gnu/packages/node.scm (node)[license]: Use prefix for license.
---
gnu/packages/node.scm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

Toggle diff (24 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index a0df3d2cad..82a2ca7ce0 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -26,7 +26,7 @@
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (gnu packages node)
- #:use-module ((guix licenses) #:select (expat))
+ #:use-module ((guix licenses) #:prefix license:)
#:use-module ((guix build utils) #:select (alist-replace))
#:use-module (guix packages)
#:use-module (guix derivations)
@@ -207,7 +207,7 @@ event-driven, non-blocking I/O model that makes it lightweight and efficient,
perfect for data-intensive real-time applications that run across distributed
devices.")
(home-page "https://nodejs.org/")
- (license expat)
+ (license license:expat)
(properties '((max-silent-time . 7200) ;2h, needed on ARM
(timeout . 21600))))) ;6h
--
2.31.0
T
T
Timothy Sample wrote on 30 Mar 2021 07:27
[PATCH v2 04/13] gnu: Add node-bootstrap.
(address . 47282@debbugs.gnu.org)(name . Jelle Licht)(address . jlicht@fsfe.org)
20210330052743.575-4-samplet@ngyro.com
From: Jelle Licht <jlicht@fsfe.org>

* gnu/packages/node (node-bootstrap): Add hidden alias for node.
---
gnu/packages/node.scm | 5 +++++
1 file changed, 5 insertions(+)

Toggle diff (18 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 82a2ca7ce0..73d022d87f 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -211,6 +211,11 @@ devices.")
(properties '((max-silent-time . 7200) ;2h, needed on ARM
(timeout . 21600))))) ;6h
+;; This should be the latest version of node that still builds without
+;; depending on llhttp.
+(define-public node-bootstrap
+ (hidden-package node))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
T
T
Timothy Sample wrote on 30 Mar 2021 07:27
[PATCH v2 05/13] gnu: Add node-semver-bootstrap.
(address . 47282@debbugs.gnu.org)(name . Jelle Licht)(address . jlicht@fsfe.org)
20210330052743.575-5-samplet@ngyro.com
From: Jelle Licht <jlicht@fsfe.org>

* gnu/packages/node.scm (node-semver-bootstrap): New variable.
---
gnu/packages/node.scm | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)

Toggle diff (50 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 73d022d87f..773cef3716 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -41,6 +41,7 @@
#:use-module (gnu packages icu4c)
#:use-module (gnu packages libevent)
#:use-module (gnu packages linux)
+ #:use-module (gnu packages node-xyz)
#:use-module (gnu packages perl)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages python)
@@ -216,6 +217,35 @@ devices.")
(define-public node-bootstrap
(hidden-package node))
+;; Duplicate of node-semver
+(define-public node-semver-bootstrap
+ (package
+ (name "node-semver")
+ (version "7.2.1")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/npm/node-semver")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "06biknqb05r9xsmcflm3ygh50pjvdk84x6r79w43kmck4fn3qn5p"))))
+ (build-system node-build-system)
+ (arguments
+ `(#:node ,node-bootstrap
+ #:tests? #f
+ #:phases
+ (modify-phases %standard-phases
+ (delete 'configure))))
+ (home-page "https://github.com/npm/node-semver")
+ (properties '((hidden? . #t)))
+ (synopsis "Parses semantic versions strings")
+ (description
+ "@code{node-semver} is a JavaScript implementation of the
+@uref{https://semver.org/, SemVer.org} specification.")
+ (license license:isc)))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
T
T
Timothy Sample wrote on 30 Mar 2021 07:27
[PATCH v2 06/13] gnu: Add node-ms-bootstrap.
(address . 47282@debbugs.gnu.org)(name . Jelle Licht)(address . jlicht@fsfe.org)
20210330052743.575-6-samplet@ngyro.com
From: Jelle Licht <jlicht@fsfe.org>

* gnu/packages/node.scm (node-ms-bootstrap): New variable.
---
gnu/packages/node.scm | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)

Toggle diff (52 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 773cef3716..1d17502df7 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -31,8 +31,10 @@
#:use-module (guix packages)
#:use-module (guix derivations)
#:use-module (guix download)
+ #:use-module (guix git-download)
#:use-module (guix utils)
#:use-module (guix build-system gnu)
+ #:use-module (guix build-system node)
#:use-module (gnu packages)
#:use-module (gnu packages adns)
#:use-module (gnu packages base)
@@ -246,6 +248,34 @@ devices.")
@uref{https://semver.org/, SemVer.org} specification.")
(license license:isc)))
+(define-public node-ms-bootstrap
+ (package
+ (name "node-ms")
+ (version "2.1.2")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/vercel/ms.git")
+ (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1pjxzbi4j8pinlsc7yxvfrh0b47kb2dc4lfc2rjq4wx5bdwl33fj"))))
+ (build-system node-build-system)
+ (arguments
+ `(#:node ,node-bootstrap
+ #:tests? #f
+ #:phases
+ (modify-phases %standard-phases
+ (delete 'configure))))
+ (home-page "https://github.com/zeit/ms#readme")
+ (properties '((hidden? . #t)))
+ (synopsis "Tiny millisecond conversion utility")
+ (description "Use this package to easily convert various time
+formats to milliseconds.")
+ (license license:expat)))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
T
T
Timothy Sample wrote on 30 Mar 2021 07:27
[PATCH v2 07/13] gnu: Add node-binary-search-bootstrap.
(address . 47282@debbugs.gnu.org)(name . Jelle Licht)(address . jlicht@fsfe.org)
20210330052743.575-7-samplet@ngyro.com
From: Jelle Licht <jlicht@fsfe.org>

* gnu/packages/node.scm (node-binary-search-bootstrap): New variable.
---
gnu/packages/node.scm | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)

Toggle diff (40 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 1d17502df7..21d6052c06 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -276,6 +276,33 @@ devices.")
formats to milliseconds.")
(license license:expat)))
+(define-public node-binary-search-bootstrap
+ (package
+ (name "node-binary-search")
+ (version "1.3.6")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/darkskyapp/binary-search.git")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1xr2msdc143cd3xwgq7n3rhzy7j8wrnaidxl0r6l6b6g3mpbpjig"))))
+ (build-system node-build-system)
+ (arguments
+ `(#:node ,node-bootstrap
+ #:tests? #f
+ #:phases
+ (modify-phases %standard-phases
+ (delete 'configure))))
+ (home-page "https://github.com/darkskyapp/binary-search#readme")
+ (properties '((hidden? . #t)))
+ (synopsis "Tiny binary search function with comparators")
+ (description "This package is a binary search function for Node.js.")
+ (license license:cc0)))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
T
T
Timothy Sample wrote on 30 Mar 2021 07:27
[PATCH v2 08/13] gnu: Add node-debug-bootstrap.
(address . 47282@debbugs.gnu.org)(name . Jelle Licht)(address . jlicht@fsfe.org)
20210330052743.575-8-samplet@ngyro.com
From: Jelle Licht <jlicht@fsfe.org>

* gnu/packages/node.scm (node-debug-bootstrap): New variable.
---
gnu/packages/node.scm | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)

Toggle diff (43 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 21d6052c06..6c4c02265d 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -303,6 +303,36 @@ formats to milliseconds.")
(description "This package is a binary search function for Node.js.")
(license license:cc0)))
+(define-public node-debug-bootstrap
+ (package
+ (name "node-debug")
+ (version "4.3.0")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/visionmedia/debug.git")
+ (commit version)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "08g52r1d4yqcsfdfb7n5if33d4cghaq75gx5n9hj6m6fd8jfp2pi"))))
+ (build-system node-build-system)
+ (arguments
+ `(#:node ,node-bootstrap
+ #:tests? #f
+ #:phases
+ (modify-phases %standard-phases
+ (delete 'configure))))
+ (inputs `(("node-ms" ,node-ms-bootstrap)))
+ (home-page "https://github.com/visionmedia/debug#readme")
+ (properties '((hidden? . #t)))
+ (synopsis "Small debugging utility")
+ (description "This package contains a tiny JavaScript debugging
+utility modelled after Node.js core's debugging technique. It works in
+Node.js and web browsers.")
+ (license license:expat)))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
T
T
Timothy Sample wrote on 30 Mar 2021 07:27
[PATCH v2 10/13] gnu: Add node-llparse-frontend-bootstrap.
(address . 47282@debbugs.gnu.org)(name . Jelle Licht)(address . jlicht@fsfe.org)
20210330052743.575-10-samplet@ngyro.com
From: Jelle Licht <jlicht@fsfe.org>

* gnu/packages/node.scm (node-llparse-frontend-bootstrap): New variable.
---
gnu/packages/node.scm | 56 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)

Toggle diff (69 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 570d4521ac..16c3decdd4 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -398,6 +398,62 @@ Node.js and web browsers.")
(description "This package builds graphs for consumption by llparse.")
(license license:expat)))
+(define-public node-llparse-frontend-bootstrap
+ (package
+ (name "node-llparse-frontend")
+ (version "3.0.0")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/indutny/llparse-frontend.git")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32 "1rm9g4ifyip30svm5cgnf0gx7d45jgh4mpf2hkd092xhngmfvicc"))
+ (modules '((guix build utils)))
+ (snippet
+ '(begin
+ ;; Fix imports for esbuild.
+ ;; https://github.com/evanw/esbuild/issues/477
+ (substitute* '("src/frontend.ts"
+ "src/code/field-value.ts"
+ "src/container/index.ts"
+ "src/container/wrap.ts"
+ "src/node/sequence.ts"
+ "src/node/single.ts"
+ "src/node/table-lookup.ts"
+ "src/trie/index.ts")
+ (("\\* as assert") "assert")
+ (("\\* as debugAPI") "debugAPI"))
+ #t))))
+ (build-system node-build-system)
+ (arguments
+ `(#:node ,node-bootstrap
+ #:tests? #f
+ #:phases
+ (modify-phases %standard-phases
+ (delete 'configure)
+ (replace 'build
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((esbuild (string-append (assoc-ref inputs "esbuild")
+ "/bin/esbuild")))
+ (invoke esbuild
+ "--platform=node"
+ "--outfile=lib/frontend.js"
+ "--bundle"
+ "src/frontend.ts")))))))
+ (inputs
+ `(("node-debug" ,node-debug-bootstrap)
+ ("node-llparse-builder" ,node-llparse-builder-bootstrap)))
+ (native-inputs
+ `(("esbuild" ,esbuild)))
+ (home-page "https://github.com/indutny/llparse-frontend#readme")
+ (properties '((hidden? . #t)))
+ (synopsis "Frontend for the llparse compiler")
+ (description "This package is a frontend for the llparse compiler.")
+ (license license:expat)))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
T
T
Timothy Sample wrote on 30 Mar 2021 07:27
[PATCH v2 09/13] gnu: Add node-llparse-builder-bootstrap.
(address . 47282@debbugs.gnu.org)(name . Jelle Licht)(address . jlicht@fsfe.org)
20210330052743.575-9-samplet@ngyro.com
From: Jelle Licht <jlicht@fsfe.org>

* gnu/packages/node.scm (node-llparse-builder-bootstrap): New variable.
---
gnu/packages/node.scm | 65 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 65 insertions(+)

Toggle diff (78 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 6c4c02265d..570d4521ac 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -333,6 +333,71 @@ utility modelled after Node.js core's debugging technique. It works in
Node.js and web browsers.")
(license license:expat)))
+(define-public node-llparse-builder-bootstrap
+ (package
+ (name "node-llparse-builder")
+ (version "1.5.2")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/indutny/llparse-builder.git")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0r82iiwqsb73k2fxw7842rjjiixllxpyc6yl9cq4ma6ybkf6xmzm"))
+ (modules '((guix build utils)))
+ (snippet
+ '(begin
+ ;; FIXME: Unneeded runtime dependency.
+ ;; https://github.com/indutny/llparse-builder/pull/2
+ (substitute* "package.json"
+ (("\"@types/debug.*,") ""))
+ ;; Fix imports for esbuild.
+ ;; https://github.com/evanw/esbuild/issues/477
+ (substitute* '("src/node/invoke.ts"
+ "src/node/base.ts"
+ "src/node/consume.ts"
+ "src/node/match.ts"
+ "src/node/error.ts"
+ "src/node/pause.ts"
+ "src/edge.ts"
+ "src/utils.ts"
+ "src/loop-checker/index.ts"
+ "src/loop-checker/lattice.ts"
+ "src/code/field.ts"
+ "src/span-allocator.ts")
+ (("\\* as assert") "assert")
+ (("\\* as debugAPI") "debugAPI"))
+ #t))))
+ (build-system node-build-system)
+ (arguments
+ `(#:node ,node-bootstrap
+ #:tests? #f
+ #:phases
+ (modify-phases %standard-phases
+ (delete 'configure)
+ (replace 'build
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((esbuild (string-append (assoc-ref inputs "esbuild")
+ "/bin/esbuild")))
+ (invoke esbuild
+ "--platform=node"
+ "--outfile=lib/builder.js"
+ "--bundle"
+ "src/builder.ts")))))))
+ (inputs
+ `(("node-binary-search" ,node-binary-search-bootstrap)
+ ("node-debug" ,node-debug-bootstrap)))
+ (native-inputs
+ `(("esbuild" ,esbuild)))
+ (home-page "https://github.com/indutny/llparse-builder#readme")
+ (properties '((hidden? . #t)))
+ (synopsis "Graph builder for consumption by llparse")
+ (description "This package builds graphs for consumption by llparse.")
+ (license license:expat)))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
T
T
Timothy Sample wrote on 30 Mar 2021 07:27
[PATCH v2 11/13] gnu: Add node-llparse-bootstrap.
(address . 47282@debbugs.gnu.org)(name . Jelle Licht)(address . jlicht@fsfe.org)
20210330052743.575-11-samplet@ngyro.com
From: Jelle Licht <jlicht@fsfe.org>

* gnu/packages/node.scm (node-llparse-bootstrap): New variable.
---
gnu/packages/node.scm | 56 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)

Toggle diff (69 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 16c3decdd4..5336012e43 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -454,6 +454,62 @@ Node.js and web browsers.")
(description "This package is a frontend for the llparse compiler.")
(license license:expat)))
+(define-public node-llparse-bootstrap
+ (package
+ (name "node-llparse")
+ (version "7.1.0")
+ (source
+ (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/indutny/llparse.git")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "10da273iy2if88hp79cwms6c8qpsl1fkgzll6gmqyx5yxv5mkyp6"))
+ (modules '((guix build utils)))
+ (snippet
+ '(begin
+ ;; Fix imports for esbuild.
+ ;; https://github.com/evanw/esbuild/issues/477
+ (substitute* '("src/compiler/index.ts"
+ "src/implementation/c/node/base.ts"
+ "src/implementation/c/node/table-lookup.ts"
+ "src/implementation/c/compilation.ts"
+ "src/implementation/c/helpers/match-sequence.ts"
+ "src/implementation/c/code/mul-add.ts")
+ (("\\* as assert") "assert")
+ (("\\* as debugAPI") "debugAPI"))
+ #t))))
+ (build-system node-build-system)
+ (arguments
+ `(#:node ,node-bootstrap
+ #:tests? #f
+ #:phases
+ (modify-phases %standard-phases
+ (delete 'configure)
+ (replace 'build
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((esbuild (string-append (assoc-ref inputs "esbuild")
+ "/bin/esbuild")))
+ (invoke esbuild
+ "--platform=node"
+ "--outfile=lib/api.js"
+ "--bundle"
+ "src/api.ts")))))))
+ (inputs
+ `(("node-debug" ,node-debug-bootstrap)
+ ("node-llparse-frontend" ,node-llparse-frontend-bootstrap)))
+ (native-inputs
+ `(("esbuild" ,esbuild)))
+ (home-page "https://github.com/nodejs/llparse#readme")
+ (properties '((hidden? . #t)))
+ (synopsis "Compile incremental parsers to C code")
+ (description "This package offers an API for compiling an incremental
+parser definition into a C output.")
+ (license license:expat)))
+
(define-public libnode
(package/inherit node
(name "libnode")
--
2.31.0
T
T
Timothy Sample wrote on 30 Mar 2021 07:27
[PATCH v2 12/13] gnu: Add llhttp-bootstrap.
(address . 47282@debbugs.gnu.org)(name . Jelle Licht)(address . jlicht@fsfe.org)
20210330052743.575-12-samplet@ngyro.com
From: Jelle Licht <jlicht@fsfe.org>

* gnu/packages/patches/llhttp-bootstrap-CVE-2020-8287.patch: New file.
* gnu/local.mk (dist_patch_DATA): Add it.
* gnu/packages/node.scm (llhttp-bootstrap): New variable.
---
gnu/local.mk | 1 +
gnu/packages/node.scm | 70 ++++++++++++
.../llhttp-bootstrap-CVE-2020-8287.patch | 100 ++++++++++++++++++
3 files changed, 171 insertions(+)
create mode 100644 gnu/packages/patches/llhttp-bootstrap-CVE-2020-8287.patch

Toggle diff (201 lines)
diff --git a/gnu/local.mk b/gnu/local.mk
index 52a021c2a3..5959a563d1 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1366,6 +1366,7 @@ dist_patch_DATA = \
%D%/packages/patches/linux-pam-no-setfsuid.patch \
%D%/packages/patches/lirc-localstatedir.patch \
%D%/packages/patches/lirc-reproducible-build.patch \
+ %D%/packages/patches/llhttp-bootstrap-CVE-2020-8287.patch \
%D%/packages/patches/llvm-3.5-fix-clang-build-with-gcc5.patch \
%D%/packages/patches/llvm-9-fix-bitcast-miscompilation.patch \
%D%/packages/patches/llvm-9-fix-lpad-miscompilation.patch \
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 5336012e43..45e5f8feca 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -510,6 +510,76 @@ Node.js and web browsers.")
parser definition into a C output.")
(license license:expat)))
+(define-public llhttp-bootstrap
+ (package
+ (name "llhttp")
+ (version "2.1.3")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/nodejs/llhttp.git")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "0pqj7kyyzr1zs4h9yzn5rdxnxspm3wqgsv00765dd42fszlmrmk8"))
+ (patches (search-patches "llhttp-bootstrap-CVE-2020-8287.patch"))
+ (modules '((guix build utils)))
+ (snippet
+ '(begin
+ ;; Fix imports for esbuild.
+ ;; https://github.com/evanw/esbuild/issues/477
+ (substitute* "src/llhttp/http.ts"
+ (("\\* as assert") "assert"))
+ (substitute* "Makefile"
+ (("npx ts-node bin/generate.ts")
+ "node bin/generate.js"))
+ #t))))
+ (build-system gnu-build-system)
+ (arguments
+ `(#:tests? #f ; no tests
+ #:make-flags (list "CLANG=gcc"
+ (string-append "DESTDIR=" (assoc-ref %outputs "out"))
+ "PREFIX=")
+ #:phases
+ (modify-phases %standard-phases
+ (replace 'configure
+ (lambda* (#:key inputs #:allow-other-keys)
+ (let ((esbuild (string-append (assoc-ref inputs "esbuild")
+ "/bin/esbuild")))
+ (invoke esbuild
+ "--platform=node"
+ "--outfile=bin/generate.js"
+ "--bundle" "bin/generate.ts"))))
+ (add-before 'install 'create-install-directories
+ (lambda* (#:key outputs #:allow-other-keys)
+ (let ((out (assoc-ref outputs "out")))
+ (for-each (lambda (dir)
+ (mkdir-p (string-append out dir)))
+ (list "/lib" "/include" "/src"))
+ #t)))
+ (add-after 'install 'install-src
+ (lambda* (#:key outputs #:allow-other-keys)
+ (let* ((out (assoc-ref outputs "out"))
+ (src-dir (string-append out "/src")))
+ (install-file "build/c/llhttp.c" src-dir)
+ (install-file "src/native/api.c" src-dir)
+ (install-file "src/native/http.c" src-dir)
+ #t))))))
+ (native-inputs
+ `(("esbuild" ,esbuild)
+ ("node" ,node-bootstrap)
+ ("node-semver" ,node-semver-bootstrap)
+ ("node-llparse-bootstrap" ,node-llparse-bootstrap)))
+ (home-page "https://github.com/nodejs/llhttp")
+ (properties '((hidden? . #t)))
+ (synopsis "Parser for HTTP messages")
+ (description "This is a rewrite of
+@url{https://github.com/nodejs/http-parser, http-parser} using
+@url{https://github.com/nodejs/llparse, llparse} to generate the C
+source files.")
+ (license license:expat)))
+
(define-public libnode
(package/inherit node
(name "libnode")
diff --git a/gnu/packages/patches/llhttp-bootstrap-CVE-2020-8287.patch b/gnu/packages/patches/llhttp-bootstrap-CVE-2020-8287.patch
new file mode 100644
index 0000000000..215c920e53
--- /dev/null
+++ b/gnu/packages/patches/llhttp-bootstrap-CVE-2020-8287.patch
@@ -0,0 +1,100 @@
+This patch comes from upstream. It corresponds to a patch applied to
+the generated C source code for llhttp included in Node.js 14.16.0
+(see commit 641f786bb1a1f6eb1ff8750782ed939780f2b31a). That commit
+fixes CVE-2020-8287. With this patch, the output of our
+llhttp-bootstrap package matches the files included in Node.js 14.16.0
+exactly.
+
+commit e9b36ea64709c35ca66094d5cf3787f444029601
+Author: Fedor Indutny <fedor@indutny.com>
+Date: Sat Oct 10 19:56:01 2020 -0700
+
+ http: unset `F_CHUNKED` on new `Transfer-Encoding`
+
+ Duplicate `Transfer-Encoding` header should be a treated as a single,
+ but with original header values concatenated with a comma separator. In
+ the light of this, even if the past `Transfer-Encoding` ended with
+ `chunked`, we should be not let the `F_CHUNKED` to leak into the next
+ header, because mere presence of another header indicates that `chunked`
+ is not the last transfer-encoding token.
+
+diff --git a/src/llhttp/http.ts b/src/llhttp/http.ts
+index f4f1a6e..0a0c365 100644
+--- a/src/llhttp/http.ts
++++ b/src/llhttp/http.ts
+@@ -460,11 +460,19 @@ export class HTTP {
+ .match([ ' ', '\t' ], n('header_value_discard_ws'))
+ .otherwise(checkContentLengthEmptiness);
+
++ // Multiple `Transfer-Encoding` headers should be treated as one, but with
++ // values separate by a comma.
++ //
++ // See: https://tools.ietf.org/html/rfc7230#section-3.2.2
++ const toTransferEncoding = this.unsetFlag(
++ FLAGS.CHUNKED,
++ 'header_value_te_chunked');
++
+ n('header_value_start')
+ .otherwise(this.load('header_state', {
+ [HEADER_STATE.UPGRADE]: this.setFlag(FLAGS.UPGRADE, fallback),
+ [HEADER_STATE.TRANSFER_ENCODING]: this.setFlag(
+- FLAGS.TRANSFER_ENCODING, 'header_value_te_chunked'),
++ FLAGS.TRANSFER_ENCODING, toTransferEncoding),
+ [HEADER_STATE.CONTENT_LENGTH]: n('header_value_content_length_once'),
+ [HEADER_STATE.CONNECTION]: n('header_value_connection'),
+ }, 'header_value'));
+@@ -847,6 +855,11 @@ export class HTTP {
+ return span.start(span.end(this.node(next)));
+ }
+
++ private unsetFlag(flag: FLAGS, next: string | Node): Node {
++ const p = this.llparse;
++ return p.invoke(p.code.and('flags', ~flag), this.node(next));
++ }
++
+ private setFlag(flag: FLAGS, next: string | Node): Node {
+ const p = this.llparse;
+ return p.invoke(p.code.or('flags', flag), this.node(next));
+diff --git a/test/request/transfer-encoding.md b/test/request/transfer-encoding.md
+index a7d1681..b0891d6 100644
+--- a/test/request/transfer-encoding.md
++++ b/test/request/transfer-encoding.md
+@@ -353,6 +353,38 @@ off=106 headers complete method=3 v=1/1 flags=200 content_length=0
+ off=106 error code=15 reason="Request has invalid `Transfer-Encoding`"
+ ```
+
++## POST with `chunked` and duplicate transfer-encoding
++
++<!-- meta={"type": "request", "noScan": true} -->
++```http
++POST /post_identity_body_world?q=search#hey HTTP/1.1
++Accept: */*
++Transfer-Encoding: chunked
++Transfer-Encoding: deflate
++
++World
++```
++
++```log
++off=0 message begin
++off=5 len=38 span[url]="/post_identity_body_world?q=search#hey"
++off=44 url complete
++off=54 len=6 span[header_field]="Accept"
++off=61 header_field complete
++off=62 len=3 span[header_value]="*/*"
++off=67 header_value complete
++off=67 len=17 span[header_field]="Transfer-Encoding"
++off=85 header_field complete
++off=86 len=7 span[header_value]="chunked"
++off=95 header_value complete
++off=95 len=17 span[header_field]="Transfer-Encoding"
++off=113 header_field complete
++off=114 len=7 span[header_value]="deflate"
++off=123 header_value complete
++off=125 headers complete method=3 v=1/1 flags=200 content_length=0
++off=125 error code=15 reason="Request has invalid `Transfer-Encoding`"
++```
++
+ ## POST with `chunked` before other transfer-coding (lenient)
+
+ TODO(indutny): should we allow it even in lenient mode? (Consider disabling
--
2.31.0
T
T
Timothy Sample wrote on 30 Mar 2021 07:27
[PATCH v2 13/13] gnu: Add node-lts.
(address . 47282@debbugs.gnu.org)(name . Jelle Licht)(address . jlicht@fsfe.org)
20210330052743.575-13-samplet@ngyro.com
From: Jelle Licht <jlicht@fsfe.org>

* gnu/packages/node.scm (node-lts): New variable.
* guix/build-system/node.scm (default-node): Use it.
---
gnu/packages/node.scm | 135 +++++++++++++++++++++++++++++++++++++
guix/build-system/node.scm | 2 +-
2 files changed, 136 insertions(+), 1 deletion(-)

Toggle diff (161 lines)
diff --git a/gnu/packages/node.scm b/gnu/packages/node.scm
index 45e5f8feca..249241f110 100644
--- a/gnu/packages/node.scm
+++ b/gnu/packages/node.scm
@@ -580,6 +580,141 @@ parser definition into a C output.")
source files.")
(license license:expat)))
+(define-public node-lts
+ (package
+ (inherit node)
+ (version "14.16.0")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "https://nodejs.org/dist/v" version
+ "/node-v" version ".tar.xz"))
+ (sha256
+ (base32
+ "19nz2mhmn6ikahxqyna1dn25pb5v3z9vsz9zb2flb6zp2yk4hxjf"))
+ (modules '((guix build utils)))
+ (snippet
+ `(begin
+ ;; Remove bundled software, where possible
+ (for-each delete-file-recursively
+ '("deps/cares"
+ "deps/icu-small"
+ "deps/nghttp2"
+ "deps/openssl"
+ "deps/zlib"))
+ (substitute* "Makefile"
+ ;; Remove references to bundled software.
+ (("deps/uv/uv.gyp") "")
+ (("deps/zlib/zlib.gyp") ""))
+ #t))))
+ (arguments
+ (substitute-keyword-arguments (package-arguments node)
+ ((#:configure-flags configure-flags)
+ ''("--shared-cares"
+ "--shared-libuv"
+ "--shared-nghttp2"
+ "--shared-openssl"
+ "--shared-zlib"
+ "--shared-brotli"
+ "--with-intl=system-icu"))
+ ((#:phases phases)
+ `(modify-phases ,phases
+ (replace 'configure
+ ;; Node's configure script is actually a python script, so we can't
+ ;; run it with bash.
+ (lambda* (#:key outputs (configure-flags '()) inputs
+ #:allow-other-keys)
+ (let* ((prefix (assoc-ref outputs "out"))
+ (flags (cons (string-append "--prefix=" prefix)
+ configure-flags)))
+ (format #t "build directory: ~s~%" (getcwd))
+ (format #t "configure flags: ~s~%" flags)
+ ;; Node's configure script expects the CC environment variable to
+ ;; be set.
+ (setenv "CC" (string-append (assoc-ref inputs "gcc") "/bin/gcc"))
+ (apply invoke
+ (string-append (assoc-ref inputs "python")
+ "/bin/python3")
+ "configure" flags))))
+ (replace 'patch-files
+ (lambda* (#:key inputs #:allow-other-keys)
+ ;; Fix hardcoded /bin/sh references.
+ (substitute* '("lib/child_process.js"
+ "lib/internal/v8_prof_polyfill.js"
+ "test/parallel/test-child-process-spawnsync-shell.js"
+ "test/parallel/test-fs-write-sigxfsz.js"
+ "test/parallel/test-stdio-closed.js"
+ "test/sequential/test-child-process-emfile.js")
+ (("'/bin/sh'")
+ (string-append "'" (which "sh") "'")))
+
+ ;; Fix hardcoded /usr/bin/env references.
+ (substitute* '("test/parallel/test-child-process-default-options.js"
+ "test/parallel/test-child-process-env.js"
+ "test/parallel/test-child-process-exec-env.js")
+ (("'/usr/bin/env'")
+ (string-append "'" (which "env") "'")))
+
+ ;; FIXME: These tests fail in the build container, but they don't
+ ;; seem to be indicative of real problems in practice.
+ (for-each delete-file
+ '("test/parallel/test-cluster-master-error.js"
+ "test/parallel/test-cluster-master-kill.js"))
+
+ ;; These require a DNS resolver.
+ (for-each delete-file
+ '("test/parallel/test-dns.js"
+ "test/parallel/test-dns-lookupService-promises.js"))
+
+ ;; FIXME: This test fails randomly:
+ ;; https://github.com/nodejs/node/issues/31213
+ (delete-file "test/parallel/test-net-listen-after-destroying-stdin.js")
+
+ ;; FIXME: These tests fail on armhf-linux:
+ ;; https://github.com/nodejs/node/issues/31970
+ ,@(if (string-prefix? "arm" (%current-system))
+ '((for-each delete-file
+ '("test/parallel/test-zlib.js"
+ "test/parallel/test-zlib-brotli.js"
+ "test/parallel/test-zlib-brotli-flush.js"
+ "test/parallel/test-zlib-brotli-from-brotli.js"
+ "test/parallel/test-zlib-brotli-from-string.js"
+ "test/parallel/test-zlib-convenience-methods.js"
+ "test/parallel/test-zlib-random-byte-pipes.js"
+ "test/parallel/test-zlib-write-after-flush.js")))
+ '())
+
+ ;; These tests have an expiry date: they depend on the validity of
+ ;; TLS certificates that are bundled with the source. We want this
+ ;; package to be reproducible forever, so remove those.
+ ;; TODO: Regenerate certs instead.
+ (for-each delete-file
+ '("test/parallel/test-tls-passphrase.js"
+ "test/parallel/test-tls-server-verify.js"))
+
+ ;; Replace pre-generated llhttp sources
+ (let ((llhttp (assoc-ref inputs "llhttp")))
+ (copy-file (string-append llhttp "/src/llhttp.c")
+ "deps/llhttp/src/llhttp.c")
+ (copy-file (string-append llhttp "/src/api.c")
+ "deps/llhttp/src/api.c")
+ (copy-file (string-append llhttp "/src/http.c")
+ "deps/llhttp/src/http.c")
+ (copy-file (string-append llhttp "/include/llhttp.h")
+ "deps/llhttp/include/llhttp.h"))
+ #t))))))
+ (inputs
+ `(("c-ares" ,c-ares)
+ ("icu4c" ,icu4c-67)
+ ("libuv" ,libuv-for-node)
+ ("llhttp" ,llhttp-bootstrap)
+ ("google-brotli" ,google-brotli)
+ ("nghttp2" ,nghttp2 "lib")
+ ("openssl" ,openssl)
+ ("zlib" ,zlib)))
+ (native-inputs
+ (alist-replace "python" (list python-3)
+ (package-native-inputs node)))))
+
(define-public libnode
(package/inherit node
(name "libnode")
diff --git a/guix/build-system/node.scm b/guix/build-system/node.scm
index 4991ed53a5..98f63f87ef 100644
--- a/guix/build-system/node.scm
+++ b/guix/build-system/node.scm
@@ -39,7 +39,7 @@
"Return the default Node package."
;; Lazily resolve the binding to avoid a circular dependency.
(let ((node (resolve-interface '(gnu packages node))))
- (module-ref node 'node)))
+ (module-ref node 'node-lts)))
(define* (lower name
#:key source inputs native-inputs outputs system target
--
2.31.0
E
E
Efraim Flashner wrote on 30 Mar 2021 08:59
Re: [bug#47282] [PATCH v2 12/13] gnu: Add llhttp-bootstrap.
(name . Timothy Sample)(address . samplet@ngyro.com)
YGLMaezm0+Rrqbj3@3900XT
Attachment: file
-----BEGIN PGP SIGNATURE-----

iQIzBAABCgAdFiEEoov0DD5VE3JmLRT3Qarn3Mo9g1EFAmBizGYACgkQQarn3Mo9
g1FxFBAApap4rY86TCrFjdQCaQ/dYc5jQW+020JTEL3zBGndnn6npUkJNs0H/6i2
d43aoXdRnqMKECFSUPFczv9ft/hZi6uDjpeXs/8Zurxeq6S5TqyiYKbya80lyYot
NQGFtLOmH3JNaymFwDRoELyfA7FXDj79Bb7WvW7X9Y/0dAUswxck+6sy08m6OhTY
Q2mGty7eG8jTSpbQNae6HFODnmGg6+uIW55vDIhDBaXyT5Gqvkw6Ip6ZcdVOYhAx
rPxqc28/MNWWn3Q9n9BxZMfhwVfj5tByVsXOwDHZRJGUb8JzMiiWXvxp5kqRpdJy
Ncf5Vl73b4TUkijGT/RfWSnx7H9rNy7vyylWD/vE5rSwJKPLR/wn82vK0v3ZJqj4
wxUclA2sBl+pXW9vQsAvE/cfG4ySlZaM29R94H8Yq7mIv2pu9jNTftcv9rftKE58
10n1eN37F4++ImNZtwK3rpXELj2r3MLevCMX4c5/SX8YhHAmd+18obosBGX4zE+w
ktntmsdntV6GLMnnZ20Acseez3P1LN+g85tEhpwzv8cE+1uz2xOutfI9GHJlAhGO
BltJhA2ZgFBfsJ028zDKBw1ngzIl9O6smRW4pXpmshFLWRZnvZFhU04N5QvGf3uz
MIAOjzolMy1OwO9dNpkDeqHeROco2MKP1x5FZXnygAG6aAFjhQY=
=yTbP
-----END PGP SIGNATURE-----


E
E
Efraim Flashner wrote on 30 Mar 2021 09:04
Re: [bug#47282] [PATCH v2 13/13] gnu: Add node-lts.
(name . Timothy Sample)(address . samplet@ngyro.com)
YGLNaOXpQrJL3v8M@3900XT
Attachment: file
-----BEGIN PGP SIGNATURE-----

iQIzBAABCgAdFiEEoov0DD5VE3JmLRT3Qarn3Mo9g1EFAmBizWgACgkQQarn3Mo9
g1GbcQ/+KZuaJXt/+fPe+vcF8NhN0UGkFYmEHXkfzzamVdi2b2e6vN9GzSAI/A5P
6VVzj/Bq3URMwInJSultsni+UkXeUDI+7rw1J6tpPMPPUrmKW5mht0AexATbNQcB
777jAix3iqGYnkZjofKkzatO7XQIwE9jvuJS9UTDDRGw7sL07ZBwYUKaZarPPffW
UZ4CgMFrbyj3Ge3UseBYlcVMbhh2/RuZzZNZu1er023jEk1USKrhJ7YRM9I5ATNe
2QydGVGsmCvhJnAlfXEwjsG3UYVz+m5Eb0oTzbZ1SaoPPv71OTxAF52eSzjm+Zpb
44dCYzdLgIf9jTX/8Xn44GOgllgdcp/DU/VrLp88498WcY9gDoGs7Z2PQVOnB+UI
rMFahhhr/pspgDxMDCRRjBm3J9TpeqkhCDxzYk/VoFi8tAG/uV1A7SEVzrI1wTFQ
HOAB5quVg2pV8Qf3Ax8CTu1NFeVtmjw5vGdMCQHfeHEQDtptyxNOrBe80nYYYg4x
cllVkW8gS+qg9Var7hFUXrE82KpJt//4QMI3OwYBsbtazoB5ZJ0CeCZy/oXfLvqY
ddlAUQ2QqpYEtdF9IYXgu2tk9/Y6mJlEZfXKwb3HEP5XXheZt0Fmts808G4SDHyJ
Mkwrmk84m14+Gp37zQnjGf+0fxxh7L6iUo7Gqa67kqpNSu3iHy8=
=PLBi
-----END PGP SIGNATURE-----


J
J
Jelle Licht wrote on 2 Apr 2021 15:17
Re: [bug#47282] [PATCH v2 12/13] gnu: Add llhttp-bootstrap.
(address . 47282@debbugs.gnu.org)
86k0pk3jwt.fsf@fsfe.org
Efraim Flashner <efraim@flashner.co.il> writes:

Toggle quote (8 lines)
> On Tue, Mar 30, 2021 at 01:27:42AM -0400, Timothy Sample wrote:
>> + (build-system gnu-build-system)
>> + (arguments
>> + `(#:tests? #f ; no tests
>> + #:make-flags (list "CLANG=gcc"
>
> This should probably be cc-for-target

Fixed in my local version, thanks.

Toggle quote (6 lines)
>> + (string-append "DESTDIR=" (assoc-ref %outputs "out"))
>> + "PREFIX=")
>
> And normally DESTDIR is empty and PREFIX is %out. Does it need to be
> switched here?

It does.

- Jelle
J
J
Jelle Licht wrote on 2 Apr 2021 15:20
Re: [bug#47282] [PATCH v2 13/13] gnu: Add node-lts.
(address . 47282@debbugs.gnu.org)
86h7ko3js7.fsf@fsfe.org
Efraim Flashner <efraim@flashner.co.il> writes:

Toggle quote (29 lines)
> On Tue, Mar 30, 2021 at 01:27:43AM -0400, Timothy Sample wrote:
>> + (arguments
>> + (substitute-keyword-arguments (package-arguments node)
>> + ((#:configure-flags configure-flags)
>> + ''("--shared-cares"
>> + "--shared-libuv"
>> + "--shared-nghttp2"
>> + "--shared-openssl"
>> + "--shared-zlib"
>> + "--shared-brotli"
>> + "--with-intl=system-icu"))
>> + ((#:phases phases)
>> + `(modify-phases ,phases
>> + (replace 'configure
>> + ;; Node's configure script is actually a python script, so we can't
>> + ;; run it with bash.
>> + (lambda* (#:key outputs (configure-flags '()) inputs
>> + #:allow-other-keys)
>> + (let* ((prefix (assoc-ref outputs "out"))
>> + (flags (cons (string-append "--prefix=" prefix)
>> + configure-flags)))
>> + (format #t "build directory: ~s~%" (getcwd))
>> + (format #t "configure flags: ~s~%" flags)
>> + ;; Node's configure script expects the CC environment variable to
>> + ;; be set.
>> + (setenv "CC" (string-append (assoc-ref inputs "gcc") "/bin/gcc"))
>
> again cc-for-target

Ack.

Toggle quote (7 lines)
>> [snip]
>> + ;; FIXME: These tests fail on armhf-linux:
>> + ;; https://github.com/nodejs/node/issues/31970
>> + ,@(if (string-prefix? "arm" (%current-system))
>
> This could probably be changed to ,@(when (target-arm32?)

I changed it to ,@(if (target-arm32?), as otherwise the #f-branch
spliced #unspecified into the list.
J
J
Jelle Licht wrote on 2 Apr 2021 18:18
Re: bug#47282: [PATCH 00/13] node going forward
(name . Timothy Sample)(address . samplet@ngyro.com)(address . 47282-done@debbugs.gnu.org)
86ft083bjz.fsf@fsfe.org
Timothy,

Timothy Sample <samplet@ngyro.com> writes:

Toggle quote (9 lines)
> Hi Jelle,
>
> Jelle Licht <jlicht@fsfe.org> writes:
>
>> So, some people seem to be interested in this one; please review and test.
>
> Now that I’ve finally taken the time to dig into what you’ve done here –
> I must say it’s very impressive!

If you bang your head against a wall often enough, it will crack
eventually. Head or wall, either way works in this metaphor ;-).

Toggle quote (8 lines)
> I’ve taken the presumptuous step of re-rolling the series. The reason
> is that all the “(delete 'build)” bits were bothering me. I decided to
> have the build system check the “package.json” file for a build script
> before trying to run it. Since that change required changing all the
> other patches, I thought it would be easier to just post the updated
> patches. Also, I’m hoping to spare you some trouble (since you’ve
> already gone to a lot!).

Makes sense, thanks! Please be presumptuous as often as you'd like.

Toggle quote (6 lines)
>
> • Change the “Fix incorrect import semantics” comments to “Fix
> imports for esbuild”. To me, if TypeScript’s tsc likes the
> imports, they are correct TypeScript (despite the esbuild bug
> report).

"Something a native speaker of English can make sense of" != "Proper
English", and in that same vein I don't think a commmon mistake with
workaround in place is not a mistake.

I really don't care about what ends up in the codebase though, as long
as it is clear why we do what we do, which works out just fine with your
comment.

Toggle quote (7 lines)
> The final result is still a little messy, but I don’t think we should
> hold this back any longer. It’s a significant step forward, and it puts
> us in better shape to improve things incrementally.
>
> WDYT? Let me know if I made anything worse! :) If the altered patches
> look good to you, I suggest you go ahead and push them.

I still adressed some of Efraim's remarks, and pushed it to master just
now.

There are quite some ways to go from here:

* Get the 'binary' importer upstreamable (I will continue with this)

* Properly support cross-compilation of Node and Node-packages

I had a super quick look at this, but it seems that in building node,
you build intermediate tools that run on the host. Perhaps some our
x-compilation gurus can weigh in.

* Make a Rome-based build system, once Rome does more than linting, to
help untangle the knot that is JavaScript-packaging

But for today (and the upcoming release), modern Node on guix \o/

Thanks folks!
- Jelle
Closed
T
T
Timothy Sample wrote on 3 Apr 2021 03:19
(name . Jelle Licht)(address . jlicht@fsfe.org)(address . 47282-done@debbugs.gnu.org)
87mtugjhal.fsf@ngyro.com
Hi,

Jelle Licht <jlicht@fsfe.org> writes:

Toggle quote (15 lines)
> Timothy Sample <samplet@ngyro.com> writes:
>
>> • Change the “Fix incorrect import semantics” comments to “Fix
>> imports for esbuild”. To me, if TypeScript’s tsc likes the
>> imports, they are correct TypeScript (despite the esbuild bug
>> report).
>
> "Something a native speaker of English can make sense of" != "Proper
> English", and in that same vein I don't think a commmon mistake with
> workaround in place is not a mistake.
>
> I really don't care about what ends up in the codebase though, as long
> as it is clear why we do what we do, which works out just fine with your
> comment.

Heh. You’re right: it’s not a big deal. Thanks for humouring me. :)

Toggle quote (10 lines)
>> The final result is still a little messy, but I don’t think we should
>> hold this back any longer. It’s a significant step forward, and it puts
>> us in better shape to improve things incrementally.
>>
>> WDYT? Let me know if I made anything worse! :) If the altered patches
>> look good to you, I suggest you go ahead and push them.
>
> I still adressed some of Efraim's remarks, and pushed it to master just
> now.

Nice!!

Toggle quote (13 lines)
> There are quite some ways to go from here:
>
> * Get the 'binary' importer upstreamable (I will continue with this)
>
> * Properly support cross-compilation of Node and Node-packages
>
> I had a super quick look at this, but it seems that in building node,
> you build intermediate tools that run on the host. Perhaps some our
> x-compilation gurus can weigh in.
>
> * Make a Rome-based build system, once Rome does more than linting, to
> help untangle the knot that is JavaScript-packaging

Sounds pretty exciting!


-- Tim
Closed
?