git: fa93fdc383c1 - main - Framework: Rewrite nodejs.mk and reorganize www/{node,npm,yarn}

From: Po-Chuan Hsieh <sunpoet_at_FreeBSD.org>
Date: Mon, 30 Jan 2023 14:25:50 UTC
The branch main has been updated by sunpoet:

URL: https://cgit.FreeBSD.org/ports/commit/?id=fa93fdc383c190569821ae224413c848c19d9a7c

commit fa93fdc383c190569821ae224413c848c19d9a7c
Author:     Po-Chuan Hsieh <sunpoet@FreeBSD.org>
AuthorDate: 2023-01-30 14:20:38 +0000
Commit:     Po-Chuan Hsieh <sunpoet@FreeBSD.org>
CommitDate: 2023-01-30 14:20:38 +0000

    Framework: Rewrite nodejs.mk and reorganize www/{node,npm,yarn}
    
    The current USES=nodejs has the following issues:
    - www/node is not the default version while www/node16 is.
    - It also means inconsistent naming of node ports.
    - www/npm duplicates with www/npm-node16.
    - www/yarn duplicates with www/yarn-node16.
    
    The notable changes are introduced to fix the above issues:
    - Rewrite Mk/Uses/nodejs.mk.
    - Add new LTS version of nodejs (www/noe18).
    - Add new current version of nodejs (www/node19).
    - Change default nodejs version from 16 to 18 (latest LTS).
    - Use consistent naming for all supported node versions.
    - Convert www/node, www/npm and www/yarn to meta ports.
    
    After this commit:
    - All supported node versions are named as node{14,16,18,19}
    - www/node is a meta port which depends on the default version (e.g. www/node18)
    - www/npm is a meta port which depends on the default version (e.g. www/npm-node18)
    - www/yarn is a meta port which depends on the default version (e.g. www/yarn-node18)
    - Bump PORTREVISION of dependent ports for dependency change (from www/node16 to www/node18)
    
    Discussed with: jrm, otis, pizzamig
---
 Mk/Uses/nodejs.mk                                  |   78 +-
 Mk/bsd.default-versions.mk                         |    2 +-
 devel/node-thrift/Makefile                         |    2 +-
 devel/purescript-language-server/Makefile          |    1 +
 devel/rubygem-execjs/Makefile                      |    2 +-
 devel/sonar-scanner-cli/Makefile                   |    2 +-
 games/wipeclean/Makefile                           |    1 +
 lang/coffeescript/Makefile                         |    1 +
 textproc/write-good/Makefile                       |    1 +
 www/csso/Makefile                                  |    2 +-
 www/node/Makefile                                  |   96 +-
 www/node/pkg-descr                                 |    8 +-
 www/node14/Makefile                                |    2 +-
 www/node16/Makefile                                |    2 +-
 www/node18/Makefile                                |  102 +
 www/{node => node18}/distinfo                      |    0
 www/{node => node18}/files/extra-patch-common.gypi |    0
 ...l_config_archs_linux-elf_no-asm_openssl-cl.gypi |    0
 ...nssl_config_archs_linux-elf_no-asm_openssl.gypi |    0
 .../patch-deps_openssl_openssl-cl__no__asm.gypi    |    0
 .../files/patch-deps_openssl_openssl__no__asm.gypi |    0
 ...h-deps_v8_src_base_platform_platform-freebsd.cc |    0
 .../files/patch-deps_v8_src_codegen_arm_cpu-arm.cc |    0
 .../patch-deps_v8_src_codegen_ppc_constants-ppc.h  |    0
 .../files/patch-deps_v8_src_libsampler_sampler.cc  |    0
 www/{node => node18}/files/patch-node.gypi         |    0
 www/{node => node18}/files/patch-src_cares__wrap.h |    0
 .../files/patch-tools_v8__gypfiles_v8.gyp          |    0
 www/node18/pkg-descr                               |    4 +
 www/{node => node18}/pkg-message                   |    0
 www/{node => node18}/pkg-plist                     |    0
 www/node19/Makefile                                |   91 +
 www/node19/distinfo                                |    3 +
 www/node19/files/extra-patch-common.gypi           |   13 +
 ...l_config_archs_linux-elf_no-asm_openssl-cl.gypi |   11 +
 ...nssl_config_archs_linux-elf_no-asm_openssl.gypi |   11 +
 .../patch-deps_openssl_openssl-cl__no__asm.gypi    |   17 +
 .../files/patch-deps_openssl_openssl__no__asm.gypi |   11 +
 ...h-deps_v8_src_base_platform_platform-freebsd.cc |   13 +
 .../files/patch-deps_v8_src_codegen_arm_cpu-arm.cc |   18 +
 .../patch-deps_v8_src_codegen_ppc_constants-ppc.h  |   20 +
 .../files/patch-deps_v8_src_libsampler_sampler.cc  |   13 +
 www/node19/files/patch-node.gypi                   |   12 +
 www/node19/files/patch-src_cares__wrap.h           |   11 +
 www/node19/files/patch-tools_v8__gypfiles_v8.gyp   |   11 +
 www/node19/pkg-descr                               |    4 +
 www/node19/pkg-message                             |    7 +
 www/node19/pkg-plist                               | 2332 ++++++++++++++++++++
 www/npm-node14/Makefile                            |    8 +-
 www/npm-node16/Makefile                            |    8 +-
 www/npm-node18/Makefile                            |   43 +-
 www/{npm => npm-node18}/distinfo                   |    0
 www/npm-node18/pkg-descr                           |    2 +
 www/{npm => npm-node18}/pkg-plist                  |    0
 www/npm-node19/Makefile                            |    5 +
 www/npm/Makefile                                   |   34 +-
 www/yarn-node14/Makefile                           |    6 +-
 www/yarn-node16/Makefile                           |    6 +-
 www/yarn-node18/Makefile                           |   52 +-
 www/{yarn => yarn-node18}/distinfo                 |    0
 www/{yarn => yarn-node18}/files/patch-lib_cli.js   |    0
 www/yarn-node18/pkg-descr                          |    4 +
 www/{yarn => yarn-node18}/pkg-plist                |    0
 www/yarn-node19/Makefile                           |    5 +
 www/yarn/Makefile                                  |   49 +-
 65 files changed, 2878 insertions(+), 248 deletions(-)

diff --git a/Mk/Uses/nodejs.mk b/Mk/Uses/nodejs.mk
index 02571bf596ef..751d95dfe443 100644
--- a/Mk/Uses/nodejs.mk
+++ b/Mk/Uses/nodejs.mk
@@ -1,58 +1,60 @@
-# Provide support for NodeJS
+# Provide support for Node.js
 #
-# Feature:      nodejs
-# Usage:        USES=nodejs or USES=nodejs:args
-# Valid ARGS:	build and/or run <version>
-# version:      lts, current, 14, 16, 18
-# Default is:   build,run
-# Note:			if you define a version, you must provide run and/or build
+# Feature:	nodejs
 #
-# MAINTAINER: ports@FreeBSD.org
+# Usage:	USES=nodejs[:args]
+#   Valid args:
+#   - build     use node as build-time dependency
+#   - run       use node as runtime dependency
+#   - env       set the environment (NODEJS_VERSION and NODEJS_SUFFIX)
+#   - version   available version: lts, current, 14, 16, 18, 19
+#
+# Note:
+# - The supported versions follow upstream release schedule
+#   https://github.com/nodejs/Release/blob/main/README.md#release-schedule
+#   - lts is 18 now
+#   - current is 19 now
+# - USES=nodejs means USES=nodejs:build,run
+# - If you define a version, you must provide run and/or build
+#
+# MAINTAINER: sunpoet@FreeBSD.org
 
 .if !defined(_INCLUDE_USES_NODEJS_MK)
 _INCLUDE_USES_NODEJS_MK=	yes
 
-_VALID_NODEJS_VERSION=	14 16 18 lts current
-_NODEJS_VERSION_SUFFIX=	${NODEJS_DEFAULT}
+_VALID_NODEJS_VERSIONS=	14 16 18 19 current lts
+
+.  if ! ${_VALID_NODEJS_VERSIONS:M${NODEJS_DEFAULT}}
+IGNORE=	Invalid default nodejs version ${NODEJS_DEFAULT}; valid versions are ${_VALID_NODEJS_VERSIONS}
+.  endif
 
-.  if ! ${_VALID_NODEJS_VERSION:M${_NODEJS_VERSION_SUFFIX}}
-IGNORE=	Invalid nodejs default version ${_NODEJS_VERSION_SUFFIX}; valid versions are ${_VALID_NODEJS_VERSION}
+.  if !empty(${nodejs_ARGS:Nbuild:Nrun:Nlts:Ncurrent:N14:N16:N18:N19})
+IGNORE=		USES=nodejs has invalid arguments ${nodejs_ARGS}.
 .  endif
 
 .  if empty(nodejs_ARGS)
 nodejs_ARGS=	build,run
 .  endif
 
-.  if ${nodejs_ARGS:M14}
-_NODEJS_VERSION_SUFFIX=	14
-.  elif ${nodejs_ARGS:M16}
-_NODEJS_VERSION_SUFFIX=	16
-.  elif ${nodejs_ARGS:Mlts}
-_NODEJS_VERSION_SUFFIX=	lts
-.  elif ${nodejs_ARGS:M18}
-_NODEJS_VERSION_SUFFIX=	18
-.  elif ${nodejs_ARGS:Mcurrent}
-_NODEJS_VERSION_SUFFIX=	current
-.  elif defined(NODEJS_DEFAULT)
-.  endif
+.undef _NODEJS_VER
+.  for version in ${_VALID_NODEJS_VERSIONS}
+.    if ${nodejs_ARGS:M${version}}
+_NODEJS_VER=	${version}
+.    endif
+.  endfor
 
-# The nodejs 18 version is named www/node
-.  if ${_NODEJS_VERSION_SUFFIX:Mcurrent}
-_NODEJS_VERSION_SUFFIX=
-.  endif
-.  if ${_NODEJS_VERSION_SUFFIX:M18}
-_NODEJS_VERSION_SUFFIX=
-.  endif
-# The nodejs LTS is version 16
-.  if ${_NODEJS_VERSION_SUFFIX:Mlts}
-_NODEJS_VERSION_SUFFIX=	16
+.  if !defined(_NODEJS_VER)
+_NODEJS_VER=	${NODEJS_DEFAULT}
 .  endif
 
-.  if ${nodejs_ARGS:M*run*}
-RUN_DEPENDS+=	node:www/node${_NODEJS_VERSION_SUFFIX}
-.  endif
+NODEJS_VERSION=	${_NODEJS_VER:S|current|19|:S|lts|18|}
+NODEJS_SUFFIX=	-node${NODEJS_VERSION}
+
 .  if ${nodejs_ARGS:M*build*}
-BUILD_DEPENDS+=	node:www/node${_NODEJS_VERSION_SUFFIX}
+BUILD_DEPENDS+=	node:www/node${NODEJS_VERSION}
+.  endif
+.  if ${nodejs_ARGS:M*run*}
+RUN_DEPENDS+=	node:www/node${NODEJS_VERSION}
 .  endif
 
 .endif
diff --git a/Mk/bsd.default-versions.mk b/Mk/bsd.default-versions.mk
index a1d2bec65aa5..12481dd983d2 100644
--- a/Mk/bsd.default-versions.mk
+++ b/Mk/bsd.default-versions.mk
@@ -93,7 +93,7 @@ MONO_DEFAULT=		5.10
 MYSQL_DEFAULT?=		5.7
 # Possible values: ninja, samurai
 NINJA_DEFAULT?=		ninja
-# Possible value: 14, 16, 18, lts, current
+# Possible value: 14, 16, 18, 19, current, lts (Note: current = 19 and lts = 18)
 NODEJS_DEFAULT?=    lts
 # Possible values: 5.32, 5.34, 5.36, devel
 .  if !exists(${LOCALBASE}/bin/perl) || (!defined(_PORTS_ENV_CHECK) && \
diff --git a/devel/node-thrift/Makefile b/devel/node-thrift/Makefile
index 2b2eb2ccf2c7..051dd420098b 100644
--- a/devel/node-thrift/Makefile
+++ b/devel/node-thrift/Makefile
@@ -1,6 +1,6 @@
 PORTNAME=	thrift
 PORTVERSION=	${THRIFT_PORTVERSION}
-PORTREVISION=	1
+PORTREVISION=	2
 CATEGORIES=	devel
 MASTER_SITES=	APACHE/thrift/${PORTVERSION}
 PKGNAMEPREFIX=	node-
diff --git a/devel/purescript-language-server/Makefile b/devel/purescript-language-server/Makefile
index 076934c6af01..0bcda3f69077 100644
--- a/devel/purescript-language-server/Makefile
+++ b/devel/purescript-language-server/Makefile
@@ -1,5 +1,6 @@
 PORTNAME=	purescript-language-server
 PORTVERSION=	0.17.1
+PORTREVISION=	1
 CATEGORIES=	devel textproc
 MASTER_SITES=	https://github.com/nwolverson/${PORTNAME}/releases/download/v${PORTVERSION}/
 DISTNAME=	${PORTNAME}.js
diff --git a/devel/rubygem-execjs/Makefile b/devel/rubygem-execjs/Makefile
index 8b98e931c300..55d93660927b 100644
--- a/devel/rubygem-execjs/Makefile
+++ b/devel/rubygem-execjs/Makefile
@@ -1,6 +1,6 @@
 PORTNAME=	execjs
 PORTVERSION=	2.8.1
-PORTREVISION=	2
+PORTREVISION=	3
 CATEGORIES=	devel rubygems
 MASTER_SITES=	RG
 
diff --git a/devel/sonar-scanner-cli/Makefile b/devel/sonar-scanner-cli/Makefile
index b529244cf66f..b4e9c7f8f7f5 100644
--- a/devel/sonar-scanner-cli/Makefile
+++ b/devel/sonar-scanner-cli/Makefile
@@ -1,6 +1,6 @@
 PORTNAME=	sonar-scanner-cli
 DISTVERSION=	4.4.0.2170
-PORTREVISION=	2
+PORTREVISION=	3
 CATEGORIES=	devel security www java
 MASTER_SITES=	https://binaries.sonarsource.com/Distribution/${PORTNAME}/
 
diff --git a/games/wipeclean/Makefile b/games/wipeclean/Makefile
index 04864a0d1439..e093ebca1968 100644
--- a/games/wipeclean/Makefile
+++ b/games/wipeclean/Makefile
@@ -1,5 +1,6 @@
 PORTNAME=	wipeclean
 PORTVERSION=	1.1.2
+PORTREVISION=	1
 PORTEPOCH=	1
 CATEGORIES=	games
 MASTER_SITES=	LOCAL/ehaupt
diff --git a/lang/coffeescript/Makefile b/lang/coffeescript/Makefile
index 835a2bc43b51..4514e5495a42 100644
--- a/lang/coffeescript/Makefile
+++ b/lang/coffeescript/Makefile
@@ -1,5 +1,6 @@
 PORTNAME=	coffeescript
 DISTVERSION=	2.7.0
+PORTREVISION=	1
 CATEGORIES=	lang
 
 MAINTAINER=	egypcio@FreeBSD.org
diff --git a/textproc/write-good/Makefile b/textproc/write-good/Makefile
index 6fa213987a3d..dd76b24c0f0f 100644
--- a/textproc/write-good/Makefile
+++ b/textproc/write-good/Makefile
@@ -1,6 +1,7 @@
 PORTNAME=	write-good
 DISTVERSIONPREFIX=	v
 DISTVERSION=	1.0.8
+PORTREVISION=	1
 CATEGORIES=	textproc
 MASTER_SITES=	LOCAL/0mp/:npm
 DISTFILES=	${_NPM_DISTFILES}
diff --git a/www/csso/Makefile b/www/csso/Makefile
index d5b5817d8611..4aef64bb76e0 100644
--- a/www/csso/Makefile
+++ b/www/csso/Makefile
@@ -1,7 +1,7 @@
 PORTNAME=	csso
 PORTVERSION=	1.3.9
 DISTVERSIONPREFIX=	v
-PORTREVISION=	2
+PORTREVISION=	3
 CATEGORIES=	www
 MASTER_SITES=	http://nivit.altervista.org/FreeBSD/ports/distfiles/
 
diff --git a/www/node/Makefile b/www/node/Makefile
index 3036858e8355..e8cdab80177b 100644
--- a/www/node/Makefile
+++ b/www/node/Makefile
@@ -1,100 +1,12 @@
 PORTNAME=	node
 PORTVERSION=	18.12.1
-DISTVERSIONPREFIX=	v
 CATEGORIES=	www
-MASTER_SITES=	https://nodejs.org/dist/v${PORTVERSION}/
 
 MAINTAINER=	sunpoet@FreeBSD.org
-COMMENT=	V8 JavaScript for client and server
-WWW=		https://nodejs.org/
+COMMENT=	V8 JavaScript for client and server (meta port)
+WWW=		https://nodejs.org/ \
+		https://github.com/nodejs/node
 
-LICENSE=	MIT
-LICENSE_FILE=	${WRKSRC}/LICENSE
-
-BROKEN_SSL=	libressl libressl-devel
-BROKEN_SSL_REASON=	Node.js ${PORTVERSION:R:R}.x requires OpenSSL 1.1.x or the BUNDLED_SSL option enabled
-ONLY_FOR_ARCHS=	aarch64 amd64 armv6 armv7 i386 powerpc64 powerpc64le
-
-BUILD_DEPENDS=	brotli>=1.0.9,1:archivers/brotli \
-		c-ares>=1.17.2:dns/c-ares \
-		libnghttp2>=1.45.1:www/libnghttp2 \
-		libuv>=1.42.0:devel/libuv \
-		objdump:devel/binutils
-LIB_DEPENDS=	libbrotlidec.so:archivers/brotli \
-		libcares.so:dns/c-ares \
-		libnghttp2.so:www/libnghttp2 \
-		libuv.so:devel/libuv
-
-USES=		compiler:c++11-lib gmake localbase pkgconfig python:3.6-3.10,build shebangfix
-
-CONFIGURE_ARGS=	--prefix=${PREFIX:S|^${DESTDIR}||} \
-		--shared-brotli \
-		--shared-cares \
-		--shared-libuv \
-		--shared-nghttp2 \
-		--shared-zlib \
-		--without-npm
-HAS_CONFIGURE=	yes
-MAKE_ENV=	CC.host="${CC}" \
-		CFLAGS.host="${CFLAGS}" \
-		CXX.host="${CXX}" \
-		CXXFLAGS.host="${CXXFLAGS}" \
-		LDFLAGS.host="${LDFLAGS}" \
-		LINK.host="${CXX}"
-REINPLACE_ARGS=	-i ''
-
-CONFLICTS_INSTALL=	node[0-9][0-9]
-
-SHEBANG_FILES=	deps/v8/third_party/inspector_protocol/*.py \
-		deps/v8/tools/*.py \
-		tools/*.py \
-		tools/inspector_protocol/*.py
-
-OPTIONS_DEFINE=	BUNDLED_SSL DOCS DTRACE NLS
-OPTIONS_DEFAULT=DTRACE
-.if !exists(/usr/sbin/dtrace)
-OPTIONS_EXCLUDE+=	DTRACE
-.endif
-OPTIONS_EXCLUDE_aarch64=	DTRACE
-# dt_modtext:/usr/src/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c(820): arm not implemented
-OPTIONS_EXCLUDE_armv6=		DTRACE
-OPTIONS_EXCLUDE_armv7=		DTRACE
-OPTIONS_EXCLUDE_powerpc64=	DTRACE
-OPTIONS_EXCLUDE_powerpc64le=	DTRACE
-OPTIONS_SUB=	yes
-BUNDLED_SSL_DESC=	Use bundled OpenSSL implementation from node.js
-
-BUNDLED_SSL_CONFIGURE_OFF=	--shared-openssl --openssl-use-def-ca-store
-BUNDLED_SSL_RUN_DEPENDS_OFF=	ca_root_nss>=0:security/ca_root_nss
-BUNDLED_SSL_USES_OFF=	ssl
-DTRACE_CONFIGURE_ON=	--with-dtrace
-NLS_BUILD_DEPENDS=	icu>=69.1:devel/icu
-NLS_CONFIGURE_ON=	--with-intl=system-icu
-NLS_LIB_DEPENDS=	libicui18n.so:devel/icu
-
-.include <bsd.port.options.mk>
-
-.if (defined(PPC_ABI) && ${PPC_ABI} == ELFv2) || ${ARCH} == powerpc64le
-EXTRA_PATCHES=	${PATCHDIR}/extra-patch-common.gypi
-.endif
-
-.if ${PORT_OPTIONS:MBUNDLED_SSL} && ${ARCH} != amd64
-CONFIGURE_ARGS+=--openssl-no-asm
-.endif
-
-post-patch:
-	@${REINPLACE_CMD} -e 's|/usr/local|${LOCALBASE}|' ${WRKSRC}/tools/v8_gypfiles/v8.gyp
-
-post-configure:
-	# Post-process Makefile and *.mk files created by node-gyp and remove
-	# all occurrences of -I${LOCALBASE}/include. C*FLAGS include this
-	# before all -I../deps/* for bundled code. This can cause build
-	# breakages if the dependency is installed in ${LOCALBASE}. The
-	# USES+=localbase # above will ensure that we pick up includes for real
-	# external dependencies.
-	${FIND} ${WRKSRC}/out -type f -print0 | ${XARGS} -0 ${REINPLACE_CMD} -e "s|-I${LOCALBASE}/include||g"
-
-post-install:
-	${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/node
+USES=		metaport nodejs:run
 
 .include <bsd.port.mk>
diff --git a/www/node/pkg-descr b/www/node/pkg-descr
index 68a2ca8a2b32..4920df91f200 100644
--- a/www/node/pkg-descr
+++ b/www/node/pkg-descr
@@ -1,4 +1,4 @@
-Node.js is a JavaScript runtime built on Chrome's V8 JavaScript
-engine. Node.js uses an event-driven, non-blocking I/O model that
-makes it lightweight and efficient. Node.js' package ecosystem,
-npm, is the largest ecosystem of open source libraries in the world.
+Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js
+uses an event-driven, non-blocking I/O model that makes it lightweight and
+efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open
+source libraries in the world.
diff --git a/www/node14/Makefile b/www/node14/Makefile
index ef25b61bbac5..037b8e969e62 100644
--- a/www/node14/Makefile
+++ b/www/node14/Makefile
@@ -49,7 +49,7 @@ MAKE_ENV+=	CC.host=${CC} \
 TEST_ARGS=	-i
 TEST_TARGET=	test-only
 
-CONFLICTS_INSTALL=	node node10 node16
+CONFLICTS_INSTALL=	node[0-9][0-9]
 
 PREFIX_RELDEST=	${PREFIX:S,^${DESTDIR},,}
 REINPLACE_ARGS=	-i ''
diff --git a/www/node16/Makefile b/www/node16/Makefile
index fd7ed9545b2c..fdec6b049e4e 100644
--- a/www/node16/Makefile
+++ b/www/node16/Makefile
@@ -50,7 +50,7 @@ COREPACK_CONFIGURE_OFF=	--without-corepack
 
 HAS_CONFIGURE=	yes
 
-CONFLICTS_INSTALL=	node10 node14 node
+CONFLICTS_INSTALL=	node[0-9][0-9]
 
 CONFIGURE_ARGS=	--prefix=${PREFIX_RELDEST} \
 		--without-npm \
diff --git a/www/node18/Makefile b/www/node18/Makefile
new file mode 100644
index 000000000000..c5494376f263
--- /dev/null
+++ b/www/node18/Makefile
@@ -0,0 +1,102 @@
+PORTNAME=	node
+PORTVERSION=	18.12.1
+DISTVERSIONPREFIX=	v
+CATEGORIES=	www
+MASTER_SITES=	https://nodejs.org/dist/v${PORTVERSION}/
+PKGNAMESUFFIX=	18
+
+MAINTAINER=	sunpoet@FreeBSD.org
+COMMENT=	V8 JavaScript for client and server
+WWW=		https://nodejs.org/ \
+		https://github.com/nodejs/node
+
+LICENSE=	MIT
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+BROKEN_SSL=	libressl libressl-devel
+BROKEN_SSL_REASON=	Node.js ${PORTVERSION:R:R}.x requires OpenSSL 1.1.x or the BUNDLED_SSL option enabled
+ONLY_FOR_ARCHS=	aarch64 amd64 armv6 armv7 i386 powerpc64 powerpc64le
+
+BUILD_DEPENDS=	brotli>=1.0.9,1:archivers/brotli \
+		c-ares>=1.17.2:dns/c-ares \
+		libnghttp2>=1.45.1:www/libnghttp2 \
+		libuv>=1.42.0:devel/libuv \
+		objdump:devel/binutils
+LIB_DEPENDS=	libbrotlidec.so:archivers/brotli \
+		libcares.so:dns/c-ares \
+		libnghttp2.so:www/libnghttp2 \
+		libuv.so:devel/libuv
+
+USES=		compiler:c++11-lib gmake localbase pkgconfig python:3.6-3.10,build shebangfix
+
+CONFIGURE_ARGS=	--prefix=${PREFIX:S|^${DESTDIR}||} \
+		--shared-brotli \
+		--shared-cares \
+		--shared-libuv \
+		--shared-nghttp2 \
+		--shared-zlib \
+		--without-npm
+HAS_CONFIGURE=	yes
+MAKE_ENV=	CC.host="${CC}" \
+		CFLAGS.host="${CFLAGS}" \
+		CXX.host="${CXX}" \
+		CXXFLAGS.host="${CXXFLAGS}" \
+		LDFLAGS.host="${LDFLAGS}" \
+		LINK.host="${CXX}"
+REINPLACE_ARGS=	-i ''
+
+CONFLICTS_INSTALL=	node[0-9][0-9]
+
+SHEBANG_FILES=	deps/v8/third_party/inspector_protocol/*.py \
+		deps/v8/tools/*.py \
+		tools/*.py \
+		tools/inspector_protocol/*.py
+
+OPTIONS_DEFINE=	BUNDLED_SSL DOCS DTRACE NLS
+OPTIONS_DEFAULT=DTRACE
+.if !exists(/usr/sbin/dtrace)
+OPTIONS_EXCLUDE+=	DTRACE
+.endif
+OPTIONS_EXCLUDE_aarch64=	DTRACE
+# dt_modtext:/usr/src/cddl/contrib/opensolaris/lib/libdtrace/common/dt_link.c(820): arm not implemented
+OPTIONS_EXCLUDE_armv6=		DTRACE
+OPTIONS_EXCLUDE_armv7=		DTRACE
+OPTIONS_EXCLUDE_powerpc64=	DTRACE
+OPTIONS_EXCLUDE_powerpc64le=	DTRACE
+OPTIONS_SUB=	yes
+BUNDLED_SSL_DESC=	Use bundled OpenSSL implementation from node.js
+
+BUNDLED_SSL_CONFIGURE_OFF=	--shared-openssl --openssl-use-def-ca-store
+BUNDLED_SSL_RUN_DEPENDS_OFF=	ca_root_nss>=0:security/ca_root_nss
+BUNDLED_SSL_USES_OFF=	ssl
+DTRACE_CONFIGURE_ON=	--with-dtrace
+NLS_BUILD_DEPENDS=	icu>=69.1:devel/icu
+NLS_CONFIGURE_ON=	--with-intl=system-icu
+NLS_LIB_DEPENDS=	libicui18n.so:devel/icu
+
+.include <bsd.port.options.mk>
+
+.if (defined(PPC_ABI) && ${PPC_ABI} == ELFv2) || ${ARCH} == powerpc64le
+EXTRA_PATCHES=	${PATCHDIR}/extra-patch-common.gypi
+.endif
+
+.if ${PORT_OPTIONS:MBUNDLED_SSL} && ${ARCH} != amd64
+CONFIGURE_ARGS+=--openssl-no-asm
+.endif
+
+post-patch:
+	@${REINPLACE_CMD} -e 's|/usr/local|${LOCALBASE}|' ${WRKSRC}/tools/v8_gypfiles/v8.gyp
+
+post-configure:
+	# Post-process Makefile and *.mk files created by node-gyp and remove
+	# all occurrences of -I${LOCALBASE}/include. C*FLAGS include this
+	# before all -I../deps/* for bundled code. This can cause build
+	# breakages if the dependency is installed in ${LOCALBASE}. The
+	# USES+=localbase # above will ensure that we pick up includes for real
+	# external dependencies.
+	${FIND} ${WRKSRC}/out -type f -print0 | ${XARGS} -0 ${REINPLACE_CMD} -e "s|-I${LOCALBASE}/include||g"
+
+post-install:
+	${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/node
+
+.include <bsd.port.mk>
diff --git a/www/node/distinfo b/www/node18/distinfo
similarity index 100%
rename from www/node/distinfo
rename to www/node18/distinfo
diff --git a/www/node/files/extra-patch-common.gypi b/www/node18/files/extra-patch-common.gypi
similarity index 100%
rename from www/node/files/extra-patch-common.gypi
rename to www/node18/files/extra-patch-common.gypi
diff --git a/www/node/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl-cl.gypi b/www/node18/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl-cl.gypi
similarity index 100%
rename from www/node/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl-cl.gypi
rename to www/node18/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl-cl.gypi
diff --git a/www/node/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl.gypi b/www/node18/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl.gypi
similarity index 100%
rename from www/node/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl.gypi
rename to www/node18/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl.gypi
diff --git a/www/node/files/patch-deps_openssl_openssl-cl__no__asm.gypi b/www/node18/files/patch-deps_openssl_openssl-cl__no__asm.gypi
similarity index 100%
rename from www/node/files/patch-deps_openssl_openssl-cl__no__asm.gypi
rename to www/node18/files/patch-deps_openssl_openssl-cl__no__asm.gypi
diff --git a/www/node/files/patch-deps_openssl_openssl__no__asm.gypi b/www/node18/files/patch-deps_openssl_openssl__no__asm.gypi
similarity index 100%
rename from www/node/files/patch-deps_openssl_openssl__no__asm.gypi
rename to www/node18/files/patch-deps_openssl_openssl__no__asm.gypi
diff --git a/www/node/files/patch-deps_v8_src_base_platform_platform-freebsd.cc b/www/node18/files/patch-deps_v8_src_base_platform_platform-freebsd.cc
similarity index 100%
rename from www/node/files/patch-deps_v8_src_base_platform_platform-freebsd.cc
rename to www/node18/files/patch-deps_v8_src_base_platform_platform-freebsd.cc
diff --git a/www/node/files/patch-deps_v8_src_codegen_arm_cpu-arm.cc b/www/node18/files/patch-deps_v8_src_codegen_arm_cpu-arm.cc
similarity index 100%
rename from www/node/files/patch-deps_v8_src_codegen_arm_cpu-arm.cc
rename to www/node18/files/patch-deps_v8_src_codegen_arm_cpu-arm.cc
diff --git a/www/node/files/patch-deps_v8_src_codegen_ppc_constants-ppc.h b/www/node18/files/patch-deps_v8_src_codegen_ppc_constants-ppc.h
similarity index 100%
rename from www/node/files/patch-deps_v8_src_codegen_ppc_constants-ppc.h
rename to www/node18/files/patch-deps_v8_src_codegen_ppc_constants-ppc.h
diff --git a/www/node/files/patch-deps_v8_src_libsampler_sampler.cc b/www/node18/files/patch-deps_v8_src_libsampler_sampler.cc
similarity index 100%
rename from www/node/files/patch-deps_v8_src_libsampler_sampler.cc
rename to www/node18/files/patch-deps_v8_src_libsampler_sampler.cc
diff --git a/www/node/files/patch-node.gypi b/www/node18/files/patch-node.gypi
similarity index 100%
rename from www/node/files/patch-node.gypi
rename to www/node18/files/patch-node.gypi
diff --git a/www/node/files/patch-src_cares__wrap.h b/www/node18/files/patch-src_cares__wrap.h
similarity index 100%
rename from www/node/files/patch-src_cares__wrap.h
rename to www/node18/files/patch-src_cares__wrap.h
diff --git a/www/node/files/patch-tools_v8__gypfiles_v8.gyp b/www/node18/files/patch-tools_v8__gypfiles_v8.gyp
similarity index 100%
rename from www/node/files/patch-tools_v8__gypfiles_v8.gyp
rename to www/node18/files/patch-tools_v8__gypfiles_v8.gyp
diff --git a/www/node18/pkg-descr b/www/node18/pkg-descr
new file mode 100644
index 000000000000..4920df91f200
--- /dev/null
+++ b/www/node18/pkg-descr
@@ -0,0 +1,4 @@
+Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js
+uses an event-driven, non-blocking I/O model that makes it lightweight and
+efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open
+source libraries in the world.
diff --git a/www/node/pkg-message b/www/node18/pkg-message
similarity index 100%
rename from www/node/pkg-message
rename to www/node18/pkg-message
diff --git a/www/node/pkg-plist b/www/node18/pkg-plist
similarity index 100%
rename from www/node/pkg-plist
rename to www/node18/pkg-plist
diff --git a/www/node19/Makefile b/www/node19/Makefile
new file mode 100644
index 000000000000..11e6131f95a6
--- /dev/null
+++ b/www/node19/Makefile
@@ -0,0 +1,91 @@
+PORTNAME=	node
+PORTVERSION=	19.2.0
+DISTVERSIONPREFIX=	v
+CATEGORIES=	www
+MASTER_SITES=	https://nodejs.org/dist/v${PORTVERSION}/
+PKGNAMESUFFIX=	19
+
+MAINTAINER=	sunpoet@FreeBSD.org
+COMMENT=	V8 JavaScript for client and server
+WWW=		https://nodejs.org/ \
+		https://github.com/nodejs/node
+
+LICENSE=	MIT
+LICENSE_FILE=	${WRKSRC}/LICENSE
+
+BROKEN_SSL=	libressl libressl-devel
+BROKEN_SSL_REASON=	Node.js ${PORTVERSION:R:R}.x requires OpenSSL 1.1.x or the BUNDLED_SSL option enabled
+ONLY_FOR_ARCHS=	aarch64 amd64 armv6 armv7 i386 powerpc64 powerpc64le
+
+BUILD_DEPENDS=	brotli>=1.0.9,1:archivers/brotli \
+		c-ares>=1.17.2:dns/c-ares \
+		libnghttp2>=1.45.1:www/libnghttp2 \
+		libuv>=1.42.0:devel/libuv \
+		objdump:devel/binutils
+LIB_DEPENDS=	libbrotlidec.so:archivers/brotli \
+		libcares.so:dns/c-ares \
+		libnghttp2.so:www/libnghttp2 \
+		libuv.so:devel/libuv
+
+USES=		compiler:c++11-lib gmake localbase pkgconfig python:3.6-3.10,build shebangfix
+
+CONFIGURE_ARGS=	--prefix=${PREFIX:S|^${DESTDIR}||} \
+		--shared-brotli \
+		--shared-cares \
+		--shared-libuv \
+		--shared-nghttp2 \
+		--shared-zlib \
+		--without-npm
+HAS_CONFIGURE=	yes
+MAKE_ENV=	CC.host="${CC}" \
+		CFLAGS.host="${CFLAGS}" \
+		CXX.host="${CXX}" \
+		CXXFLAGS.host="${CXXFLAGS}" \
+		LDFLAGS.host="${LDFLAGS}" \
+		LINK.host="${CXX}"
+REINPLACE_ARGS=	-i ''
+
+CONFLICTS_INSTALL=	node[0-9][0-9]
+
+SHEBANG_FILES=	deps/v8/third_party/inspector_protocol/*.py \
+		deps/v8/tools/*.py \
+		tools/*.py \
+		tools/inspector_protocol/*.py
+
+OPTIONS_DEFINE=	BUNDLED_SSL DOCS NLS
+OPTIONS_SUB=	yes
+BUNDLED_SSL_DESC=	Use bundled OpenSSL implementation from node.js
+
+BUNDLED_SSL_CONFIGURE_OFF=	--shared-openssl --openssl-use-def-ca-store
+BUNDLED_SSL_RUN_DEPENDS_OFF=	ca_root_nss>=0:security/ca_root_nss
+BUNDLED_SSL_USES_OFF=	ssl
+NLS_BUILD_DEPENDS=	icu>=69.1:devel/icu
+NLS_CONFIGURE_ON=	--with-intl=system-icu
+NLS_LIB_DEPENDS=	libicui18n.so:devel/icu
+
+.include <bsd.port.options.mk>
+
+.if (defined(PPC_ABI) && ${PPC_ABI} == ELFv2) || ${ARCH} == powerpc64le
+EXTRA_PATCHES=	${PATCHDIR}/extra-patch-common.gypi
+.endif
+
+.if ${PORT_OPTIONS:MBUNDLED_SSL} && ${ARCH} != amd64
+CONFIGURE_ARGS+=--openssl-no-asm
+.endif
+
+post-patch:
+	@${REINPLACE_CMD} -e 's|/usr/local|${LOCALBASE}|' ${WRKSRC}/tools/v8_gypfiles/v8.gyp
+
+post-configure:
+	# Post-process Makefile and *.mk files created by node-gyp and remove
+	# all occurrences of -I${LOCALBASE}/include. C*FLAGS include this
+	# before all -I../deps/* for bundled code. This can cause build
+	# breakages if the dependency is installed in ${LOCALBASE}. The
+	# USES+=localbase # above will ensure that we pick up includes for real
+	# external dependencies.
+	${FIND} ${WRKSRC}/out -type f -print0 | ${XARGS} -0 ${REINPLACE_CMD} -e "s|-I${LOCALBASE}/include||g"
+
+post-install:
+	${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/node
+
+.include <bsd.port.mk>
diff --git a/www/node19/distinfo b/www/node19/distinfo
new file mode 100644
index 000000000000..c00d7db42d0d
--- /dev/null
+++ b/www/node19/distinfo
@@ -0,0 +1,3 @@
+TIMESTAMP = 1669824538
+SHA256 (node-v19.2.0.tar.gz) = aac9d1a366fb57d68f4639f9204d1de5d6387656959a97ed929a5ba9e62c033a
+SIZE (node-v19.2.0.tar.gz) = 84099370
diff --git a/www/node19/files/extra-patch-common.gypi b/www/node19/files/extra-patch-common.gypi
new file mode 100644
index 000000000000..8e817a2959c9
--- /dev/null
+++ b/www/node19/files/extra-patch-common.gypi
@@ -0,0 +1,13 @@
+--- common.gypi.orig	2019-10-01 15:32:40.000000000 +0200
++++ common.gypi	2019-10-16 12:47:09.236138000 +0200
+@@ -390,8 +390,8 @@
+             'ldflags': [ '-m32' ],
+           }],
+           [ 'target_arch=="ppc64" and OS!="aix"', {
+-            'cflags': [ '-m64', '-mminimal-toc' ],
+-            'ldflags': [ '-m64' ],
++            'cflags': [ '-m64' ],
++            'ldflags': [ '-m64' ],
+           }],
+           [ 'target_arch=="s390x"', {
+             'cflags': [ '-m64', '-march=z196' ],
diff --git a/www/node19/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl-cl.gypi b/www/node19/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl-cl.gypi
new file mode 100644
index 000000000000..f637cc2e3ee9
--- /dev/null
+++ b/www/node19/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl-cl.gypi
@@ -0,0 +1,11 @@
+--- deps/openssl/config/archs/linux-elf/no-asm/openssl-cl.gypi.orig	2021-10-19 00:48:28 UTC
++++ deps/openssl/config/archs/linux-elf/no-asm/openssl-cl.gypi
+@@ -13,7 +13,7 @@
+       '-Wall -O3 -fomit-frame-pointer',
+     ],
+     'openssl_ex_libs_linux-elf': [
+-      '-ldl -pthread',
++      '-pthread',
+     ],
+     'openssl_cli_srcs_linux-elf': [
+       'openssl/apps/lib/cmp_mock_srv.c',
diff --git a/www/node19/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl.gypi b/www/node19/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl.gypi
new file mode 100644
index 000000000000..271bebf2f6b0
--- /dev/null
+++ b/www/node19/files/patch-deps_openssl_config_archs_linux-elf_no-asm_openssl.gypi
@@ -0,0 +1,11 @@
+--- deps/openssl/config/archs/linux-elf/no-asm/openssl.gypi.orig	2021-10-19 00:48:28 UTC
++++ deps/openssl/config/archs/linux-elf/no-asm/openssl.gypi
+@@ -980,7 +980,7 @@
+       '-Wall -O3 -fomit-frame-pointer',
+     ],
+     'openssl_ex_libs_linux-elf': [
+-      '-ldl -pthread',
++      '-pthread',
+     ],
+   },
+   'include_dirs': [
diff --git a/www/node19/files/patch-deps_openssl_openssl-cl__no__asm.gypi b/www/node19/files/patch-deps_openssl_openssl-cl__no__asm.gypi
new file mode 100644
index 000000000000..c2508ad0064f
--- /dev/null
+++ b/www/node19/files/patch-deps_openssl_openssl-cl__no__asm.gypi
@@ -0,0 +1,17 @@
+--- deps/openssl/openssl-cl_no_asm.gypi.orig	2022-07-26 14:30:08 UTC
++++ deps/openssl/openssl-cl_no_asm.gypi
+@@ -1,4 +1,5 @@
+ {
++  'defines': ['OPENSSL_NO_ASM'],
+   'conditions': [
+     ['target_arch=="ppc64" and OS=="aix"', {
+       'includes': ['config/archs/aix64-gcc-as/no-asm/openssl-cl.gypi'],
+@@ -43,7 +44,7 @@
+       'includes': ['config/archs/linux64-riscv64/no-asm/openssl-cl.gypi'],
+     }, {
+       # Other architectures don't use assembly
+-      'includes': ['config/archs/linux-x86_64/no-asm/openssl-cl.gypi'],
++      'includes': ['config/archs/linux-elf/no-asm/openssl-cl.gypi'],
+     }],
+   ],
+ }
diff --git a/www/node19/files/patch-deps_openssl_openssl__no__asm.gypi b/www/node19/files/patch-deps_openssl_openssl__no__asm.gypi
new file mode 100644
index 000000000000..1fef0c4ca71f
--- /dev/null
+++ b/www/node19/files/patch-deps_openssl_openssl__no__asm.gypi
@@ -0,0 +1,11 @@
+--- deps/openssl/openssl_no_asm.gypi.orig	2020-09-08 12:17:11 UTC
++++ deps/openssl/openssl_no_asm.gypi
+@@ -48,7 +48,7 @@
+       'includes': ['config/archs/linux64-mips64/no-asm/openssl.gypi'],
+     }, {
+       # Other architectures don't use assembly
+-      'includes': ['config/archs/linux-x86_64/no-asm/openssl.gypi'],
++      'includes': ['config/archs/linux-elf/no-asm/openssl.gypi'],
+     }],
+   ],
+ }
diff --git a/www/node19/files/patch-deps_v8_src_base_platform_platform-freebsd.cc b/www/node19/files/patch-deps_v8_src_base_platform_platform-freebsd.cc
new file mode 100644
index 000000000000..3e173b2811f3
--- /dev/null
+++ b/www/node19/files/patch-deps_v8_src_base_platform_platform-freebsd.cc
@@ -0,0 +1,13 @@
+--- deps/v8/src/base/platform/platform-freebsd.cc.orig	2020-06-30 17:49:16 UTC
++++ deps/v8/src/base/platform/platform-freebsd.cc
+@@ -82,8 +82,8 @@ std::vector<OS::SharedLibraryAddress> OS::GetSharedLib
+             lib_name = std::string(path);
+           }
+           result.push_back(SharedLibraryAddress(
+-              lib_name, reinterpret_cast<uintptr_t>(map->kve_start),
+-              reinterpret_cast<uintptr_t>(map->kve_end)));
++              lib_name, static_cast<uintptr_t>(map->kve_start),
++              static_cast<uintptr_t>(map->kve_end)));
+         }
+ 
+         start += ssize;
diff --git a/www/node19/files/patch-deps_v8_src_codegen_arm_cpu-arm.cc b/www/node19/files/patch-deps_v8_src_codegen_arm_cpu-arm.cc
new file mode 100644
index 000000000000..4bbfd3df2781
--- /dev/null
+++ b/www/node19/files/patch-deps_v8_src_codegen_arm_cpu-arm.cc
@@ -0,0 +1,18 @@
+--- deps/v8/src/codegen/arm/cpu-arm.cc.orig	2022-04-19 16:03:40 UTC
++++ deps/v8/src/codegen/arm/cpu-arm.cc
+@@ -2,12 +2,15 @@
+ // Use of this source code is governed by a BSD-style license that can be
+ // found in the LICENSE file.
+ 
++#include "include/v8config.h"
++
+ // CPU specific code for arm independent of OS goes here.
+ #ifdef __arm__
+ #ifdef __QNXNTO__
+ #include <sys/mman.h>  // for cache flushing.
+ #undef MAP_TYPE
+ #elif V8_OS_FREEBSD
++#include <sys/cdefs.h>
+ #include <machine/sysarch.h>  // for cache flushing
+ #include <sys/types.h>
+ #elif V8_OS_STARBOARD
diff --git a/www/node19/files/patch-deps_v8_src_codegen_ppc_constants-ppc.h b/www/node19/files/patch-deps_v8_src_codegen_ppc_constants-ppc.h
new file mode 100644
index 000000000000..449278ef9271
--- /dev/null
+++ b/www/node19/files/patch-deps_v8_src_codegen_ppc_constants-ppc.h
@@ -0,0 +1,20 @@
+--- deps/v8/src/codegen/ppc/constants-ppc.h.orig	2020-06-30 17:49:17 UTC
++++ deps/v8/src/codegen/ppc/constants-ppc.h
+@@ -36,7 +36,7 @@
+ #endif
+ 
+ #if !(V8_HOST_ARCH_PPC || V8_HOST_ARCH_PPC64) || !V8_TARGET_ARCH_PPC64 || \
+-    V8_TARGET_LITTLE_ENDIAN || (defined(_CALL_ELF) && _CALL_ELF == 2)
++    (defined(_CALL_ELF) && _CALL_ELF == 2)
+ #define ABI_RETURNS_OBJECT_PAIRS_IN_REGS 1
+ #else
+ #define ABI_RETURNS_OBJECT_PAIRS_IN_REGS 0
+@@ -44,7 +44,7 @@
+ 
+ #if !(V8_HOST_ARCH_PPC || V8_HOST_ARCH_PPC64) || \
+     (V8_TARGET_ARCH_PPC64 &&                     \
+-     (V8_TARGET_LITTLE_ENDIAN || (defined(_CALL_ELF) && _CALL_ELF == 2)))
++     (defined(_CALL_ELF) && _CALL_ELF == 2))
+ #define ABI_CALL_VIA_IP 1
+ #else
+ #define ABI_CALL_VIA_IP 0
diff --git a/www/node19/files/patch-deps_v8_src_libsampler_sampler.cc b/www/node19/files/patch-deps_v8_src_libsampler_sampler.cc
new file mode 100644
index 000000000000..4a1f24a4a3c4
--- /dev/null
+++ b/www/node19/files/patch-deps_v8_src_libsampler_sampler.cc
@@ -0,0 +1,13 @@
+--- deps/v8/src/libsampler/sampler.cc.orig	2021-10-19 00:48:30 UTC
++++ deps/v8/src/libsampler/sampler.cc
+@@ -497,6 +497,10 @@ void SignalHandler::FillRegisterState(void* context, R
+   state->pc = reinterpret_cast<void*>(mcontext.__gregs[_REG_PC]);
+   state->sp = reinterpret_cast<void*>(mcontext.__gregs[_REG_SP]);
+   state->fp = reinterpret_cast<void*>(mcontext.__gregs[_REG_FP]);
++#elif V8_TARGET_ARCH_PPC64
++  state->pc = reinterpret_cast<void*>(mcontext.mc_srr0);
++  state->sp = reinterpret_cast<void*>(mcontext.mc_frame[1]);
++  state->fp = reinterpret_cast<void*>(mcontext.mc_frame[31]);
+ #endif  // V8_HOST_ARCH_*
+ #elif V8_OS_NETBSD
+ #if V8_HOST_ARCH_IA32
diff --git a/www/node19/files/patch-node.gypi b/www/node19/files/patch-node.gypi
new file mode 100644
index 000000000000..f48b5b1091cb
--- /dev/null
+++ b/www/node19/files/patch-node.gypi
@@ -0,0 +1,12 @@
+--- node.gypi.orig	2021-10-19 00:48:32 UTC
++++ node.gypi
+@@ -319,6 +319,9 @@
+     [ 'node_use_openssl=="true"', {
+       'defines': [ 'HAVE_OPENSSL=1' ],
+       'conditions': [
++        ['openssl_no_asm==1', {
++          'defines': [ 'OPENSSL_NO_ASM' ],
++        }],
+         [ 'node_shared_openssl=="false"', {
+           'defines': [ 'OPENSSL_API_COMPAT=0x10100000L', ],
+           'dependencies': [
diff --git a/www/node19/files/patch-src_cares__wrap.h b/www/node19/files/patch-src_cares__wrap.h
new file mode 100644
index 000000000000..7f57f6d8b333
--- /dev/null
+++ b/www/node19/files/patch-src_cares__wrap.h
@@ -0,0 +1,11 @@
+--- src/cares_wrap.h.orig	2021-08-18 22:13:12 UTC
++++ src/cares_wrap.h
+@@ -22,7 +22,7 @@
+ # include <netdb.h>
+ #endif  // __POSIX__
+ 
+-# include <ares_nameser.h>
++# include <arpa/nameser.h>
+ 
+ namespace node {
+ namespace cares_wrap {
diff --git a/www/node19/files/patch-tools_v8__gypfiles_v8.gyp b/www/node19/files/patch-tools_v8__gypfiles_v8.gyp
new file mode 100644
index 000000000000..a37d30b37981
--- /dev/null
+++ b/www/node19/files/patch-tools_v8__gypfiles_v8.gyp
@@ -0,0 +1,11 @@
+--- tools/v8_gypfiles/v8.gyp.orig	2022-11-14 02:26:08 UTC
++++ tools/v8_gypfiles/v8.gyp
+@@ -975,7 +975,7 @@
+         }],
+         # Platforms that don't have Compare-And-Swap (CAS) support need to link atomic library
+         # to implement atomic memory access
+-        ['v8_current_cpu in ["mips64", "mips64el", "ppc", "arm", "riscv64", "loong64"]', {
++        ['v8_current_cpu in ["mips64", "mips64el", "ppc", "riscv64", "loong64"]', {
+           'link_settings': {
+             'libraries': ['-latomic', ],
+           },
diff --git a/www/node19/pkg-descr b/www/node19/pkg-descr
new file mode 100644
index 000000000000..4920df91f200
--- /dev/null
+++ b/www/node19/pkg-descr
@@ -0,0 +1,4 @@
+Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js
+uses an event-driven, non-blocking I/O model that makes it lightweight and
+efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open
+source libraries in the world.
*** 2702 LINES SKIPPED ***