From d9658f7657722d545f1e6325a18c1745bcf72b98f82db1644ea724db69623065 Mon Sep 17 00:00:00 2001
From: OBS User unknown <null@suse.de>
Date: Wed, 22 Jan 2025 11:01:56 +0000
Subject: [PATCH] 
 [info=604d97274942396e3e03c2c2c6a6edd2aa64bbf67e33f6a9c68bdbef05449ac7]

OBS-URL: https://build.opensuse.org/package/show/devel:languages:nodejs/nodejs22?expand=0&rev=29
---
 .gitattributes                        |   23 +
 .gitignore                            |    1 +
 CVE-2024-21538.patch                  |   46 +
 SHASUMS256.txt                        |   41 +
 SHASUMS256.txt.sig                    |  Bin 0 -> 438 bytes
 _constraints                          |   32 +
 _scmsync.obsinfo                      |    3 +
 bash_output_helper.bash               |   16 +
 cares_public_headers.patch            |   13 +
 fix_ci_tests.patch                    |  129 +++
 flaky_test_rerun.patch                |   21 +
 gcc13.patch                           |   36 +
 icu76.1.patch                         |   13 +
 legacy_python.patch                   |   26 +
 linker_lto_jobs.patch                 |   25 +
 manual_configure.patch                |   20 +
 node-gyp-addon-gypi.patch             |  112 +++
 node-v22.11.0.tar.xz                  |    3 +
 node-v22.12.0.tar.xz                  |    3 +
 node-v22.13.0.tar.xz                  |    3 +
 node-v22.13.1.tar.xz                  |    3 +
 node-v22.3.0.tar.xz                   |    3 +
 node_modules.tar.xz                   |    3 +
 nodejs-libpath.patch                  |   54 ++
 nodejs.keyring                        |  Bin 0 -> 17430 bytes
 nodejs22.changes                      |  228 +++++
 nodejs22.spec                         | 1160 +++++++++++++++++++++++++
 npm_search_paths.patch                |   32 +
 old_cares.patch                       |  155 ++++
 openssl_binary_detection.patch        |   42 +
 qemu_timeouts_arches.patch            |   14 +
 sle12_python3_compat.patch            |   35 +
 test-skip-y2038-on-32bit-time_t.patch |   45 +
 update_npm_tarball.sh                 |   13 +
 v8-i586.patch                         |   40 +
 versioned.patch                       |  227 +++++
 36 files changed, 2620 insertions(+)
 create mode 100644 .gitattributes
 create mode 100644 .gitignore
 create mode 100644 CVE-2024-21538.patch
 create mode 100644 SHASUMS256.txt
 create mode 100644 SHASUMS256.txt.sig
 create mode 100644 _constraints
 create mode 100644 _scmsync.obsinfo
 create mode 100644 bash_output_helper.bash
 create mode 100644 cares_public_headers.patch
 create mode 100644 fix_ci_tests.patch
 create mode 100644 flaky_test_rerun.patch
 create mode 100644 gcc13.patch
 create mode 100644 icu76.1.patch
 create mode 100644 legacy_python.patch
 create mode 100644 linker_lto_jobs.patch
 create mode 100644 manual_configure.patch
 create mode 100644 node-gyp-addon-gypi.patch
 create mode 100644 node-v22.11.0.tar.xz
 create mode 100644 node-v22.12.0.tar.xz
 create mode 100644 node-v22.13.0.tar.xz
 create mode 100644 node-v22.13.1.tar.xz
 create mode 100644 node-v22.3.0.tar.xz
 create mode 100644 node_modules.tar.xz
 create mode 100644 nodejs-libpath.patch
 create mode 100644 nodejs.keyring
 create mode 100644 nodejs22.changes
 create mode 100644 nodejs22.spec
 create mode 100644 npm_search_paths.patch
 create mode 100644 old_cares.patch
 create mode 100644 openssl_binary_detection.patch
 create mode 100644 qemu_timeouts_arches.patch
 create mode 100644 sle12_python3_compat.patch
 create mode 100644 test-skip-y2038-on-32bit-time_t.patch
 create mode 100644 update_npm_tarball.sh
 create mode 100644 v8-i586.patch
 create mode 100644 versioned.patch

diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..9b03811
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,23 @@
+## Default LFS
+*.7z filter=lfs diff=lfs merge=lfs -text
+*.bsp filter=lfs diff=lfs merge=lfs -text
+*.bz2 filter=lfs diff=lfs merge=lfs -text
+*.gem filter=lfs diff=lfs merge=lfs -text
+*.gz filter=lfs diff=lfs merge=lfs -text
+*.jar filter=lfs diff=lfs merge=lfs -text
+*.lz filter=lfs diff=lfs merge=lfs -text
+*.lzma filter=lfs diff=lfs merge=lfs -text
+*.obscpio filter=lfs diff=lfs merge=lfs -text
+*.oxt filter=lfs diff=lfs merge=lfs -text
+*.pdf filter=lfs diff=lfs merge=lfs -text
+*.png filter=lfs diff=lfs merge=lfs -text
+*.rpm filter=lfs diff=lfs merge=lfs -text
+*.tbz filter=lfs diff=lfs merge=lfs -text
+*.tbz2 filter=lfs diff=lfs merge=lfs -text
+*.tgz filter=lfs diff=lfs merge=lfs -text
+*.ttf filter=lfs diff=lfs merge=lfs -text
+*.txz filter=lfs diff=lfs merge=lfs -text
+*.whl filter=lfs diff=lfs merge=lfs -text
+*.xz filter=lfs diff=lfs merge=lfs -text
+*.zip filter=lfs diff=lfs merge=lfs -text
+*.zst filter=lfs diff=lfs merge=lfs -text
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..57affb6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.osc
diff --git a/CVE-2024-21538.patch b/CVE-2024-21538.patch
new file mode 100644
index 0000000..2e1b0de
--- /dev/null
+++ b/CVE-2024-21538.patch
@@ -0,0 +1,46 @@
+Applied following patches,
+
+From 5ff3a07d9add449021d806e45c4168203aa833ff Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andr=C3=A9=20Cruz?= <andremiguelcruz@msn.com>
+Date: Wed, 6 Nov 2024 22:02:49 +0000
+Subject: [PATCH] fix: disable regexp backtracking (#160)
+
+---
+ lib/util/escape.js | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+
+From 640d391fde65388548601d95abedccc12943374f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andr=C3=A9=20Cruz?= <andre.cruz@uphold.com>
+Date: Thu, 7 Nov 2024 12:50:38 +0000
+Subject: [PATCH] fix: fix escaping bug introduced by backtracking
+
+---
+ lib/util/escape.js | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+
+Index: node-v18.20.5/deps/npm/node_modules/cross-spawn/lib/util/escape.js
+===================================================================
+--- node-v18.20.5.orig/deps/npm/node_modules/cross-spawn/lib/util/escape.js
++++ node-v18.20.5/deps/npm/node_modules/cross-spawn/lib/util/escape.js
+@@ -15,15 +15,17 @@ function escapeArgument(arg, doubleEscap
+     arg = `${arg}`;
+ 
+     // Algorithm below is based on https://qntm.org/cmd
++    // It's slightly altered to disable JS backtracking to avoid hanging on specially crafted input
++    // Please see https://github.com/moxystudio/node-cross-spawn/pull/160 for more information
+ 
+     // Sequence of backslashes followed by a double quote:
+     // double up all the backslashes and escape the double quote
+-    arg = arg.replace(/(\\*)"/g, '$1$1\\"');
++    arg = arg.replace(/(?=(\\+?)?)\1"/g, '$1$1\\"');
+ 
+     // Sequence of backslashes followed by the end of the string
+     // (which will become a double quote later):
+     // double up all the backslashes
+-    arg = arg.replace(/(\\*)$/, '$1$1');
++    arg = arg.replace(/(?=(\\+?)?)\1$/, '$1$1');
+ 
+     // All other backslashes occur literally
+ 
diff --git a/SHASUMS256.txt b/SHASUMS256.txt
new file mode 100644
index 0000000..c898906
--- /dev/null
+++ b/SHASUMS256.txt
@@ -0,0 +1,41 @@
+ed52239294ad517fbe91a268146d5d2aa8a17d2d62d64873e43219078ba71c4e  node-v22.13.1-aix-ppc64.tar.gz
+be127be1d98cad94c56f46245d0f2de89934d300028694456861a6d5ac558bf3  node-v22.13.1-arm64.msi
+97483ff4361d239a56d038c6335767a56a291e78c10f07446f463f05d9d19b89  node-v22.13.1-darwin-arm64.tar.gz
+9c169a9369f6c667a4de6b14c7492065adbae0fa830ef4c666bea2c53ac7b576  node-v22.13.1-darwin-arm64.tar.xz
+6fdcc8412d434664238b0651ebd5ad55d15a08598ff42dcb6d9cf1d434a6c4be  node-v22.13.1-darwin-x64.tar.gz
+cbc49a2f179ec51f3a7d49f91b05e16db2ea8ea4ca586e1e370d19661becf0eb  node-v22.13.1-darwin-x64.tar.xz
+f9cde9ace585c3979f1b4ee247914f35fae6e7b7eabc6a40961f89ad39e78964  node-v22.13.1-headers.tar.gz
+2722236564df6d33b1d953f23e21bf5247b62b38ea9000b47c655ee3a9a440e7  node-v22.13.1-headers.tar.xz
+911d9c07af38c82be22cd0a3db613aabc578ba940b35380aeedadd6d48070bc1  node-v22.13.1-linux-arm64.tar.gz
+0a237c413ccbab920640438bf6e1a32edb19845bdc21f0e1cd5b91545ce1c126  node-v22.13.1-linux-arm64.tar.xz
+82be9fa5e74ee29d7342d38306dbee19d3e2239b5b753870c04fd03768916a7e  node-v22.13.1-linux-armv7l.tar.gz
+f2be8dca2a7a518f6d187aa4b18abbeeafd71096a6d95f73f4d8bc0f8d2394ea  node-v22.13.1-linux-armv7l.tar.xz
+e4d34550d791cc809cfbfe8d0e3082634796add404169484b0849fbae0714576  node-v22.13.1-linux-ppc64le.tar.gz
+377a7a1ea66f39251e1657f419e9404d526fcca9910620d0ecf0a870c6308f6b  node-v22.13.1-linux-ppc64le.tar.xz
+56375cf2c827a425d708bd0322fd635b6f2038e272468395f4e160e1ea4ae91e  node-v22.13.1-linux-s390x.tar.gz
+22da01dbcead3ef7e69de6c1310a1c5c485039631f731a6ff0c35530cf5c811b  node-v22.13.1-linux-s390x.tar.xz
+666148b9fe0c7e1301cc1b029e33a45e9e4a893f68d2d2bb1cc88a931a88a004  node-v22.13.1-linux-x64.tar.gz
+0d2a5af33c7deab5555c8309cd3f373446fe1526c1b95833935ab3f019733b3b  node-v22.13.1-linux-x64.tar.xz
+620a7b4008aa0406678987ce2dd22458a38bae163fe7c69fd243f1204725e6c2  node-v22.13.1.pkg
+e7d5b1e84e7f3c3cebda81e2b138469eef41ba4ecf16a87fd15fc3f7afa3f701  node-v22.13.1.tar.gz
+cfce282119390f7e0c2220410924428e90dadcb2df1744c0c4a0e7baae387cc2  node-v22.13.1.tar.xz
+b2c537f24a725d7e6058d23b1b89bbf31e6c7299b51ac31e9c25dc3c6a61e2d9  node-v22.13.1-win-arm64.7z
+db6d3d28e1b34acdbd9db7bac5ec37980e07e48a6a2edcd3747d605fc8a5468e  node-v22.13.1-win-arm64.zip
+d495abe2ae53962065fad979814259735fd90a4e03c6b94ccd3e32bc933aeda5  node-v22.13.1-win-x64.7z
+398a61e250a5584a62a5959e2f69f5d597fc83f1a5ebe3ed8fff29ba39d55f14  node-v22.13.1-win-x64.zip
+3c87ddd4aac7f980ed11caf97942bd87a647ce61d644ca08321508836b3d1899  node-v22.13.1-win-x86.7z
+504ed03c8596dfeabddfcd0736f987be93e3330a5c690306dedacef8880b592c  node-v22.13.1-win-x86.zip
+821566022dc3b262ac2f76598ee4f46003a6edafe5dadb84e5fbc7daaa1a78c7  node-v22.13.1-x64.msi
+79c36ea6aa2ede10b416bdae55b568ab31798ede2697440b266312bba95ef580  node-v22.13.1-x86.msi
+afb7dcd60c7557843e5c2777205564950544297ba0588faa2aae573ccb735767  win-arm64/node.exe
+988eb8c60a5ade17e652dbdb60d56d3c6ad5e599a99ce04932b8c4c86583cdaf  win-arm64/node.lib
+b19efd6f54283a2c01027f0e74e54563d06495b87efe08d111e1a176afd14d02  win-arm64/node_pdb.7z
+0bb490f44fc575dd570326fae9f0a5fca1187bfc342f57a50084ef86aa2e6679  win-arm64/node_pdb.zip
+8f6945c55a51c893691534e7163372e4cedb62c8ad80a2a975df3f14a19fba16  win-x64/node.exe
+65e45757c026c93a170743a811ef1b921ae12d6d9dd62d258bbbca0626687626  win-x64/node.lib
+2ad1af26e2f78247473e1e05f78fff3be7401f47c327f45602c84dce5d552cc0  win-x64/node_pdb.7z
+31099d09933aad429c36071503cd200eb66c41529524ac159873f97d9f097c83  win-x64/node_pdb.zip
+0b7071f0a7d90d4e1567d94a37c5d94441a3ca71a4eaa9596bc06e992c06e9c8  win-x86/node.exe
+79bae10059e833ce7fa4de05e5601034461327e2e7cb75c2144b87d4ab5ac547  win-x86/node.lib
+c3fb150e58d16dadd95c24c8a0a4c020a18b3c852b63e36df39587a301512ca4  win-x86/node_pdb.7z
+97890935271fe117a745584ca710f0fcd38bbf24b8c920800411df87a3e22dc3  win-x86/node_pdb.zip
diff --git a/SHASUMS256.txt.sig b/SHASUMS256.txt.sig
new file mode 100644
index 0000000000000000000000000000000000000000000000000000000000000000..170004ea64be9f3231b19baac2c0c1bf81b2c96008d98cb53c4420c5f7d31414
GIT binary patch
literal 438
zcmV;n0ZIOe0kZ@E0SEvc79j+Q3<%qWc@{734f)%P>a^d_RbKQ30%woWwEzkU5R2-x
z-_KQE^bnQ|0E<1>?AkeM0~T40hpap&dB}XRr)U1)Cq&B2OfZzKSeR);)KyTSR_@%I
zK(?Fheb?*hOlWMHHGN;qCfQ#m5mviB`9&(@$UuG{g_c`;D2t+VgYB*85$nGgX|z%S
z&9sFEe`99ByGfa;5twes+izOwoP)>8tbtl`w{}l#^Hx~~j3oIeag}}ElZIAp+st=a
zZJMWY+NSV0qUG^79TIpYDgmI)sz^ql0R;8xV|ZqE0Sa@>4<HZOC&{Pa4VRx_2K0T1
zIkXF^m^4tz#8XG$KRh3?e3b+zd++uC2hI`&S(lbuK3XYf4Kt@`htn_<e>UN@*q2ou
z%h5i*i5nOPgvlAAyr)}6w66epI`qgCJ6DfhN%<^wRe}JUmSt*A5mf=s2&IY#HC1zN
zC0AT;K>BI^HehgJGhK=}Do&i*izM_>)=7UL&Ad+}Y9SER6jrqe^=IG4+=A#om6)5x
ghKXMG5S-E<892s|362N6UYyBm-Cf}6VFdbiCu|zbfdBvi

literal 0
HcmV?d00001

diff --git a/_constraints b/_constraints
new file mode 100644
index 0000000..3891a8f
--- /dev/null
+++ b/_constraints
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<constraints>
+  <hardware>
+   <disk>
+    <size unit="G">8</size>
+   </disk>
+   <physicalmemory>
+    <size unit="M">10000</size>
+   </physicalmemory>
+  </hardware>
+  <overwrite>
+    <conditions>
+      <arch>aarch64</arch>
+    </conditions>
+    <hardware>
+      <cpu>
+        <flag>asimdrdm</flag>
+      </cpu>
+    </hardware>
+  </overwrite>
+  <overwrite>
+    <conditions>
+      <arch>armv6l</arch>
+      <arch>armv7l</arch>
+    </conditions>
+    <hardware>
+      <physicalmemory>
+        <size unit="G">5</size>
+      </physicalmemory>
+    </hardware>
+  </overwrite>
+</constraints>
diff --git a/_scmsync.obsinfo b/_scmsync.obsinfo
new file mode 100644
index 0000000..e943b84
--- /dev/null
+++ b/_scmsync.obsinfo
@@ -0,0 +1,3 @@
+mtime: 1737543704
+commit: 604d97274942396e3e03c2c2c6a6edd2aa64bbf67e33f6a9c68bdbef05449ac7
+url: https://src.opensuse.org/nodejs/nodejs22.git
diff --git a/bash_output_helper.bash b/bash_output_helper.bash
new file mode 100644
index 0000000..9b22c82
--- /dev/null
+++ b/bash_output_helper.bash
@@ -0,0 +1,16 @@
+#
+# Node can break stdin/stdout/stderr by setting them O_NONBLOCK
+# and then not resetting it back to blocking mode on exit
+# This function redirects stdio descriptors via new logging pipe
+#
+
+
+function decoupled_cmd
+{
+   mkfifo _log
+   ($@) < /dev/null > _log 2>_log &
+   cat _log
+   rm _log
+   wait $!
+}
+
diff --git a/cares_public_headers.patch b/cares_public_headers.patch
new file mode 100644
index 0000000..6c9dbdc
--- /dev/null
+++ b/cares_public_headers.patch
@@ -0,0 +1,13 @@
+Index: node-v14.17.5/src/cares_wrap.h
+===================================================================
+--- node-v14.17.5.orig/src/cares_wrap.h
++++ node-v14.17.5/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/fix_ci_tests.patch b/fix_ci_tests.patch
new file mode 100644
index 0000000..4c43cc1
--- /dev/null
+++ b/fix_ci_tests.patch
@@ -0,0 +1,129 @@
+Author: Adam Majer <amajer@suse.de>
+Date: Dec 20 09:18:49 UTC 2017
+Summary: Fix CI unit tests framework for OBS building
+
+Index: node-v22.12.0/test/parallel/test-module-loading-globalpaths.js
+===================================================================
+--- node-v22.12.0.orig/test/parallel/test-module-loading-globalpaths.js
++++ node-v22.12.0/test/parallel/test-module-loading-globalpaths.js
+@@ -11,6 +11,9 @@ const { addLibraryPath } = require('../c
+ 
+ addLibraryPath(process.env);
+ 
++common.skip('hardcoded global paths');
++return;
++
+ if (process.argv[2] === 'child') {
+   console.log(require(pkgName).string);
+ } else {
+Index: node-v22.12.0/test/parallel/test-tls-passphrase.js
+===================================================================
+--- node-v22.12.0.orig/test/parallel/test-tls-passphrase.js
++++ node-v22.12.0/test/parallel/test-tls-passphrase.js
+@@ -223,7 +223,7 @@ server.listen(0, common.mustCall(functio
+   }, onSecureConnect());
+ })).unref();
+ 
+-const errMessageDecrypt = /bad decrypt/;
++const errMessageDecrypt = /bad (decrypt|password read)/;
+ 
+ // Missing passphrase
+ assert.throws(function() {
+Index: node-v22.12.0/test/parallel/test-repl-envvars.js
+===================================================================
+--- node-v22.12.0.orig/test/parallel/test-repl-envvars.js
++++ node-v22.12.0/test/parallel/test-repl-envvars.js
+@@ -2,7 +2,9 @@
+ 
+ // Flags: --expose-internals
+ 
+-require('../common');
++const common = require('../common');
++common.skip('Not running test in OBS');
++
+ const stream = require('stream');
+ const { describe, test } = require('node:test');
+ const REPL = require('internal/repl');
+Index: node-v22.12.0/Makefile
+===================================================================
+--- node-v22.12.0.orig/Makefile
++++ node-v22.12.0/Makefile
+@@ -397,7 +397,6 @@ ADDONS_HEADERS_PREREQS := tools/install.
+ 	$(wildcard deps/uv/include/*/*.h) \
+ 	$(wildcard deps/v8/include/*.h) \
+ 	$(wildcard deps/v8/include/*/*.h) \
+-	deps/zlib/zconf.h deps/zlib/zlib.h \
+ 	src/node.h src/node_api.h src/js_native_api.h src/js_native_api_types.h \
+ 	src/node_api_types.h src/node_buffer.h src/node_object_wrap.h \
+ 	src/node_version.h
+@@ -570,6 +569,7 @@ test-ci-js: | clear-stalled ## Build and
+ # Related CI jobs: most CI tests, excluding node-test-commit-arm-fanned
+ test-ci: LOGLEVEL := info ## Build and test everything (CI).
+ test-ci: | clear-stalled bench-addons-build build-addons build-js-native-api-tests build-node-api-tests doc-only
++	strip $(NODE_EXE)
+ 	out/Release/cctest --gtest_output=xml:out/junit/cctest.xml
+ 	$(PYTHON) tools/test.py $(PARALLEL_ARGS) -p tap --logfile test.tap \
+ 		--mode=$(BUILDTYPE_LOWER) --flaky-tests=$(FLAKY_TESTS) \
+@@ -750,7 +750,8 @@ apidocs_json = $(addprefix out/,$(apidoc
+ apiassets = $(subst api_assets,api/assets,$(addprefix out/,$(wildcard doc/api_assets/*)))
+ 
+ tools/doc/node_modules: tools/doc/package.json
+-	@if [ "$(shell $(node_use_openssl))" != "true" ]; then \
++	echo "Skipping tools/doc/node_modules"
++#	@if [ "$(shell $(node_use_openssl))" != "true" ]; then \
+ 		echo "Skipping tools/doc/node_modules (no crypto)"; \
+ 	else \
+ 		cd tools/doc && $(call available-node,$(run-npm-ci)) \
+Index: node-v22.12.0/tools/test.py
+===================================================================
+--- node-v22.12.0.orig/tools/test.py
++++ node-v22.12.0/tools/test.py
+@@ -1386,7 +1386,7 @@ def BuildOptions():
+   result.add_option("-s", "--suite", help="A test suite",
+       default=[], action="append")
+   result.add_option("-t", "--timeout", help="Timeout in seconds",
+-      default=120, type="int")
++      default=1200, type="int")
+   result.add_option("--arch", help='The architecture to run tests for',
+       default='none')
+   result.add_option("--snapshot", help="Run the tests with snapshot turned on",
+Index: node-v22.12.0/test/parallel/test-crypto-dh.js
+===================================================================
+--- node-v22.12.0.orig/test/parallel/test-crypto-dh.js
++++ node-v22.12.0/test/parallel/test-crypto-dh.js
+@@ -93,7 +93,7 @@ const crypto = require('crypto');
+       dh3.computeSecret('');
+     }, { message: common.hasOpenSSL3 && !hasOpenSSL3WithNewErrorMessage ?
+       'Unspecified validation error' :
+-      'Supplied key is too small' });
++      /(Supplied key is too small|invalid public key)/ });
+   }
+ }
+ 
+Index: node-v22.12.0/test/parallel/test-dns.js
+===================================================================
+--- node-v22.12.0.orig/test/parallel/test-dns.js
++++ node-v22.12.0/test/parallel/test-dns.js
+@@ -403,7 +403,7 @@ assert.throws(() => {
+ 
+   const server = dgram.createSocket('udp4');
+ 
+-  server.on('message', common.mustCall((msg, { address, port }) => {
++  server.on('message', common.mustCallAtLeast((msg, { address, port }) => {
+     const parsed = dnstools.parseDNSPacket(msg);
+     const domain = parsed.questions[0].domain;
+     assert.strictEqual(domain, 'example.org');
+Index: node-v22.12.0/test/wpt/test-webcrypto.js
+===================================================================
+--- node-v22.12.0.orig/test/wpt/test-webcrypto.js
++++ node-v22.12.0/test/wpt/test-webcrypto.js
+@@ -1,7 +1,8 @@
+ 'use strict';
+ 
+ const common = require('../common');
+-if (!common.hasCrypto)
++const os = require('os')
++if (!common.hasCrypto || os.arch() == 's390x')
+   common.skip('missing crypto');
+ 
+ const { WPTRunner } = require('../common/wpt');
diff --git a/flaky_test_rerun.patch b/flaky_test_rerun.patch
new file mode 100644
index 0000000..8f8e394
--- /dev/null
+++ b/flaky_test_rerun.patch
@@ -0,0 +1,21 @@
+Index: node-v16.13.0/tools/test.py
+===================================================================
+--- node-v16.13.0.orig/tools/test.py
++++ node-v16.13.0/tools/test.py
+@@ -586,6 +586,16 @@ class TestCase(object):
+                       self.context.store_unexpected_output)
+ 
+   def Run(self):
++    reruns = 0
++    while (reruns < 5):
++        reruns += 1
++        result = self.OriginalRun()
++        if (not result.HasFailed()):
++            break
++        print("FLAKY TEST rerun: ", self.GetCommand())
++    return result
++
++  def OriginalRun(self):
+     try:
+       result = self.RunCommand(self.GetCommand(), {
+         "TEST_SERIAL_ID": "%d" % self.serial_id,
diff --git a/gcc13.patch b/gcc13.patch
new file mode 100644
index 0000000..360fb1f
--- /dev/null
+++ b/gcc13.patch
@@ -0,0 +1,36 @@
+Index: node-v22.1.0/deps/v8/src/builtins/builtins-array-gen.cc
+===================================================================
+--- node-v22.1.0.orig/deps/v8/src/builtins/builtins-array-gen.cc
++++ node-v22.1.0/deps/v8/src/builtins/builtins-array-gen.cc
+@@ -18,6 +18,7 @@
+ #include "src/objects/arguments-inl.h"
+ #include "src/objects/elements-kind.h"
+ #include "src/objects/property-cell.h"
++#include "src/wasm/wasm-objects.h"
+ 
+ namespace v8 {
+ namespace internal {
+Index: node-v22.1.0/deps/v8/src/builtins/builtins-array.cc
+===================================================================
+--- node-v22.1.0.orig/deps/v8/src/builtins/builtins-array.cc
++++ node-v22.1.0/deps/v8/src/builtins/builtins-array.cc
+@@ -23,6 +23,7 @@
+ #include "src/objects/objects-inl.h"
+ #include "src/objects/prototype.h"
+ #include "src/objects/smi.h"
++#include "src/wasm/wasm-objects.h"
+ 
+ namespace v8 {
+ namespace internal {
+Index: node-v22.1.0/deps/v8/src/codegen/tnode.h
+===================================================================
+--- node-v22.1.0.orig/deps/v8/src/codegen/tnode.h
++++ node-v22.1.0/deps/v8/src/codegen/tnode.h
+@@ -8,6 +8,7 @@
+ #include <type_traits>
+ 
+ #include "src/codegen/machine-type.h"
++#include "src/wasm/wasm-objects.h"
+ #include "src/objects/tagged.h"
+ 
+ namespace v8 {
diff --git a/icu76.1.patch b/icu76.1.patch
new file mode 100644
index 0000000..8ec79d3
--- /dev/null
+++ b/icu76.1.patch
@@ -0,0 +1,13 @@
+Index: node-v22.11.0/configure.py
+===================================================================
+--- node-v22.11.0.orig/configure.py
++++ node-v22.11.0/configure.py
+@@ -1876,7 +1876,7 @@ def configure_intl(o):
+   elif with_intl == 'system-icu':
+     # ICU from pkg-config.
+     o['variables']['v8_enable_i18n_support'] = 1
+-    pkgicu = pkg_config('icu-i18n')
++    pkgicu = pkg_config('icu-i18n icu-uc')
+     if not pkgicu[0]:
+       error('''Could not load pkg-config data for "icu-i18n".
+        See above errors or the README.md.''')
diff --git a/legacy_python.patch b/legacy_python.patch
new file mode 100644
index 0000000..062aa79
--- /dev/null
+++ b/legacy_python.patch
@@ -0,0 +1,26 @@
+Index: node-v18.11.0/tools/utils.py
+===================================================================
+--- node-v18.11.0.orig/tools/utils.py
++++ node-v18.11.0/tools/utils.py
+@@ -26,10 +26,10 @@
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ 
+ 
+-import glob
+ import platform
+ import re
+ import sys
++from pathlib import Path
+ 
+ 
+ # Reads a .list file into an array of strings
+@@ -109,7 +109,8 @@ def IsWindows():
+ 
+ 
+ def SearchFiles(dir, ext):
+-  list = glob.glob(dir+ '/**/*.' + ext, recursive=True)
++  list = Path(dir).glob('**/*.' + ext)
++  list = [ str(x) for x in list ]
+   if sys.platform == 'win32':
+     list = [ x.replace('\\', '/')for x in list]
+   return sorted(list)
diff --git a/linker_lto_jobs.patch b/linker_lto_jobs.patch
new file mode 100644
index 0000000..bba62ab
--- /dev/null
+++ b/linker_lto_jobs.patch
@@ -0,0 +1,25 @@
+Purpose of these dependencies is to make sure that the linker
+is run serially over these binaries instead of in parallel.
+OBS workers run out of memory as each executable seems to require
+upward of 5G RAM
+
+Index: node-v22.13.0/node.gyp
+===================================================================
+--- node-v22.13.0.orig/node.gyp
++++ node-v22.13.0/node.gyp
+@@ -1180,6 +1180,7 @@
+         'deps/googletest/googletest.gyp:gtest_main',
+         'deps/histogram/histogram.gyp:histogram',
+         'deps/nbytes/nbytes.gyp:nbytes',
++		'fuzz_env'
+       ],
+ 
+       'includes': [
+@@ -1257,6 +1258,7 @@
+         '<(node_lib_target_name)',
+         'deps/histogram/histogram.gyp:histogram',
+         'deps/nbytes/nbytes.gyp:nbytes',
++		'cctest'
+       ],
+ 
+       'includes': [
diff --git a/manual_configure.patch b/manual_configure.patch
new file mode 100644
index 0000000..5732030
--- /dev/null
+++ b/manual_configure.patch
@@ -0,0 +1,20 @@
+Author: Adam Majer <amajer@suse.de>
+Date: Wed May 23 14:13:33 CEST 2018
+Summary: This config.h is defined by hand
+
+Gyp doesn't run autotools, so this config is not quite correct.
+Update to prevent implicit defines to be used.
+
+Index: node-git.8dae89b396/deps/nghttp2/lib/includes/config.h
+===================================================================
+--- node-git.8dae89b396.orig/deps/nghttp2/lib/includes/config.h
++++ node-git.8dae89b396/deps/nghttp2/lib/includes/config.h
+@@ -71,7 +71,7 @@ typedef intptr_t ssize_t;
+ /* #undef HAVE_NETDB_H */
+ 
+ /* Define to 1 if you have the <netinet/in.h> header file. */
+-/* #undef HAVE_NETINET_IN_H */
++#define HAVE_NETINET_IN_H 1
+ 
+ /* Define to 1 if you have the <pwd.h> header file. */
+ /* #undef HAVE_PWD_H */
diff --git a/node-gyp-addon-gypi.patch b/node-gyp-addon-gypi.patch
new file mode 100644
index 0000000..311cf48
--- /dev/null
+++ b/node-gyp-addon-gypi.patch
@@ -0,0 +1,112 @@
+Index: node-v21.7.1/addon-rpm.gypi
+===================================================================
+--- /dev/null
++++ node-v21.7.1/addon-rpm.gypi
+@@ -0,0 +1,35 @@
++{
++  'target_defaults': {
++    'type': 'loadable_module',
++    'product_prefix': '',
++    'include_dirs': [
++      '/usr/include/node22/',
++      '/usr/include/'
++    ],
++
++    'target_conditions': [
++      ['_type=="loadable_module"', {
++        'product_extension': 'node',
++        'defines': [ 'BUILDING_NODE_EXTENSION' ],
++      }]
++    ],
++
++    'conditions': [
++      [ 'OS=="mac"', {
++        'libraries': [ '-undefined dynamic_lookup' ],
++        'xcode_settings': {
++          'DYLIB_INSTALL_NAME_BASE': '@rpath'
++        },
++      }],
++      [ 'OS=="win"', {
++        'libraries': [ '-l<(node_root_dir)/$(Configuration)/node.lib' ],
++        # warning C4251: 'node::ObjectWrap::handle_' : class 'v8::Persistent<T>'
++        # needs to have dll-interface to be used by clients of class 'node::ObjectWrap'
++        'msvs_disabled_warnings': [ 4251 ],
++      }],
++      [ 'OS=="freebsd" or OS=="openbsd" or OS=="solaris" or (OS=="linux" and target_arch!="ia32")', {
++        'cflags': [ '-fPIC' ],
++      }]
++    ]
++  }
++}
+Index: node-v21.7.1/deps/npm/node_modules/node-gyp/lib/configure.js
+===================================================================
+--- node-v21.7.1.orig/deps/npm/node_modules/node-gyp/lib/configure.js
++++ node-v21.7.1/deps/npm/node_modules/node-gyp/lib/configure.js
+@@ -36,10 +36,6 @@ async function configure (gyp, argv) {
+       if ('v' + release.version !== process.version) {
+         // if --target was given, then determine a target version to compile for
+         log.verbose('get node dir', 'compiling against --target node version: %s', release.version)
+-      } else {
+-        // if no --target was specified then use the current host node version
+-        log.verbose('get node dir', 'no --target version specified, falling back to host node version: %s', release.version)
+-      }
+ 
+       if (!release.semver) {
+         // could not parse the version string with semver
+@@ -54,6 +50,12 @@ async function configure (gyp, argv) {
+ 
+       log.verbose('get node dir', 'target node version installed:', release.versionDir)
+       nodeDir = path.resolve(gyp.devDir, release.versionDir)
++      } else {
++        // if no --target was specified then use RPM-installed headers
++        log.verbose('get node dir', 'no --target version specified, falling back to RPM installed headers')
++        nodeDir = '/usr/include/node22'
++        createBuildDir()
++      }
+     }
+ 
+     return createBuildDir()
+@@ -201,8 +203,16 @@ async function configure (gyp, argv) {
+ 
+     // this logic ported from the old `gyp_addon` python file
+     const gypScript = path.resolve(__dirname, '..', 'gyp', 'gyp_main.py')
+-    const addonGypi = path.resolve(__dirname, '..', 'addon.gypi')
+-    let commonGypi = path.resolve(nodeDir, 'include/node/common.gypi')
++    let addon_gypi_file = gyp.opts.target || gyp.opts.nodedir ? 'addon.gypi' : 'addon-rpm.gypi'
++    let addonGypi = path.resolve(__dirname, '..', addon_gypi_file)
++    let commonGypi = path.resolve(nodeDir, 'include/node22/common.gypi')
++
++    try {
++      await fs.stat(commonGypi)
++    } catch (err) {
++      commonGypi = path.resolve(nodeDir, 'include/node/common.gypi')
++    }
++
+     try {
+       await fs.stat(commonGypi)
+     } catch (err) {
+Index: node-v21.7.1/deps/npm/node_modules/node-gyp/addon.gypi
+===================================================================
+--- node-v21.7.1.orig/deps/npm/node_modules/node-gyp/addon.gypi
++++ node-v21.7.1/deps/npm/node_modules/node-gyp/addon.gypi
+@@ -18,6 +18,7 @@
+     ],
+ 
+     'include_dirs': [
++      '<(node_root_dir)/include/node22',
+       '<(node_root_dir)/include/node',
+       '<(node_root_dir)/src',
+       '<(node_root_dir)/deps/openssl/config',
+Index: node-v21.7.1/tools/build_addons.py
+===================================================================
+--- node-v21.7.1.orig/tools/build_addons.py
++++ node-v21.7.1/tools/build_addons.py
+@@ -27,7 +27,7 @@ def generate_headers(headers_dir, instal
+ def rebuild_addons(args):
+   headers_dir = os.path.abspath(args.headers_dir)
+   out_dir = os.path.abspath(args.out_dir)
+-  node_bin = os.path.join(out_dir, 'node')
++  node_bin = os.path.join(out_dir, 'node22')
+   if args.is_win:
+     node_bin += '.exe'
+ 
diff --git a/node-v22.11.0.tar.xz b/node-v22.11.0.tar.xz
new file mode 100644
index 0000000..93767f0
--- /dev/null
+++ b/node-v22.11.0.tar.xz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bbf0297761d53aefda9d7855c57c7d2c272b83a7b5bad4fea9cb29006d8e1d35
+size 47006780
diff --git a/node-v22.12.0.tar.xz b/node-v22.12.0.tar.xz
new file mode 100644
index 0000000..c65497d
--- /dev/null
+++ b/node-v22.12.0.tar.xz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fe1bc4be004dc12721ea2cb671b08a21de01c6976960ef8a1248798589679e16
+size 47625776
diff --git a/node-v22.13.0.tar.xz b/node-v22.13.0.tar.xz
new file mode 100644
index 0000000..795d0ed
--- /dev/null
+++ b/node-v22.13.0.tar.xz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e50db6730716ba2ae953cf99d10c80295bd33bb72d3c829d9e99f6af56d626c7
+size 47681488
diff --git a/node-v22.13.1.tar.xz b/node-v22.13.1.tar.xz
new file mode 100644
index 0000000..bd033fa
--- /dev/null
+++ b/node-v22.13.1.tar.xz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cfce282119390f7e0c2220410924428e90dadcb2df1744c0c4a0e7baae387cc2
+size 48041964
diff --git a/node-v22.3.0.tar.xz b/node-v22.3.0.tar.xz
new file mode 100644
index 0000000..a2ff6e3
--- /dev/null
+++ b/node-v22.3.0.tar.xz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bfb85bd1dca517761f9046d61600f830d19935d6d6c36eded01578a19326104c
+size 44517412
diff --git a/node_modules.tar.xz b/node_modules.tar.xz
new file mode 100644
index 0000000..3944788
--- /dev/null
+++ b/node_modules.tar.xz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c0f0958b5c1bfbe30d6794d857e1f0095cef384e3c077136e5b89dd1027f40f3
+size 1418716
diff --git a/nodejs-libpath.patch b/nodejs-libpath.patch
new file mode 100644
index 0000000..40de55f
--- /dev/null
+++ b/nodejs-libpath.patch
@@ -0,0 +1,54 @@
+Index: node-v22.12.0/tools/install.py
+===================================================================
+--- node-v22.12.0.orig/tools/install.py
++++ node-v22.12.0/tools/install.py
+@@ -7,6 +7,7 @@ import os
+ import platform
+ import shutil
+ import sys
++from distutils import sysconfig
+ import re
+ 
+ current_system = platform.system()
+@@ -72,6 +73,10 @@ def try_copy(options, path, dest):
+   try_unlink(target_path) # prevent ETXTBSY errors
+   return shutil.copy2(source_path, target_path)
+ 
++def libdir(options):
++  libdir_fq = sysconfig.get_config_var("LIBDIR")
++  return re.sub("^" + re.escape(options.prefix + "/"), "", libdir_fq)
++
+ def try_remove(options, path, dest):
+   source_path, target_path = mkpaths(options, path, dest)
+   if not options.silent:
+@@ -88,7 +93,7 @@ def uninstall(options, paths, dest):
+     try_remove(options, path, dest)
+ 
+ def package_files(options, action, name, bins):
+-  target_path = os.path.join('lib/node_modules', name)
++  target_path = os.path.join(libdir(options), 'node_modules', name)
+ 
+   # don't install npm if the target path is a symlink, it probably means
+   # that a dev version of npm is installed there
+@@ -109,7 +114,7 @@ def package_files(options, action, name,
+     if action == uninstall:
+       action(options, [link_path], os.path.join('bin', bin_name))
+     elif action == install:
+-      try_symlink(options, os.path.join('../lib/node_modules', name, bin_target), link_path)
++      try_symlink(options, os.path.join('..', libdir(options), 'node_modules', name, bin_target), link_path)
+     else:
+       assert 0  # unhandled action type
+ 
+Index: node-v22.12.0/lib/internal/modules/cjs/loader.js
+===================================================================
+--- node-v22.12.0.orig/lib/internal/modules/cjs/loader.js
++++ node-v22.12.0/lib/internal/modules/cjs/loader.js
+@@ -1798,7 +1798,7 @@ Module._initPaths = function() {
+     path.resolve(process.execPath, '..') :
+     path.resolve(process.execPath, '..', '..');
+ 
+-  const paths = [path.resolve(prefixDir, 'lib', 'node')];
++  const paths = ['/usr/lib/node'];
+ 
+   if (homeDir) {
+     ArrayPrototypeUnshift(paths, path.resolve(homeDir, '.node_libraries'));
diff --git a/nodejs.keyring b/nodejs.keyring
new file mode 100644
index 0000000000000000000000000000000000000000000000000000000000000000..2d1e055498751f95f0b53eb50dfa90b017bb17892125a3aaf4d506cfcf77877f
GIT binary patch
literal 17430
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
T=^9UWHrq)bTd+~*Ym6lT8bwF+

literal 0
HcmV?d00001

diff --git a/nodejs22.changes b/nodejs22.changes
new file mode 100644
index 0000000..f683521
--- /dev/null
+++ b/nodejs22.changes
@@ -0,0 +1,228 @@
+-------------------------------------------------------------------
+Wed Jan 22 10:10:36 UTC 2025 - Adam Majer <adam.majer@suse.de>
+
+- Update to 22.13.1:
+  * src,loader,permission: throw on InternalWorker use when
+    permission model is enabled (bsc#1236251, CVE-2025-23083)
+  * src: fix HTTP2 mem leak on premature close and ERR_PROTO
+    (bsc#1236250, CVE-2025-23085)
+  * deps: Use of Insufficiently Random Values in undici fetch()
+    (bsc#1236258, CVE-2025-22150)
+
+-------------------------------------------------------------------
+Thu Jan 16 15:00:55 UTC 2025 - Adam Majer <adam.majer@suse.de>
+
+- Update to 22.13.0:
+  * Upgrades the Permission Model status from Active Development to Stable.
+  * Graduate WebCryptoAPI Ed25519 and X25519 algorithms as stable
+  * net: support blocklist in net.connect and net.Server
+  * dgram: support blocklist in udp
+  * deps updated:
+    > cares     -- '1.34.3' -> '1.34.4'
+    > ngtcp2    -- '1.3.0' -> '1.9.1'
+    > npm       -- '10.9.0' -> '10.9.2'
+    > simdjson  -- '3.10.0' -> '3.10.1'
+    > simdutf   -- '5.6.1' -> '5.6.4'
+    > uv       -- '1.49.1' -> '1.49.2'
+- CVE-2024-21538.patch: upstreamed, dropped
+- linker_lto_jobs.patch: refreshed
+
+-------------------------------------------------------------------
+Mon Dec 30 22:17:20 UTC 2024 - Adam Majer <adam.majer@suse.de>
+
+- test/report/test-report-exclude-network.js - removed unit tests that fail in staging
+
+-------------------------------------------------------------------
+Fri Dec 20 12:56:09 UTC 2024 - Adam Majer <adam.majer@suse.de>
+
+- fix_ci_tests.patch: skip wpt/test-webcrypto on s390x as it has
+  unexpected differences between z13 and z15
+- external sqlite support only on TW and SLFO
+
+-------------------------------------------------------------------
+Thu Dec  5 13:53:22 UTC 2024 - Adam Majer <adam.majer@suse.de>
+
+- add python3-setuptools requirements (needed for python 3.13+)
+
+-------------------------------------------------------------------
+Wed Dec  4 16:59:08 UTC 2024 - Adam Majer <adam.majer@suse.de>
+
+- Update to 22.12.0:
+  * require(esm) is now enabled by default
+  * Added resizable ArrayBuffer support in Buffer
+
+- CVE-2024-21538.patch: fixes regular expression denial of service
+  (bsc#1233856, CVE-2024-21538)
+- icu76.1.patch: upstreamed, dropped
+- linker_lto_jobs.patch, nodejs-libpath.patch, fix_ci_tests.patch: refreshed
+- nodejs.keyring: updated with upstream releaser list
+- old_cares.patch: fix with older c-ares
+
+-------------------------------------------------------------------
+Wed Nov 20 10:04:23 UTC 2024 - Adam Majer <adam.majer@suse.de>
+
+- BuildRequire python311 for SLE15
+
+-------------------------------------------------------------------
+Mon Nov 18 12:02:26 UTC 2024 - Adam Majer <adam.majer@suse.de>
+
+- Update to 22.11.0:
+  * This release marks the transition of Node.js 22.x into
+    Long Term Support (LTS) with the codename 'Jod'.
+    Other than updating metadata, such as the process.release object,
+    to reflect that the release is LTS, no further changes from
+    Node.js 22.10.0 are included.
+
+- icu76.1.patch: fix linking to ICU 76.1 (bsc#1232061)
+
+-------------------------------------------------------------------
+Mon Oct 28 11:43:07 UTC 2024 - Adam Majer <adam.majer@suse.de>
+
+- Update to 22.10.0:
+  * crypto: add KeyObject.prototype.toCryptoKey
+  * crypto: add Date fields for validTo and validFrom
+  * http2: expose nghttp2_option_set_stream_reset_rate_limit as an option
+  * lib: propagate aborted state to dependent signals before firing events
+  * module: support loading entrypoint as url
+  * module: implement flushCompileCache()
+  * module: throw when invalid argument is passed to enableCompileCache()
+  * module: write compile cache to temporary file and then rename it
+  * process: add process.features.require_module
+  * process: add process.features.typescript
+  * test_runner: support custom arguments in run()
+  * test_runner: add 'test:summary' event
+  * test_runner: add support for coverage via run()
+  * worker: add markAsUncloneable api
+
+- Changes since 22.9.0:
+  * util: getCallSite has been introduced. It allows users to retrieve the stacktrace of the current execution.
+  * tls: Exposes X509_V_FLAG_PARTIAL_CHAIN to tls.createSecureContext
+  * src: create handle scope in FastInternalModuleStat
+  * stream: relocate the status checking code in the onwritecomplete
+  * repl: doc-deprecate instantiating node:repl classes without new
+  * zlib: deprecate instantiating classes without new
+
+- Changes since 22.8.0:
+  * vm: New option for vm.createContext() to create a context with a freezable globalThis
+  * src,lib: add performance.uvMetricsInfo
+  * net: exclude ipv6 loopback addresses from server.listen
+  * test_runner: support running tests in process
+  * test_runner: defer inheriting hooks until run()
+
+- Changes since 22.7.0:
+  * Experimental transform types support
+  * Module syntax detection (the --experimental-detect-module flag) is now enabled by default.
+  * Performance Improvements to Buffer
+
+- Changes since 22.6.0:
+  * lib,src: drop --experimental-network-imports
+  * http: add diagnostics channel http.client.request.error
+  * deps: V8: backport 7857eb34db42
+  * stream: expose DuplexPair API
+  * test_runner: fix support watch with run(), add globPatterns option
+  * meta: add jake to collaborators
+  * test_runner: refactor snapshots to get file from context
+  * test_runner: add context.filePath
+
+- Changes since 22.5.0:
+  * http: expose websockets
+  * lib: add node:sqlite module
+  * module: add __esModule to require()'d ESM
+  * path: add matchesGlob method
+  * process: port on-exit-leak-free to core
+  * stream: pipeline wait for close before calling the callback
+  * test_runner: support glob matching coverage files
+  * worker: add postMessageToThread
+
+- Changes since 22.4.1:
+  * (CVE-2024-36138, bsc#1227560) - Bypass incomplete fix of CVE-2024-27980 (High)
+  * (CVE-2024-22020, bsc#1227554) - Bypass network import restriction via data URL (Medium)
+  * (CVE-2024-22018, bsc#1227562) - fs.lstat bypasses permission model (Low)
+  * (CVE-2024-36137, bsc#1227561) - fs.fchown/fchmod bypasses permission model (Low)
+  * (CVE-2024-37372, bsc#1227563) - Permission model improperly processes UNC paths (Low)
+
+- Changes since 22.4.0:
+  * deps,lib,src: add experimental web storage
+  * doc: doc-only deprecate OpenSSL engine-based APIs
+  * inspector: fix disable async hooks on Debugger.setAsyncCallStackDepth
+  * lib: add diagnostics_channel events to module loading
+  * util: support --no- for argument with boolean type for parseArgs
+
+
+- fix_ci_tests.patch: refreshed, add compat for c-ares 1.30
+- linker_lto_jobs.patch, versioned.patch, qemu_timeouts_arches.patch: refreshed
+- nodejs.keyring: add C0D6248439F1D5604AAFFB4021D900FFDB233756
+
+-------------------------------------------------------------------
+Fri Jun 14 10:58:52 UTC 2024 - Adam Majer <adam.majer@suse.de>
+
+- Update to 22.3.0:
+  * buffer: add .bytes() method to Blob
+  * doc: add context.assert docs
+  * doc: improve explanation about built-in modules
+  * fs: mark recursive cp methods as stable
+  * net: add new net.server.listen tracing channel
+  * module: print amount of load time of a cjs module
+  * process: add process.getBuiltinModule(id)
+  * cli: add NODE_RUN_PACKAGE_JSON_PATH env
+  * cli: add NODE_RUN_SCRIPT_NAME env to node --run
+  * lib: add EventSource Client
+  * lib: replace MessageEvent with undici's
+  * src: traverse parent folders while running --run
+  * src,permission: --allow-wasi & prevent WASI exec
+  * test_runner: support module mocking
+  * test_runner: add snapshot testing
+  * test_runner: add context.fullName
+
+- fix_ci_tests.patch: partially upstreamed and refreshed
+
+-------------------------------------------------------------------
+Wed May 22 10:49:02 UTC 2024 - Adam Majer <adam.majer@suse.de>
+
+- Update to 22.2.0:
+  * cli: allow running wasm in limited vmem with --disable-wasm-trap-handler
+  * doc: add pimterry to collaborators
+  * fs: allow 'withFileTypes' to be used with globs
+  * inspector: introduce the --inspect-wait flag
+  * lib,src: remove --experimental-policy
+  * perf_hooks: add deliveryType and responseStatus fields
+  * test_runner: support test plans
+  * zlib: expose zlib.crc32()
+
+- linker_lto_jobs.patch: refreshed
+- fix_ci_tests.patch: partially upstreamed, refreshed 
+- skip_no_console.patch: dropped, upstreamed
+
+-------------------------------------------------------------------
+Wed May 22 09:04:46 UTC 2024 - Adam Majer <adam.majer@suse.de>
+
+- fix_ci_tests.patch: add fix for issue #53085
+
+-------------------------------------------------------------------
+Tue May 14 14:25:41 UTC 2024 - Adam Majer <adam.majer@suse.de>
+
+- New nodejs major version 22.1.0
+  For overview of changes and details since 21.x and earlier see
+  https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V22.md#22.1.0
+
+- v8-i586.patch: fix 32bit build with new gcc
+
+- Imported patches from 21.x:
+  * cares_public_headers.patch
+  * fix_ci_tests.patch
+  * flaky_test_rerun.patch
+  * gcc13.patch
+  * legacy_python.patch
+  * linker_lto_jobs.patch
+  * manual_configure.patch
+  * node-gyp-addon-gypi.patch
+  * node-gyp-config.patch
+  * nodejs-libpath.patch
+  * npm_search_paths.patch
+  * openssl_binary_detection.patch
+  * qemu_timeouts_arches.patch
+  * skip_no_console.patch
+  * sle12_python3_compat.patch
+  * test-skip-y2038-on-32bit-time_t.patch
+  * versioned.patch
+
diff --git a/nodejs22.spec b/nodejs22.spec
new file mode 100644
index 0000000..7a22882
--- /dev/null
+++ b/nodejs22.spec
@@ -0,0 +1,1160 @@
+#
+# spec file for package nodejs22
+#
+# Copyright (c) 2024 SUSE LLC
+#
+# All modifications and additions to the file contributed by third parties
+# remain the property of their copyright owners, unless otherwise agreed
+# upon. The license for this file, and modifications and additions to the
+# file, is the same license as for the pristine package itself (unless the
+# license for the pristine package is not an Open Source License, in which
+# case the license is the MIT License). An "Open Source License" is a
+# license that conforms to the Open Source Definition (Version 1.9)
+# published by the Open Source Initiative.
+
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
+#
+
+###########################################################
+#
+#   WARNING! WARNING! WARNING! WARNING! WARNING! WARNING!
+#
+# This spec file is generated from a template hosted at
+# https://github.com/AdamMajer/nodejs-packaging
+#
+###########################################################
+
+# Fedora doesn't have rpm-config-SUSE which provides
+# ext_man in /usr/lib/rpm/macros.d/macros.obs
+%if 0%{?fedora_version}
+%define ext_man .gz
+%endif
+
+Name:           nodejs22
+Version:        22.13.1
+Release:        0
+
+# Double DWZ memory limits
+%define _dwz_low_mem_die_limit  20000000
+%define _dwz_max_die_limit     100000000
+
+%define node_version_number 22
+
+# openssl bsc#1192489 - fix released
+%bcond_without openssl_RSA_get0_pss_params
+
+%if 0%{?suse_version} > 1500 || 0%{?fedora_version}
+%bcond_without libalternatives
+%else
+%bcond_with libalternatives
+%endif
+
+# nodejs20+ is not for SLE12
+%if %{node_version_number} >= 20 && 0%{?suse_version} > 0 && 0%{?suse_version} < 1500
+ExclusiveArch do_not_build
+%endif
+
+%if %node_version_number >= 12
+%define openssl_req_ver 1.1.1
+%else
+%if %node_version_number >= 10
+%define openssl_req_ver 1.1.0
+%else
+%define openssl_req_ver 1.0.2
+%endif
+%endif
+
+%bcond_with    valgrind_tests
+
+%if %{node_version_number} >= 12
+
+# turn on LTO only on non-32bit arches
+%ifarch %{ix86} %{arm}
+%bcond_with nodejs_lto
+%else
+%bcond_without nodejs_lto
+%endif
+
+%else
+%bcond_with nodejs_lto
+%endif
+
+%if !0%{?with nodejs_lto}
+%define _lto_cflags %{nil}
+%endif
+
+%if 0%{?suse_version} == 1110
+%define _libexecdir %{_exec_prefix}/lib
+%endif
+
+%if 0%{?suse_version} >= 1500 || 0%{?sle_version} >= 120400 || 0%{?fedora_version} >= 35
+%bcond_with    intree_openssl
+%else
+%bcond_without intree_openssl
+%endif
+
+%if 0%{?suse_version} >= 1330 || 0%{?fedora_version} >= 35
+%bcond_with    intree_cares
+%else
+%bcond_without intree_cares
+%endif
+
+%if 0%{?suse_version} >= 1330 || 0%{?fedora_version} >= 35
+%bcond_with    intree_icu
+%else
+%bcond_without intree_icu
+%endif
+
+%if 0%{?suse_version} >= 1550
+%bcond_with    intree_nghttp2
+%else
+%bcond_without intree_nghttp2
+%endif
+
+%if 0%{?suse_version} >= 1550
+%bcond_with    intree_brotli
+%else
+%bcond_without intree_brotli
+%endif
+
+%ifnarch x86_64 %{ix86}
+%bcond_with    gdb
+%else
+%bcond_without gdb
+%endif
+
+%define git_node 0
+
+Summary:        Evented I/O for V8 JavaScript
+License:        MIT
+Group:          Development/Languages/NodeJS
+URL:            https://nodejs.org
+Source:         https://nodejs.org/dist/v%{version}/node-v%{version}.tar.xz
+Source1:        https://nodejs.org/dist/v%{version}/SHASUMS256.txt
+Source2:        https://nodejs.org/dist/v%{version}/SHASUMS256.txt.sig
+Source3:        nodejs.keyring
+
+# Only required to run unit tests in NodeJS 10+ 
+Source10:       update_npm_tarball.sh 
+Source11:       node_modules.tar.xz
+Source20:       bash_output_helper.bash
+
+## Patches not distribution specific
+Patch1:         cares_public_headers.patch
+Patch3:         fix_ci_tests.patch
+Patch5:         sle12_python3_compat.patch
+Patch7:         manual_configure.patch
+Patch13:        openssl_binary_detection.patch
+
+
+
+## Patches specific to SUSE and openSUSE
+Patch100:       linker_lto_jobs.patch
+# PATCH-FIX-OPENSUSE -- set correct path for dtrace if it is built
+Patch101:       nodejs-libpath.patch
+# PATCH-FIX-UPSTREAM -- use custom addon.gypi by default instead of
+# downloading node source
+Patch102:       node-gyp-addon-gypi.patch
+# PATCH-FIX-SLE -- configure script uses Python check_output method
+# which isn't included in Python 2.6 (used in SLE 11).
+# PATCH-FIX-OPENSUSE -- install user global npm packages to /usr/local
+# instead of /usr
+Patch104:       npm_search_paths.patch
+Patch110:       legacy_python.patch
+
+Patch120:       flaky_test_rerun.patch
+
+Patch132:       test-skip-y2038-on-32bit-time_t.patch
+
+# Use versioned binaries and paths
+Patch200:       versioned.patch
+
+Patch305:       qemu_timeouts_arches.patch
+Patch307:       v8-i586.patch
+Patch309:       gcc13.patch
+Patch311:       old_cares.patch
+
+BuildRequires:  pkg-config
+BuildRequires:  fdupes
+BuildRequires:  procps
+BuildRequires:  xz
+BuildRequires:  zlib-devel
+
+%if 0%{?suse_version}
+BuildRequires:  config(netcfg)
+%endif
+
+# SLE-11 target only
+# Node.js 6 requires GCC 4.8.5+.
+#
+# For Node.js 8.x, upstream requires GCC 4.9.4+, as GCC 4.8 may have
+# slightly buggy C++11 support: https://github.com/nodejs/node/pull/13466
+#
+# If the default compiler is not supported, use the most recent compiler
+# version available.
+%if 0%{?suse_version} == 1110
+# GCC 5 is only available in the SUSE:SLE-11:SP4:Update repository (SDK).
+%if %node_version_number >= 8
+BuildRequires:  gcc5-c++
+%define forced_gcc_version 5
+%else
+BuildRequires:  gcc48-c++
+%define forced_gcc_version 4.8
+%endif
+%endif
+# sles == 11 block
+
+# Pick and stick with "latest" compiler at time of LTS release
+# for SLE-12:Update targets
+%if 0%{?suse_version} == 1315
+%if %node_version_number >= 17
+BuildRequires:  gcc12-c++
+%define forced_gcc_version 12
+%else
+%if %node_version_number >= 14
+BuildRequires:  gcc9-c++
+%define forced_gcc_version 9
+%else
+%if %node_version_number >= 8
+BuildRequires:  gcc7-c++
+%define forced_gcc_version 7
+%endif
+%endif
+%endif
+%endif
+
+%if 0%{?suse_version} == 1500
+%if %node_version_number >= 17
+BuildRequires:  gcc12-c++
+%define forced_gcc_version 12
+%endif
+%endif
+# compiler selection
+
+# No special version defined, use default.
+%if ! 0%{?forced_gcc_version:1}
+BuildRequires:  gcc-c++
+%endif
+
+
+# Python dependencies
+%if %node_version_number >= 14
+
+%if 0%{?suse_version}
+%if 0%{?suse_version} < 1500
+BuildRequires:  python36
+%define forced_python_version 3.6m
+%endif
+%if %{?suse_version} == 1500
+BuildRequires:  python311
+%define forced_python_version 3.11
+%endif
+%if %{?suse_version} > 1500
+BuildRequires:  python3
+BuildRequires:  python3-setuptools
+%endif
+%endif
+
+%else
+%if %node_version_number >= 12
+BuildRequires:  python3
+
+%else
+%if 0%{?suse_version} >= 1500
+BuildRequires:  python2
+%else
+BuildRequires:  python
+%endif
+
+%endif
+%endif
+
+%if 0%{?suse_version} >= 1500 && %{node_version_number} >= 10
+BuildRequires:  user(nobody)
+BuildRequires:  group(nobody)
+%endif
+
+# shared openssl
+%if ! 0%{with intree_openssl}
+
+BuildRequires:  pkgconfig(openssl) >= %{openssl_req_ver}
+
+%if 0%{?suse_version}
+
+%if 0%{?suse_version} >= 1500
+BuildRequires:  openssl >= %{openssl_req_ver}
+BuildRequires:  (libopenssl1_1-hmac if libopenssl-1_1-devel)
+BuildRequires:  (libopenssl3-hmac if libopenssl-3-devel)
+%else
+BuildRequires:  openssl-1_1 >= %{openssl_req_ver}
+BuildRequires:  libopenssl1_1-hmac
+%endif
+
+
+# /suse_version
+%endif
+
+%if 0%{?fedora_version}
+BuildRequires:  openssl >= %{openssl_req_ver}
+%endif
+
+%else
+# bundled openssl
+%if %node_version_number <= 12 && 0%{?suse_version} == 1315 && 0%{?sle_version} < 120400
+Provides:       bundled(openssl) = 3.0.15
+%else
+BuildRequires:  bundled_openssl_should_not_be_required
+%endif
+
+# /bundled openssl
+%endif
+
+%if ! 0%{with intree_cares}
+BuildRequires:  pkgconfig(libcares) >= 1.17.0
+%else
+Provides:       bundled(libcares2) = 1.34.4
+%endif
+
+%if %node_version_number >= 22 && 0%{?suse_version} > 1500
+BuildRequires:  sqlite3-devel
+%endif
+
+%if ! 0%{with intree_icu}
+BuildRequires:  pkgconfig(icu-i18n) >= 71
+%else
+Provides:       bundled(icu) = 76.1
+%endif
+
+%if ! 0%{with intree_nghttp2}
+BuildRequires:  libnghttp2-devel >= 1.41.0
+%else
+Provides:       bundled(nghttp2) = 1.64.0
+%endif
+
+%if 0%{with valgrind_tests}
+BuildRequires:  valgrind
+%endif
+
+%if %{with libalternatives}
+Suggests:       alts
+%else
+Requires(postun): %{_sbindir}/update-alternatives
+%endif
+# either for update-alternatives, or their removal
+Requires(post): %{_sbindir}/update-alternatives
+
+Recommends:     npm22
+
+#we need ABI virtual provides where SONAMEs aren't enough/not present so deps
+#break when binary compatibility is broken
+%global nodejs_abi 22.0
+Provides:       nodejs(abi) = %{nodejs_abi}
+
+#this corresponds to the "engine" requirement in package.json
+Provides:       nodejs(engine) = %{version}
+
+# Multiple versions of NodeJS can be installed at a time, but
+# to properly allow correct version execution from 3rd party
+# npm software, `env node` requires further help than only
+# update-alternatives can provide.
+Provides:       nodejs = %{version}
+%if %{with libalternatives}
+Requires:       nodejs-common >= 5.0
+%else
+Requires:       nodejs-common
+%endif
+
+# For SLE11, to be able to use the certificate store we need to have properly
+# symlinked certificates. The compatability symlinks are provided by the
+# openssl1 library in the Security Module
+%if 0%{?suse_version} == 1110
+Requires:       openssl1
+%endif
+
+%if %node_version_number >= 12
+%ifarch s390
+ExclusiveArch:  not_buildable
+%endif
+%endif
+
+Provides:       bundled(uvwasi) = 0.0.21
+Provides:       bundled(libuv) = 1.49.2
+Provides:       bundled(v8) = 12.4.254.21
+%if %{with intree_brotli}
+Provides:       bundled(brotli) = 1.1.0
+%else
+BuildRequires:  pkgconfig(libbrotlidec)
+%endif
+
+
+Provides:       bundled(llhttp) = 9.2.1
+Provides:       bundled(ngtcp2) = 1.9.1
+
+Provides:       bundled(simdutf) = 5.6.4
+Provides:       bundled(simdjson) = 3.10.1
+# bundled url-ada parser, not ada
+Provides:       bundled(ada) = 2.9.2
+
+Provides:       bundled(node-acorn) = 8.14.0
+Provides:       bundled(node-acorn-walk) = 8.3.4
+Provides:       bundled(node-amaro) = 0.2.0
+Provides:       bundled(node-cjs-module-lexer) = 1.4.1
+Provides:       bundled(node-corepack) = 0.30.0
+Provides:       bundled(node-minimatch) = 10.0.1
+Provides:       bundled(node-undici) = 6.21.1
+
+%description
+Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js
+uses an event-driven, non-blocking I/O model. Node.js has a package ecosystem
+provided by npm.
+
+%package devel
+Summary:        Development headers for NodeJS 22.x
+Group:          Development/Languages/NodeJS
+Provides:       nodejs-devel = %{version}
+Requires:       npm22 = %{version}
+Requires:       %{name} = %{version}
+
+%description devel
+This package provides development headers for Node.js needed for creation
+of binary modules.
+
+%package -n npm22
+Summary:        Package manager for Node.js
+Group:          Development/Languages/NodeJS
+%if %{with libalternatives}
+Requires:       nodejs-common >= 5.0
+%else
+Requires:       nodejs-common
+%endif
+Requires:       nodejs22 = %{version}
+Provides:       nodejs-npm = %{version}
+Obsoletes:      nodejs-npm < 4.0.0
+Provides:       npm(npm) = 10.9.2
+Provides:       npm = %{version}
+%if 0%{?suse_version} >= 1500
+%if %{node_version_number} >= 10
+Requires:       user(nobody)
+Requires:       group(nobody)
+%endif
+%endif
+Provides:       bundled(node-abbrev) = 2.0.0
+Provides:       bundled(node-abbrev) = 3.0.0
+Provides:       bundled(node-agent-base) = 7.1.1
+Provides:       bundled(node-aggregate-error) = 3.1.0
+Provides:       bundled(node-ansi-regex) = 5.0.1
+Provides:       bundled(node-ansi-regex) = 6.1.0
+Provides:       bundled(node-ansi-styles) = 4.3.0
+Provides:       bundled(node-ansi-styles) = 6.2.1
+Provides:       bundled(node-aproba) = 2.0.0
+Provides:       bundled(node-archy) = 1.0.0
+Provides:       bundled(node-balanced-match) = 1.0.2
+Provides:       bundled(node-bin-links) = 5.0.0
+Provides:       bundled(node-binary-extensions) = 2.3.0
+Provides:       bundled(node-brace-expansion) = 2.0.1
+Provides:       bundled(node-cacache) = 19.0.1
+Provides:       bundled(node-chalk) = 5.3.0
+Provides:       bundled(node-chownr) = 2.0.0
+Provides:       bundled(node-chownr) = 3.0.0
+Provides:       bundled(node-ci-info) = 4.1.0
+Provides:       bundled(node-cidr-regex) = 4.1.1
+Provides:       bundled(node-clean-stack) = 2.2.0
+Provides:       bundled(node-cli-columns) = 4.0.0
+Provides:       bundled(node-cmd-shim) = 7.0.0
+Provides:       bundled(node-color-convert) = 2.0.1
+Provides:       bundled(node-color-name) = 1.1.4
+Provides:       bundled(node-common-ancestor-path) = 1.0.1
+Provides:       bundled(node-cross-spawn) = 7.0.6
+Provides:       bundled(node-cssesc) = 3.0.0
+Provides:       bundled(node-debug) = 4.3.7
+Provides:       bundled(node-diff) = 5.2.0
+Provides:       bundled(node-eastasianwidth) = 0.2.0
+Provides:       bundled(node-emoji-regex) = 8.0.0
+Provides:       bundled(node-emoji-regex) = 9.2.2
+Provides:       bundled(node-encoding) = 0.1.13
+Provides:       bundled(node-env-paths) = 2.2.1
+Provides:       bundled(node-err-code) = 2.0.3
+Provides:       bundled(node-exponential-backoff) = 3.1.1
+Provides:       bundled(node-fastest-levenshtein) = 1.0.16
+Provides:       bundled(node-foreground-child) = 3.3.0
+Provides:       bundled(node-fs-minipass) = 2.1.0
+Provides:       bundled(node-fs-minipass) = 3.0.3
+Provides:       bundled(node-glob) = 10.4.5
+Provides:       bundled(node-graceful-fs) = 4.2.11
+Provides:       bundled(node-hosted-git-info) = 8.0.2
+Provides:       bundled(node-http-cache-semantics) = 4.1.1
+Provides:       bundled(node-http-proxy-agent) = 7.0.2
+Provides:       bundled(node-https-proxy-agent) = 7.0.5
+Provides:       bundled(node-iconv-lite) = 0.6.3
+Provides:       bundled(node-ignore-walk) = 7.0.0
+Provides:       bundled(node-imurmurhash) = 0.1.4
+Provides:       bundled(node-indent-string) = 4.0.0
+Provides:       bundled(node-ini) = 5.0.0
+Provides:       bundled(node-init-package-json) = 7.0.2
+Provides:       bundled(node-ip-address) = 9.0.5
+Provides:       bundled(node-ip-regex) = 5.0.0
+Provides:       bundled(node-is-cidr) = 5.1.0
+Provides:       bundled(node-is-fullwidth-code-point) = 3.0.0
+Provides:       bundled(node-isexe) = 2.0.0
+Provides:       bundled(node-isexe) = 3.1.1
+Provides:       bundled(node-jackspeak) = 3.4.3
+Provides:       bundled(node-jsbn) = 1.1.0
+Provides:       bundled(node-json-parse-even-better-errors) = 4.0.0
+Provides:       bundled(node-json-stringify-nice) = 1.1.4
+Provides:       bundled(node-jsonparse) = 1.3.1
+Provides:       bundled(node-just-diff) = 6.0.2
+Provides:       bundled(node-just-diff-apply) = 5.5.0
+Provides:       bundled(node-libnpmaccess) = 9.0.0
+Provides:       bundled(node-libnpmdiff) = 7.0.0
+Provides:       bundled(node-libnpmexec) = 9.0.0
+Provides:       bundled(node-libnpmfund) = 6.0.0
+Provides:       bundled(node-libnpmhook) = 11.0.0
+Provides:       bundled(node-libnpmorg) = 7.0.0
+Provides:       bundled(node-libnpmpack) = 8.0.0
+Provides:       bundled(node-libnpmpublish) = 10.0.1
+Provides:       bundled(node-libnpmsearch) = 8.0.0
+Provides:       bundled(node-libnpmteam) = 7.0.0
+Provides:       bundled(node-libnpmversion) = 7.0.0
+Provides:       bundled(node-lru-cache) = 10.4.3
+Provides:       bundled(node-make-fetch-happen) = 14.0.3
+Provides:       bundled(node-minimatch) = 9.0.5
+Provides:       bundled(node-minipass) = 3.3.6
+Provides:       bundled(node-minipass) = 5.0.0
+Provides:       bundled(node-minipass) = 7.1.2
+Provides:       bundled(node-minipass-collect) = 2.0.1
+Provides:       bundled(node-minipass-fetch) = 4.0.0
+Provides:       bundled(node-minipass-flush) = 1.0.5
+Provides:       bundled(node-minipass-pipeline) = 1.2.4
+Provides:       bundled(node-minipass-sized) = 1.0.3
+Provides:       bundled(node-minizlib) = 2.1.2
+Provides:       bundled(node-minizlib) = 3.0.1
+Provides:       bundled(node-mkdirp) = 1.0.4
+Provides:       bundled(node-mkdirp) = 3.0.1
+Provides:       bundled(node-ms) = 2.1.3
+Provides:       bundled(node-mute-stream) = 2.0.0
+Provides:       bundled(node-negotiator) = 1.0.0
+Provides:       bundled(node-node-gyp) = 11.0.0
+Provides:       bundled(node-nopt) = 8.0.0
+Provides:       bundled(node-normalize-package-data) = 7.0.0
+Provides:       bundled(node-npm-audit-report) = 6.0.0
+Provides:       bundled(node-npm-bundled) = 4.0.0
+Provides:       bundled(node-npm-install-checks) = 7.1.1
+Provides:       bundled(node-npm-normalize-package-bin) = 4.0.0
+Provides:       bundled(node-npm-package-arg) = 12.0.0
+Provides:       bundled(node-npm-packlist) = 9.0.0
+Provides:       bundled(node-npm-pick-manifest) = 10.0.0
+Provides:       bundled(node-npm-profile) = 11.0.1
+Provides:       bundled(node-npm-registry-fetch) = 18.0.2
+Provides:       bundled(node-npm-user-validate) = 3.0.0
+Provides:       bundled(node-p-map) = 4.0.0
+Provides:       bundled(node-p-map) = 7.0.2
+Provides:       bundled(node-package-json-from-dist) = 1.0.1
+Provides:       bundled(node-pacote) = 19.0.1
+Provides:       bundled(node-pacote) = 20.0.0
+Provides:       bundled(node-parse-conflict-json) = 4.0.0
+Provides:       bundled(node-path-key) = 3.1.1
+Provides:       bundled(node-path-scurry) = 1.11.1
+Provides:       bundled(node-postcss-selector-parser) = 6.1.2
+Provides:       bundled(node-proc-log) = 5.0.0
+Provides:       bundled(node-proggy) = 3.0.0
+Provides:       bundled(node-promise-all-reject-late) = 1.0.1
+Provides:       bundled(node-promise-call-limit) = 3.0.2
+Provides:       bundled(node-promise-inflight) = 1.0.1
+Provides:       bundled(node-promise-retry) = 2.0.1
+Provides:       bundled(node-promzard) = 2.0.0
+Provides:       bundled(node-qrcode-terminal) = 0.12.0
+Provides:       bundled(node-read) = 4.0.0
+Provides:       bundled(node-read-cmd-shim) = 5.0.0
+Provides:       bundled(node-read-package-json-fast) = 4.0.0
+Provides:       bundled(node-retry) = 0.12.0
+Provides:       bundled(node-rimraf) = 5.0.10
+Provides:       bundled(node-safer-buffer) = 2.1.2
+Provides:       bundled(node-semver) = 7.6.3
+Provides:       bundled(node-shebang-command) = 2.0.0
+Provides:       bundled(node-shebang-regex) = 3.0.0
+Provides:       bundled(node-signal-exit) = 4.1.0
+Provides:       bundled(node-sigstore) = 3.0.0
+Provides:       bundled(node-smart-buffer) = 4.2.0
+Provides:       bundled(node-socks) = 2.8.3
+Provides:       bundled(node-socks-proxy-agent) = 8.0.4
+Provides:       bundled(node-spdx-correct) = 3.2.0
+Provides:       bundled(node-spdx-exceptions) = 2.5.0
+Provides:       bundled(node-spdx-expression-parse) = 3.0.1
+Provides:       bundled(node-spdx-expression-parse) = 4.0.0
+Provides:       bundled(node-spdx-license-ids) = 3.0.20
+Provides:       bundled(node-sprintf-js) = 1.1.3
+Provides:       bundled(node-ssri) = 12.0.0
+Provides:       bundled(node-string-width) = 4.2.3
+Provides:       bundled(node-string-width) = 5.1.2
+Provides:       bundled(node-strip-ansi) = 6.0.1
+Provides:       bundled(node-strip-ansi) = 7.1.0
+Provides:       bundled(node-supports-color) = 9.4.0
+Provides:       bundled(node-tar) = 6.2.1
+Provides:       bundled(node-tar) = 7.4.3
+Provides:       bundled(node-text-table) = 0.2.0
+Provides:       bundled(node-tiny-relative-date) = 1.3.0
+Provides:       bundled(node-treeverse) = 3.0.0
+Provides:       bundled(node-tuf-js) = 3.0.1
+Provides:       bundled(node-unique-filename) = 4.0.0
+Provides:       bundled(node-unique-slug) = 5.0.0
+Provides:       bundled(node-util-deprecate) = 1.0.2
+Provides:       bundled(node-validate-npm-package-license) = 3.0.4
+Provides:       bundled(node-validate-npm-package-name) = 6.0.0
+Provides:       bundled(node-walk-up-path) = 3.0.1
+Provides:       bundled(node-which) = 2.0.2
+Provides:       bundled(node-which) = 5.0.0
+Provides:       bundled(node-wrap-ansi) = 7.0.0
+Provides:       bundled(node-wrap-ansi) = 8.1.0
+Provides:       bundled(node-write-file-atomic) = 6.0.0
+Provides:       bundled(node-yallist) = 4.0.0
+Provides:       bundled(node-yallist) = 5.0.0
+
+%description -n npm22
+A package manager for Node.js that allows developers to install and
+publish packages to a package registry.
+
+%package -n corepack22
+Summary:        Helper bridge between NodeJS projects and their dependencies
+Group:          Development/Languages/NodeJS
+Requires:       nodejs-common >= 5.0
+
+%description -n corepack22
+Zero-runtime-dependency package acting as bridge between Node projects
+and their package managers.
+
+%package docs
+Summary:        Node.js API documentation
+Group:          Documentation/Other
+%if 0%{?suse_version} >= 1200
+# using noarch subpackage seems to break debuginfo on older releases
+BuildArch:      noarch
+%endif
+
+%description docs
+The API documentation for the Node.js JavaScript runtime.
+
+%prep
+%if ! %{git_node}
+echo "`grep node-v%{version}.tar.xz %{S:1} | head -n1 | cut -c1-64`  %{S:0}" | sha256sum -c
+%setup -q -n node-v%{version}
+%else
+%setup -q -n node-%{version}
+%endif
+
+%if %{node_version_number} == 16
+tar zxf %{S:12}
+%endif
+
+%if %{node_version_number} <= 10
+rm -r deps/npm/*
+pushd deps/npm
+tar zxf %{SOURCE9} --strip-components=1
+tar Jxf %{SOURCE90}
+popd
+%endif
+
+%if %{node_version_number} >= 10
+tar Jxf %{SOURCE11}
+%endif
+
+# downgrade node-gyp to last version that supports python 3.4 for SLE12
+%if 0%{?suse_version} && 0%{?suse_version} < 1500 && %{node_version_number} >= 16 && %{node_version_number} < 22
+rm -r  deps/npm/node_modules/node-gyp
+mkdir deps/npm/node_modules/node-gyp
+pushd deps/npm/node_modules/node-gyp
+tar Jxf %{SOURCE5}
+popd
+
+%if %{node_version_number} >= 19
+%else
+%endif
+%endif
+
+%patch -P 1 -p1
+%patch -P 3 -p1
+%if 0%{?suse_version} < 1500
+%endif
+%if %{node_version_number} <= 12 && 0%{?suse_version} < 1500
+%patch -P 5 -p1
+%endif
+%patch -P 7 -p1
+%if 0%{with valgrind_tests}
+%endif
+%patch -P 13 -p1
+%patch -P 100 -p1
+%patch -P 101 -p1
+%if 0%{?suse_version} >= 1500 || 0%{?suse_version} == 0
+%patch -P 102 -p1
+%endif
+# Add check_output to configure script (not part of Python 2.6 in SLE11).
+%if 0%{?suse_version} == 1110
+%endif
+%patch -P 104 -p1
+%patch -P 110 -p1
+%patch -P 120 -p1
+%patch -P 132 -p1
+%if ! 0%{with openssl_RSA_get0_pss_params}
+%endif
+%patch -P 200 -p1
+
+%patch -P 305 -p1
+%patch -P 307 -p1
+%patch -P 309 -p1
+%patch -P 311 -p1
+
+%if %{node_version_number} == 12
+# minimist security update - patch50
+rm -r deps/npm/node_modules/mkdirp/node_modules/minimist
+rmdir ./deps/npm/node_modules/mkdirp/node_modules
+%endif
+
+# remove backup files, if any
+find -name \*~ -print0 -delete
+
+# abnormalities from patching
+find \( -name \*.js.orig -or -name \*.md.orig -or -name \*.1.orig \) -delete
+
+
+
+%build
+# normalize shebang
+%if %{node_version_number} >= 12
+find -type f -exec sed -i -e '1 s,^#!\s\?/usr/bin/env python\d*$,#!/usr/bin/python3,' -e '1 s,^#!\s\?/usr/bin/python$,#!/usr/bin/python3,' {} +
+%else
+find -type f -exec sed -i '1 s,^#!\s\?/usr/bin/env python$,#!/usr/bin/python,' {} +
+%endif
+find deps/npm -type f -exec sed -i '1 s,^#!\s\?/usr/bin/env node$,#!/usr/bin/node%{node_version_number},' {} +
+find deps/npm -type f -exec sed -i '1 s,^#!\s\?/usr/bin/env \(bash\|sh\)\?$,#!/bin/bash,' {} +
+
+. %{SOURCE20}
+# Make sure nothing gets included from bundled deps:
+# We only delete the source and header files, because
+# the remaining build scripts are still used.
+%if ! 0%{with intree_openssl}
+find deps/openssl -name *.[ch] -delete
+%endif
+
+%if ! 0%{with intree_icu}
+rm -rf deps/icu-small
+%endif
+
+%if ! 0%{with intree_cares}
+find deps/cares -name *.[ch] -delete
+%endif
+
+find deps/zlib -name *.[ch] -delete
+
+cat > spec.build.config <<EOF
+export PREFIX=/usr
+export CFLAGS="%{?build_cflags:%build_cflags}%{?!build_cflags:%optflags} -fno-strict-aliasing"
+# -Wno-class-memaccess is not available in gcc < 8 (= system compiler on Leap until at least 15.3 is gcc7)
+export CXXFLAGS="%{?build_cxxflags:%build_cxxflags}%{?!build_cxxflags:%optflags} -Wno-error=return-type -fno-strict-aliasing"
+%if 0%{?forced_gcc_version} >= 8 || 0%{?suse_version} > 1500 || 0%{?fedora_version} >= 35
+export CXXFLAGS="\${CXXFLAGS} -Wno-class-memaccess"
+%endif
+export LDFLAGS="%{?build_ldflags}"
+
+%if !0%{?with nodejs_lto}
+export LDFLAGS="\${LDFLAGS} -fno-lto"
+%endif
+
+# reduce disk space pressure
+export CFLAGS="\${CFLAGS} -g1"
+export CXXFLAGS="\${CXXFLAGS} -g1"
+export LDFLAGS="\${LDFLAGS} -Wl,--reduce-memory-overhead"
+
+%if 0%{?forced_gcc_version:1}
+export CC=gcc-%{forced_gcc_version}
+export CXX=g++-%{forced_gcc_version}
+%endif
+
+EOF
+
+. ./spec.build.config
+
+./configure \
+    --prefix=%{_prefix} \
+%if 0%{?with nodejs_lto}
+    --enable-lto \
+%endif
+%if ! 0%{with intree_openssl}
+    --shared-openssl \
+%endif
+    --shared-zlib \
+%if ! 0%{with intree_cares}
+    --shared-cares \
+%endif
+%if ! 0%{with intree_icu}
+    --with-intl=system-icu \
+%endif
+%if ! 0%{with intree_nghttp2}
+    --shared-nghttp2 \
+%endif
+%if ! 0%{with intree_brotli}
+    --shared-brotli \
+%endif
+%if 0%{with gdb}
+    --gdb \
+%endif
+%if %{node_version_number} < 19
+    --without-dtrace \
+%endif
+%if %{node_version_number} >= 22 && 0%{?suse_version} > 1500
+    --shared-sqlite \
+%endif
+%if %{node_version_number} >= 16 && (0%{?suse_version} > 1550 || 0%{?sle_version} >= 150400)
+    --openssl-default-cipher-list=PROFILE=SYSTEM \
+%endif
+    --openssl-use-def-ca-store
+
+decoupled_cmd make %{?_smp_mflags}
+
+# Fix documentation permissions
+find doc/api -type f -exec chmod 0644 {} +
+
+%install
+. %{SOURCE20}
+. ./spec.build.config
+
+decoupled_cmd %make_install %{?_smp_mflags}
+rm %{buildroot}%{_datadir}/doc/node/gdbinit
+rm -f %{buildroot}%{_datadir}/doc/node/lldbinit
+rm -f %{buildroot}%{_datadir}/doc/node/lldb_commands.py
+
+# remove .bak files, if any
+find %{buildroot} -name \*.bak -print -delete
+
+# npm/npx man page
+install -D -m 644 deps/npm/man/man1/npm.1 %{buildroot}%{_mandir}/man1/npm%{node_version_number}.1
+install -D -m 644 deps/npm/man/man1/npx.1 %{buildroot}%{_mandir}/man1/npx%{node_version_number}.1
+
+#node-gyp needs common.gypi too
+install -D -m 644 common.gypi \
+        %{buildroot}%{_libdir}/node_modules/npm%{node_version_number}/node_modules/node-gyp/common.gypi
+#       %%{buildroot}%%{_datadir}/node/common.gypi
+# install addon-rpm.gypi
+install -D -m 644 addon-rpm.gypi \
+       %{buildroot}%{_libdir}/node_modules/npm%{node_version_number}/node_modules/node-gyp/addon-rpm.gypi
+
+# clean
+# hidden files and directories
+find %{buildroot}%{_libdir}/node_modules/npm%{node_version_number} -name ".*" -exec rm -Rf -- {} +
+# windows stuff
+find %{buildroot}%{_libdir}/node_modules/npm%{node_version_number} -name "*.bat" -delete
+find %{buildroot}%{_libdir}/node_modules/npm%{node_version_number} -name "*.cmd" -delete
+# build stuff
+find %{buildroot}%{_libdir}/node_modules/npm%{node_version_number} -name "Makefile" -delete
+rm -rf %{buildroot}%{_libdir}/node_modules/npm%{node_version_number}/{test,scripts}
+find %{buildroot}%{_libdir}/node_modules/npm%{node_version_number}/node_modules -name "*.sh" -delete
+rm -rf %{buildroot}%{_libdir}/node_modules/npm%{node_version_number}/node_modules/node-gyp/src
+# remove examples/tests/benchmark stuff
+find %{buildroot}%{_libdir}/node_modules/npm%{node_version_number}/node_modules -name "example*" -exec rm -Rf -- {} +
+find %{buildroot}%{_libdir}/node_modules/npm%{node_version_number}/node_modules -name "*_test.*" -delete
+find %{buildroot}%{_libdir}/node_modules/npm%{node_version_number}/node_modules -type d -name "benchmark" -exec rm -Rf -- {} +
+
+# fix permissions
+chmod 0755 %{buildroot}%{_libdir}/node_modules/npm%{node_version_number}/bin/np*-cli.js
+! test -f %{buildroot}%{_libdir}/node_modules/npm%{node_version_number}/bin/node-gyp-bin/node-gyp || \
+    chmod 0755 %{buildroot}%{_libdir}/node_modules/npm%{node_version_number}/bin/node-gyp-bin/node-gyp
+chmod 0755 %{buildroot}%{_libdir}/node_modules/npm%{node_version_number}/node_modules/node-gyp/bin/node-gyp.js
+! test -f %{buildroot}%{_libdir}/node_modules/npm%{node_version_number}/node_modules/npm-lifecycle/node-gyp-bin/node-gyp || \
+    chmod 0755 %{buildroot}%{_libdir}/node_modules/npm%{node_version_number}/node_modules/npm-lifecycle/node-gyp-bin/node-gyp
+
+# browser.js is useless for npm cli
+find %{buildroot}%{_libdir}/node_modules/npm%{node_version_number} -name "browser.js" -delete
+
+# file duplicates
+%fdupes %{buildroot}%{_libdir}/node_modules/npm%{node_version_number}
+%fdupes %{buildroot}%{_includedir}/node%{node_version_number}
+
+# Update alternatives
+%if ! %{with libalternatives}
+mkdir -p %{buildroot}%{_sysconfdir}/alternatives
+ln -s -f node-default     %{buildroot}%{_sysconfdir}/alternatives/node-default
+ln -s -f node.1%{ext_man} %{buildroot}%{_sysconfdir}/alternatives/node.1%{ext_man}
+ln -s -f npm-default      %{buildroot}%{_sysconfdir}/alternatives/npm-default
+ln -s -f npm.1%{ext_man}  %{buildroot}%{_sysconfdir}/alternatives/npm.1%{ext_man}
+ln -s %{_sysconfdir}/alternatives/node-default         %{buildroot}%{_bindir}/node-default
+ln -s %{_sysconfdir}/alternatives/node.1%{ext_man}     %{buildroot}%{_mandir}/man1/node.1%{ext_man}
+ln -s %{_sysconfdir}/alternatives/npm-default          %{buildroot}%{_bindir}/npm-default
+ln -s %{_sysconfdir}/alternatives/npm.1%{ext_man}      %{buildroot}%{_mandir}/man1/npm.1%{ext_man}
+ln -s -f npx-default      %{buildroot}%{_sysconfdir}/alternatives/npx-default
+ln -s -f npx.1%{ext_man}  %{buildroot}%{_sysconfdir}/alternatives/npx.1%{ext_man}
+ln -s %{_sysconfdir}/alternatives/npx-default          %{buildroot}%{_bindir}/npx-default
+ln -s %{_sysconfdir}/alternatives/npx.1%{ext_man}      %{buildroot}%{_mandir}/man1/npx.1%{ext_man}
+%if %{node_version_number} >= 14
+ln -s -f corepack-default      %{buildroot}%{_sysconfdir}/alternatives/corepack-default
+ln -s -f corepack.1%{ext_man}  %{buildroot}%{_sysconfdir}/alternatives/corepack.1%{ext_man}
+ln -s %{_sysconfdir}/alternatives/corepack-default          %{buildroot}%{_bindir}/corepack-default
+ln -s %{_sysconfdir}/alternatives/corepack.1%{ext_man}      %{buildroot}%{_mandir}/man1/corepack.1%{ext_man}
+%endif
+%endif
+
+# libalternatives - can always ship
+mkdir -p %{buildroot}%{_datadir}/libalternatives/{node,npm,npx};
+cat > %{buildroot}%{_datadir}/libalternatives/node/%{node_version_number}.conf <<EOF
+binary=%{_bindir}/node%{node_version_number}
+man=node%{node_version_number}.1
+EOF
+cat > %{buildroot}%{_datadir}/libalternatives/npm/%{node_version_number}.conf <<EOF
+binary=%{_bindir}/npm%{node_version_number}
+man=npm%{node_version_number}.1
+group=npm,npx
+EOF
+cat > %{buildroot}%{_datadir}/libalternatives/npx/%{node_version_number}.conf <<EOF
+binary=%{_bindir}/npx%{node_version_number}
+man=npx%{node_version_number}.1
+group=npm,npx
+EOF
+%if %{node_version_number} >= 14
+mkdir -p %{buildroot}%{_datadir}/libalternatives/corepack;
+cat > %{buildroot}%{_datadir}/libalternatives/corepack/%{node_version_number}.conf <<EOF
+binary=%{_bindir}/corepack%{node_version_number}
+man=corepack%{node_version_number}.1
+EOF
+%endif
+
+# We need to own license directory on old versions of SLE
+%if 0%{?suse_version} < 1500
+mkdir -p %{buildroot}%{_defaultlicensedir}
+%endif
+
+%check
+. ./spec.build.config
+
+# Relax the crypto policies for the test-suite
+export OPENSSL_SYSTEM_CIPHERS_OVERRIDE=xyz_nonexistent_file
+export OPENSSL_CONF=''
+
+export CI_JS_SUITES=default
+export NODE_TEST_NO_INTERNET=1
+
+%if %{node_version_number} >= 12
+find test \( -name \*.out -or -name \*.js \) -exec sed -i 's,Use `node ,Use `node%{node_version_number} ,' {} \;
+%endif
+
+%if %{node_version_number} >= 20
+rm test/parallel/test-strace-openat-openssl.js
+%endif
+
+# Update the python3 executable name to point at forced python version
+# needed to fix build on SLE12 SP5
+%if 0%{?forced_python_version:1}
+sed -i -e "s,'python3','python%{forced_python_version}'," test/parallel/test-child-process-set-blocking.js
+test -e tools/pseudo-tty.py && sed -i -e "s,^#!/usr/bin/env python3$,#!/usr/bin/python%{forced_python_version}," tools/pseudo-tty.py ||:
+export PYTHON="/usr/bin/python%{forced_python_version}"
+%endif
+
+ln addon-rpm.gypi deps/npm/node_modules/node-gyp/addon-rpm.gypi
+# Tarball doesn't have eslint package distributed, so disable some tests
+find test -name \*-eslint-\* -print -delete
+# No documentation is generated, don't bother checking it, and check broken on older nodejs
+%if %{node_version_number} <= 10
+rm test/doctool/test-make-doc.js
+%endif
+# DNS lookup doesn't work in build root
+rm test/parallel/test-dns-cancel-reverse-lookup.js \
+   test/parallel/test-dns-resolveany.js
+# multicast test fail since no socket?
+rm test/parallel/test-dgram-membership.js
+# ::1 not defined in OBS on TW - https://github.com/openSUSE/obs-build/issues/848
+rm test/report/test-report-exclude-network.js
+
+%if %{node_version_number} >= 18
+# OBS broken /etc/hosts -- https://github.com/openSUSE/open-build-service/issues/13104
+rm test/parallel/test-net-socket-connect-without-cb.js test/parallel/test-tcp-wrap-listen.js
+%endif
+
+%if 0%{?fedora_version}
+# test/parallel/test-crypto-certificate.js requires OPENSSL_ENABLE_MD5_VERIFY=1
+# as SPKAC required MD5 for verification
+# https://src.fedoraproject.org/rpms/openssl/blob/rawhide/f/0006-Disable-signature-verification-with-totally-unsafe-h.patch
+export OPENSSL_ENABLE_MD5_VERIFY=1
+
+# test failures
+# error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake
+# failure:ssl/record/rec_layer_s3.c:1543:SSL alert number 40
+rm test/parallel/test-tls-no-sslv3.js
+%if %{node_version_number} >= 18
+rm -r test/addons/openssl-providers
+rm test/parallel/test-crypto-fips.js
+%endif
+
+%endif
+# fedora
+
+# qemu test failures
+%if %{node_version_number} >= 18 && 0%{?qemu_user_space_build}
+# sequential/test-debugger-*: timeout hit?
+rm -v test/*/test-debugger-*.js
+# parallel tests are not parallel under qemu
+rm -v test/parallel/test-*.js test/parallel/test-*.mjs
+# RuntimeError: memory access out of bounds
+rm -v test/wasi/test-*.js
+# ESM import hits assertion, timeout error?
+rm -v test/es-module/test-esm-*.js
+# AssertionError [ERR_ASSERTION]: Missing expected exception
+rm -v test/js-native-api/test_constructor/test*.js
+# Too slow for performance tests
+rm -v test/sequential/test-perf-*.js test/sequential/test-diagnostic-*.js
+%endif
+
+# Run CI tests
+%if 0%{with valgrind_tests}
+# valgrind may have false positives, so do not fail on these by default
+make test-valgrind ||:
+%endif
+make test-ci
+
+%files
+%defattr(-, root, root)
+%license LICENSE
+%doc doc/changelogs/CHANGELOG_V%{node_version_number}.md
+%doc *.md
+%doc deps/v8/tools/gdbinit
+%dir %{_libdir}/node_modules
+%dir %{_datadir}/libalternatives
+%dir %{_datadir}/libalternatives/node
+%{_datadir}/libalternatives/node/%{node_version_number}.conf
+%{_bindir}/node%{node_version_number}
+%{_mandir}/man1/node%{node_version_number}.1%{ext_man}
+%if ! 0%{with libalternatives}
+%ghost %{_bindir}/node-default
+%ghost %{_mandir}/man1/node.1%{ext_man}
+%ghost %{_sysconfdir}/alternatives/node-default
+%ghost %{_sysconfdir}/alternatives/node.1%{ext_man}
+%endif
+%exclude %{_libdir}/node_modules/npm%{node_version_number}
+# We need to own directory on old versions of SLE
+%if 0%{?suse_version} < 1500
+%dir %{_defaultlicensedir}
+%endif
+
+%files -n npm%{node_version_number}
+%defattr(-, root, root)
+%dir %{_datadir}/libalternatives
+%dir %{_datadir}/libalternatives/npm
+%dir %{_datadir}/libalternatives/npx
+%{_datadir}/libalternatives/npm/%{node_version_number}.conf
+%{_datadir}/libalternatives/npx/%{node_version_number}.conf
+%{_bindir}/npm%{node_version_number}
+%{_libdir}/node_modules/npm%{node_version_number}
+%{_mandir}/man1/npm%{node_version_number}.1%{ext_man}
+%if ! 0%{with libalternatives}
+%ghost %{_bindir}/npm-default
+%ghost %{_mandir}/man1/npm.1%{ext_man}
+%ghost %{_sysconfdir}/alternatives/npm-default
+%ghost %{_sysconfdir}/alternatives/npm.1%{ext_man}
+%endif
+
+%{_bindir}/npx%{node_version_number}
+%{_mandir}/man1/npx%{node_version_number}.1%{ext_man}
+%if ! %{with libalternatives}
+%ghost %{_bindir}/npx-default
+%ghost %{_mandir}/man1/npx.1%{ext_man}
+%ghost %{_sysconfdir}/alternatives/npx-default
+%ghost %{_sysconfdir}/alternatives/npx.1%{ext_man}
+%endif
+
+%if %{node_version_number} >= 14
+%files -n corepack%{node_version_number}
+%defattr(-, root, root)
+%{_bindir}/corepack%{node_version_number}
+%{_libdir}/node_modules/corepack%{node_version_number}
+%dir %{_datadir}/libalternatives/corepack
+%{_datadir}/libalternatives/corepack/%{node_version_number}.conf
+%if ! %{with libalternatives}
+%ghost %{_bindir}/corepack-default
+%ghost %{_mandir}/man1/corepack.1%{ext_man}
+%ghost %{_sysconfdir}/alternatives/corepack-default
+%ghost %{_sysconfdir}/alternatives/corepack.1%{ext_man}
+%endif
+%endif
+
+%files devel
+%defattr(-, root, root)
+%{_includedir}/node%{node_version_number}
+%if %{node_version_number} < 19
+%dir %{_datadir}/systemtap
+%dir %{_datadir}/systemtap/tapset
+%{_datadir}/systemtap/tapset/node%{node_version_number}.stp
+%endif
+
+%files docs
+%defattr(-,root,root)
+%doc doc/api
+
+%if %{with libalternatives}
+
+%post
+update-alternatives --remove node-default %{_bindir}/node%{node_version_number}
+
+%post -n npm%{node_version_number}
+update-alternatives --remove npm-default %{_bindir}/npm%{node_version_number}
+update-alternatives --remove npx-default %{_bindir}/npx%{node_version_number}
+
+%if %{node_version_number} >= 14
+%post -n corepack%{node_version_number}
+update-alternatives --remove corepack-default %{_bindir}/corepack%{node_version_number}
+%endif
+
+%else
+%pre
+# remove files that are no longer owned but provided by update-alternatives
+if ! [ -L %{_mandir}/man1/node.1%{ext_man} ]; then
+    rm -f %{_mandir}/man1/node.1%{ext_man}
+fi
+
+%post
+update-alternatives \
+        --install %{_bindir}/node-default node-default %{_bindir}/node%{node_version_number} %{node_version_number} \
+        --slave %{_mandir}/man1/node.1%{ext_man} node.1%{ext_man} %{_mandir}/man1/node%{node_version_number}.1%{ext_man}
+
+%postun
+if [ ! -f %{_bindir}/node%{node_version_number} ] ; then
+    update-alternatives --remove node-default %{_bindir}/node%{node_version_number}
+fi
+
+%pre -n npm%{node_version_number}
+# remove files that are no longer owned but provided by update-alternatives
+if ! [ -L %{_mandir}/man1/npm.1%{ext_man} ]; then
+    rm -f %{_mandir}/man1/npm.1%{ext_man}
+fi
+
+%post -n npm%{node_version_number}
+update-alternatives \
+        --install %{_bindir}/npm-default npm-default %{_bindir}/npm%{node_version_number} %{node_version_number} \
+        --slave %{_mandir}/man1/npm.1%{ext_man} npm.1%{ext_man} %{_mandir}/man1/npm%{node_version_number}.1%{ext_man}
+update-alternatives \
+        --install %{_bindir}/npx-default npx-default %{_bindir}/npx%{node_version_number} %{node_version_number} \
+        --slave %{_mandir}/man1/npx.1%{ext_man} npx.1%{ext_man} %{_mandir}/man1/npx%{node_version_number}.1%{ext_man}
+
+%postun -n npm%{node_version_number}
+if [ ! -f %{_bindir}/npm%{node_version_number} ] ; then
+    update-alternatives --remove npm-default %{_bindir}/npm%{node_version_number}
+fi
+if [ ! -f %{_bindir}/npx%{node_version_number} ] ; then
+    update-alternatives --remove npx-default %{_bindir}/npx%{node_version_number}
+fi
+
+%if %{node_version_number} >= 14
+%pre -n corepack%{node_version_number}
+# remove files that are no longer owned but provided by update-alternatives
+if ! [ -L %{_mandir}/man1/corepack.1%{ext_man} ]; then
+    rm -f %{_mandir}/man1/corepack.1%{ext_man}
+fi
+
+%post -n corepack%{node_version_number}
+update-alternatives \
+        --install %{_bindir}/corepack-default corepack-default %{_bindir}/corepack%{node_version_number} %{node_version_number} \
+        --slave %{_mandir}/man1/corepack.1%{ext_man} corepack.1%{ext_man} %{_mandir}/man1/corepack%{node_version_number}.1%{ext_man}
+
+%postun -n corepack%{node_version_number}
+if [ ! -f %{_bindir}/corepack%{node_version_number} ] ; then
+    update-alternatives --remove corepack-default %{_bindir}/corepack%{node_version_number}
+fi
+%endif
+
+%endif
+
+%changelog
diff --git a/npm_search_paths.patch b/npm_search_paths.patch
new file mode 100644
index 0000000..c481aeb
--- /dev/null
+++ b/npm_search_paths.patch
@@ -0,0 +1,32 @@
+Index: node-v22.1.0/deps/npm/lib/commands/help-search.js
+===================================================================
+--- node-v22.1.0.orig/deps/npm/lib/commands/help-search.js
++++ node-v22.1.0/deps/npm/lib/commands/help-search.js
+@@ -17,7 +17,7 @@ class HelpSearch extends BaseCommand {
+       throw this.usageError()
+     }
+ 
+-    const docPath = path.resolve(this.npm.npmRoot, 'docs/content')
++    const docPath = '/usr/share/doc/packages/nodejs'
+     let files = await glob(`${globify(docPath)}/*/*.md`)
+     // preserve glob@8 behavior
+     files = files.sort((a, b) => a.localeCompare(b, 'en'))
+Index: node-v22.1.0/deps/npm/lib/npm.js
+===================================================================
+--- node-v22.1.0.orig/deps/npm/lib/npm.js
++++ node-v22.1.0/deps/npm/lib/npm.js
+@@ -338,7 +338,13 @@ class Npm {
+   }
+ 
+   get globalPrefix () {
+-    return this.config.globalPrefix
++    let prefix = this.config.globalPrefix
++
++    // don't poop all over distro territory - use /usr/local instead
++    if (prefix === '/usr')
++      return '/usr/local'
++
++    return prefix;
+   }
+ 
+   get localPrefix () {
diff --git a/old_cares.patch b/old_cares.patch
new file mode 100644
index 0000000..e6f906a
--- /dev/null
+++ b/old_cares.patch
@@ -0,0 +1,155 @@
+temporary revert changes until we can upgrade c-ares in SLE-15:Update
+
+commit bf68733e7f61bf4ff51a456e27123f44a526aebc
+Author: Aviv Keller <redyetidev@gmail.com>
+Date:   Wed Oct 30 10:10:28 2024 -0400
+
+    dns: stop using deprecated `ares_query`
+    
+    PR-URL: https://github.com/nodejs/node/pull/55430
+    Refs: https://github.com/nodejs/node/issues/52464
+    Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
+    Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
+
+
+Index: node-v22.12.0/src/cares_wrap.cc
+===================================================================
+--- node-v22.12.0.orig/src/cares_wrap.cc
++++ node-v22.12.0/src/cares_wrap.cc
+@@ -825,62 +825,62 @@ void ChannelWrap::EnsureServers() {
+ }
+ 
+ int AnyTraits::Send(QueryWrap<AnyTraits>* wrap, const char* name) {
+-  wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_ANY);
++  wrap->AresQuery(name, ns_c_in, ns_t_any);
+   return ARES_SUCCESS;
+ }
+ 
+ int ATraits::Send(QueryWrap<ATraits>* wrap, const char* name) {
+-  wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_A);
++  wrap->AresQuery(name, ns_c_in, ns_t_a);
+   return ARES_SUCCESS;
+ }
+ 
+ int AaaaTraits::Send(QueryWrap<AaaaTraits>* wrap, const char* name) {
+-  wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_AAAA);
++  wrap->AresQuery(name, ns_c_in, ns_t_aaaa);
+   return ARES_SUCCESS;
+ }
+ 
+ int CaaTraits::Send(QueryWrap<CaaTraits>* wrap, const char* name) {
+-  wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_CAA);
++  wrap->AresQuery(name, ns_c_in, T_CAA);
+   return ARES_SUCCESS;
+ }
+ 
+ int CnameTraits::Send(QueryWrap<CnameTraits>* wrap, const char* name) {
+-  wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_CNAME);
++  wrap->AresQuery(name, ns_c_in, ns_t_cname);
+   return ARES_SUCCESS;
+ }
+ 
+ int MxTraits::Send(QueryWrap<MxTraits>* wrap, const char* name) {
+-  wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_MX);
++  wrap->AresQuery(name, ns_c_in, ns_t_mx);
+   return ARES_SUCCESS;
+ }
+ 
+ int NsTraits::Send(QueryWrap<NsTraits>* wrap, const char* name) {
+-  wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_NS);
++  wrap->AresQuery(name, ns_c_in, ns_t_ns);
+   return ARES_SUCCESS;
+ }
+ 
+ int TxtTraits::Send(QueryWrap<TxtTraits>* wrap, const char* name) {
+-  wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_TXT);
++  wrap->AresQuery(name, ns_c_in, ns_t_txt);
+   return ARES_SUCCESS;
+ }
+ 
+ int SrvTraits::Send(QueryWrap<SrvTraits>* wrap, const char* name) {
+-  wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_SRV);
++  wrap->AresQuery(name, ns_c_in, ns_t_srv);
+   return ARES_SUCCESS;
+ }
+ 
+ int PtrTraits::Send(QueryWrap<PtrTraits>* wrap, const char* name) {
+-  wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_PTR);
++  wrap->AresQuery(name, ns_c_in, ns_t_ptr);
+   return ARES_SUCCESS;
+ }
+ 
+ int NaptrTraits::Send(QueryWrap<NaptrTraits>* wrap, const char* name) {
+-  wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_NAPTR);
++  wrap->AresQuery(name, ns_c_in, ns_t_naptr);
+   return ARES_SUCCESS;
+ }
+ 
+ int SoaTraits::Send(QueryWrap<SoaTraits>* wrap, const char* name) {
+-  wrap->AresQuery(name, ARES_CLASS_IN, ARES_REC_TYPE_SOA);
++  wrap->AresQuery(name, ns_c_in, ns_t_soa);
+   return ARES_SUCCESS;
+ }
+ 
+Index: node-v22.12.0/src/cares_wrap.h
+===================================================================
+--- node-v22.12.0.orig/src/cares_wrap.h
++++ node-v22.12.0/src/cares_wrap.h
+@@ -246,20 +246,18 @@ class QueryWrap final : public AsyncWrap
+     return Traits::Send(this, name);
+   }
+ 
+-  void AresQuery(const char* name,
+-                 ares_dns_class_t dnsclass,
+-                 ares_dns_rec_type_t type) {
++  void AresQuery(const char* name, int dnsclass, int type) {
+     channel_->EnsureServers();
+     TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(
+       TRACING_CATEGORY_NODE2(dns, native), trace_name_, this,
+       "name", TRACE_STR_COPY(name));
+-    ares_query_dnsrec(channel_->cares_channel(),
+-                      name,
+-                      dnsclass,
+-                      type,
+-                      Callback,
+-                      MakeCallbackPointer(),
+-                      nullptr);
++    ares_query(
++        channel_->cares_channel(),
++        name,
++        dnsclass,
++        type,
++        Callback,
++        MakeCallbackPointer());
+   }
+ 
+   void ParseError(int status) {
+@@ -306,20 +304,19 @@ class QueryWrap final : public AsyncWrap
+     return wrap;
+   }
+ 
+-  static void Callback(void* arg,
+-                       ares_status_t status,
+-                       size_t timeouts,
+-                       const ares_dns_record_t* dnsrec) {
++  static void Callback(
++      void* arg,
++      int status,
++      int timeouts,
++      unsigned char* answer_buf,
++      int answer_len) {
+     QueryWrap<Traits>* wrap = FromCallbackPointer(arg);
+     if (wrap == nullptr) return;
+ 
+     unsigned char* buf_copy = nullptr;
+-    size_t answer_len = 0;
+     if (status == ARES_SUCCESS) {
+-      // No need to explicitly call ares_free_string here,
+-      // as it is a wrapper around free, which is already
+-      // invoked when MallocedBuffer is destructed.
+-      ares_dns_write(dnsrec, &buf_copy, &answer_len);
++      buf_copy = node::Malloc<unsigned char>(answer_len);
++      memcpy(buf_copy, answer_buf, answer_len);
+     }
+ 
+     wrap->response_data_ = std::make_unique<ResponseData>();
diff --git a/openssl_binary_detection.patch b/openssl_binary_detection.patch
new file mode 100644
index 0000000..2e57067
--- /dev/null
+++ b/openssl_binary_detection.patch
@@ -0,0 +1,42 @@
+Allow non-standard openssl binary names
+
+Index: node-v14.15.1/test/common/index.js
+===================================================================
+--- node-v14.15.1.orig/test/common/index.js
++++ node-v14.15.1/test/common/index.js
+@@ -797,20 +797,28 @@ const common = {
+   get opensslCli() {
+     if (opensslCli !== null) return opensslCli;
+ 
++    let cli_candidates = [];
++
+     if (process.config.variables.node_shared_openssl) {
+       // Use external command
+-      opensslCli = 'openssl';
++      cli_candidates = cli_candidates.concat(['openssl-1_1', 'openssl']);
+     } else {
+       // Use command built from sources included in Node.js repository
+-      opensslCli = path.join(path.dirname(process.execPath), 'openssl-cli');
++      cli_candidates.push(path.join(path.dirname(process.execPath), 'openssl-cli'));
+     }
+ 
+-    if (exports.isWindows) opensslCli += '.exe';
++    let checkOpensslCli = function(opensslCli) {
++        if (exports.isWindows) opensslCli += '.exe';
++        const opensslCmd = spawnSync(opensslCli, ['version']);
++        if (opensslCmd.status !== 0 || opensslCmd.error !== undefined) {
++            // OpenSSL command cannot be executed
++            opensslCli = false;
++        }
++        return opensslCli;
++    };
+ 
+-    const opensslCmd = spawnSync(opensslCli, ['version']);
+-    if (opensslCmd.status !== 0 || opensslCmd.error !== undefined) {
+-      // OpenSSL command cannot be executed
+-      opensslCli = false;
++    for (let i=0; i<cli_candidates.length && !opensslCli; i=i+1) {
++        opensslCli = checkOpensslCli(cli_candidates[i]);
+     }
+     return opensslCli;
+   },
diff --git a/qemu_timeouts_arches.patch b/qemu_timeouts_arches.patch
new file mode 100644
index 0000000..dd8f509
--- /dev/null
+++ b/qemu_timeouts_arches.patch
@@ -0,0 +1,14 @@
+Index: node-v22.10.0/test/common/index.js
+===================================================================
+--- node-v22.10.0.orig/test/common/index.js
++++ node-v22.10.0/test/common/index.js
+@@ -293,6 +293,9 @@ function platformTimeout(ms) {
+     return multipliers.four * ms;
+   }
+ 
++  if (process.arch === 'riscv64') // usermode qemu slow
++    return multipliers.seven * ms;
++
+   return ms;
+ }
+ 
diff --git a/sle12_python3_compat.patch b/sle12_python3_compat.patch
new file mode 100644
index 0000000..067cd66
--- /dev/null
+++ b/sle12_python3_compat.patch
@@ -0,0 +1,35 @@
+Index: node-v19.1.0/configure
+===================================================================
+--- node-v19.1.0.orig/configure
++++ node-v19.1.0/configure
+@@ -23,7 +23,7 @@ except ImportError:
+   from distutils.spawn import find_executable as which
+ 
+ print('Node.js configure: Found Python {}.{}.{}...'.format(*sys.version_info))
+-acceptable_pythons = ((3, 11), (3, 10), (3, 9), (3, 8), (3, 7), (3, 6))
++acceptable_pythons = ((3, 11), (3, 10), (3, 9), (3, 8), (3, 7), (3, 6), (3, 4))
+ if sys.version_info[:2] in acceptable_pythons:
+   import configure
+ else:
+Index: node-v19.1.0/deps/npm/node_modules/node-gyp/lib/find-python.js
+===================================================================
+--- node-v19.1.0.orig/deps/npm/node_modules/node-gyp/lib/find-python.js
++++ node-v19.1.0/deps/npm/node_modules/node-gyp/lib/find-python.js
+@@ -15,7 +15,7 @@ const programFiles = process.env.Program
+ const programFilesX86 = process.env['ProgramFiles(x86)'] || `${programFiles} (x86)`
+ 
+ const winDefaultLocationsArray = []
+-for (const majorMinor of ['39', '38', '37', '36']) {
++for (const majorMinor of ['39', '38', '37', '36', '34']) {
+   if (foundLocalAppData) {
+     winDefaultLocationsArray.push(
+       `${localAppData}\\Programs\\Python\\Python${majorMinor}\\python.exe`,
+@@ -49,7 +49,7 @@ PythonFinder.prototype = {
+   log: logWithPrefix(log, 'find Python'),
+   argsExecutable: ['-c', 'import sys; print(sys.executable);'],
+   argsVersion: ['-c', 'import sys; print("%s.%s.%s" % sys.version_info[:3]);'],
+-  semverRange: '>=3.6.0',
++  semverRange: '>=3.4.0',
+ 
+   // These can be overridden for testing:
+   execFile: cp.execFile,
diff --git a/test-skip-y2038-on-32bit-time_t.patch b/test-skip-y2038-on-32bit-time_t.patch
new file mode 100644
index 0000000..fb2c52d
--- /dev/null
+++ b/test-skip-y2038-on-32bit-time_t.patch
@@ -0,0 +1,45 @@
+Skip 'test/parallel/test-fs-utimes-y2K38.js' on some platforms.
+
+This test fails if coreutils' touch was built with 64-bit time_t,
+while nodejs was built with 32-bit time_t.  This is currently the case
+on i586, ppc and arm.  Skip the failing last command on those
+platforms.
+
+The failure was seen since coreutils-9.0.
+
+Remove this patch once nodejs(1) also builds with 64-bit time_t.
+---
+ test/parallel/test-fs-utimes-y2K38.js |   17 +++++++++++++++++
+ 1 file changed, 17 insertions(+)
+
+Index: node-v16.6.2/test/parallel/test-fs-utimes-y2K38.js
+===================================================================
+--- node-v16.6.2.orig/test/parallel/test-fs-utimes-y2K38.js
++++ node-v16.6.2/test/parallel/test-fs-utimes-y2K38.js
+@@ -20,6 +20,26 @@ if (!common.isWindows) {
+     common.skip('File system appears to lack Y2K38 support (touch failed)');
+   }
+ 
++  // SUSE: touch-9.0 may succeed on platforms with 32-bit time_t,
++  // but the test would fail.  Skip on those platforms for now.
++  const unameResult = spawnSync('uname',
++                                ['-m'],
++                                { encoding: 'utf8' });
++  if (unameResult.status === 0) {
++    if (unameResult.stdout.trim() === 'i686') {
++      common.skip('SUSE: test skipped on platforms with 32-bit time_t');
++    }
++    if (unameResult.stdout.trim() === 'ppc') {
++      common.skip('SUSE: test skipped on platforms with 32-bit time_t');
++    }
++    if (unameResult.stdout.trim() === 'armv6l') {
++      common.skip('SUSE: test skipped on platforms with 32-bit time_t');
++    }
++    if (unameResult.stdout.trim() === 'armv7l') {
++      common.skip('SUSE: test skipped on platforms with 32-bit time_t');
++    }
++  }
++
+   // On some file systems that lack Y2K38 support, `touch` will succeed but
+   // the time will be incorrect.
+   const dateResult = spawnSync('date',
diff --git a/update_npm_tarball.sh b/update_npm_tarball.sh
new file mode 100644
index 0000000..be64379
--- /dev/null
+++ b/update_npm_tarball.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+#
+# Fetch npm module tarball that is required to run unit tests
+# which are not provided by upstream tarball
+#
+set -e
+
+tar Jxf node-v*.tar.xz
+cd node-v*/tools/doc
+npm ci
+cd ../..
+exec tar Jcf ../node_modules.tar.xz tools/doc/node_modules
diff --git a/v8-i586.patch b/v8-i586.patch
new file mode 100644
index 0000000..1489433
--- /dev/null
+++ b/v8-i586.patch
@@ -0,0 +1,40 @@
+Index: node-v22.1.0/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc
+===================================================================
+--- node-v22.1.0.orig/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc
++++ node-v22.1.0/deps/v8/src/compiler/backend/ia32/instruction-selector-ia32.cc
+@@ -1161,7 +1161,7 @@ template <typename Adapter>
+ void VisitAtomicExchange(InstructionSelectorT<Adapter>* selector,
+                          typename Adapter::node_t node, ArchOpcode opcode,
+                          MachineRepresentation rep) {
+-  using node_t = Adapter::node_t;
++  using node_t = typename Adapter::node_t;
+   IA32OperandGeneratorT<Adapter> g(selector);
+   node_t base = selector->input_at(node, 0);
+   node_t index = selector->input_at(node, 1);
+@@ -1732,7 +1732,7 @@ template <typename Adapter>
+ void VisitWord32PairShift(InstructionSelectorT<Adapter>* selector,
+                           InstructionCode opcode,
+                           typename Adapter::node_t node) {
+-  using node_t = Adapter::node_t;
++  using node_t = typename Adapter::node_t;
+   IA32OperandGeneratorT<Adapter> g(selector);
+ 
+   node_t shift = selector->input_at(node, 2);
+@@ -2507,7 +2507,7 @@ template <typename Adapter>
+ void VisitAtomicBinOp(InstructionSelectorT<Adapter>* selector,
+                       typename Adapter::node_t node, ArchOpcode opcode,
+                       MachineRepresentation rep) {
+-  using node_t = Adapter::node_t;
++  using node_t = typename Adapter::node_t;
+   AddressingMode addressing_mode;
+   IA32OperandGeneratorT<Adapter> g(selector);
+   node_t base = selector->input_at(node, 0);
+@@ -2528,7 +2528,7 @@ void VisitAtomicBinOp(InstructionSelecto
+ template <typename Adapter>
+ void VisitPairAtomicBinOp(InstructionSelectorT<Adapter>* selector,
+                           typename Adapter::node_t node, ArchOpcode opcode) {
+-  using node_t = Adapter::node_t;
++  using node_t = typename Adapter::node_t;
+   IA32OperandGeneratorT<Adapter> g(selector);
+   node_t base = selector->input_at(node, 0);
+   node_t index = selector->input_at(node, 1);
diff --git a/versioned.patch b/versioned.patch
new file mode 100644
index 0000000..4750c89
--- /dev/null
+++ b/versioned.patch
@@ -0,0 +1,227 @@
+Author: Adam Majer <amajer@suse.de>
+Date: Fri May 11 16:10:16 CEST 2018
+Summary: Generate versioned binaries
+
+Generate versioned binaries and install paths
+so we can allow concurrent installations and
+management via update_alternatives.
+
+This is also important for generation of binary
+modules for multiple versions of NodeJS
+Index: node-v22.10.0/Makefile
+===================================================================
+--- node-v22.10.0.orig/Makefile
++++ node-v22.10.0/Makefile
+@@ -79,7 +79,7 @@ BUILDTYPE_LOWER := $(shell echo $(BUILDT
+ EXEEXT := $(shell $(PYTHON) -c \
+ 		"import sys; print('.exe' if sys.platform == 'win32' else '')")
+ 
+-NODE_EXE = node$(EXEEXT)
++NODE_EXE = node22$(EXEEXT)
+ # Use $(PWD) so we can cd to anywhere before calling this
+ NODE ?= "$(PWD)/$(NODE_EXE)"
+ NODE_G_EXE = node_g$(EXEEXT)
+Index: node-v22.10.0/tools/install.py
+===================================================================
+--- node-v22.10.0.orig/tools/install.py
++++ node-v22.10.0/tools/install.py
+@@ -87,7 +87,7 @@ def uninstall(options, paths, dest):
+     try_remove(options, path, dest)
+ 
+ def package_files(options, action, name, bins):
+-  target_path = os.path.join(libdir(options), 'node_modules', name)
++  target_path = os.path.join(libdir(options), 'node_modules', name + '22')
+ 
+   # don't install npm if the target path is a symlink, it probably means
+   # that a dev version of npm is installed there
+@@ -108,19 +108,19 @@ def package_files(options, action, name,
+     if action == uninstall:
+       action(options, [link_path], os.path.join('bin', bin_name))
+     elif action == install:
+-      try_symlink(options, os.path.join('..', libdir(options), 'node_modules', name, bin_target), link_path)
++      try_symlink(options, os.path.join('..', libdir(options), 'node_modules', name + '22', bin_target), link_path)
+     else:
+       assert 0  # unhandled action type
+ 
+ def npm_files(options, action):
+   package_files(options, action, 'npm', {
+-    'npm': 'bin/npm-cli.js',
+-    'npx': 'bin/npx-cli.js',
++    'npm22': 'bin/npm-cli.js',
++    'npx22': 'bin/npx-cli.js',
+   })
+ 
+ def corepack_files(options, action):
+   package_files(options, action, 'corepack', {
+-    'corepack': 'dist/corepack.js',
++    'corepack22': 'dist/corepack.js',
+ #   Not the default just yet:
+ #   'yarn': 'dist/yarn.js',
+ #   'yarnpkg': 'dist/yarn.js',
+@@ -149,7 +149,7 @@ def subdir_files(options, path, dest, ac
+     action(options, files_in_path, subdir + os.path.sep)
+ 
+ def files(options, action):
+-  node_bin = 'node'
++  node_bin = 'node22'
+   if options.is_win:
+     node_bin += '.exe'
+   action(options, [os.path.join(options.build_dir, node_bin)], os.path.join('bin', node_bin))
+@@ -190,7 +190,7 @@ def files(options, action):
+   if 'openbsd' in sys.platform:
+     action(options, ['doc/node.1'], 'man/man1/')
+   else:
+-    action(options, ['doc/node.1'], 'share/man/man1/')
++    action(options, ['doc/node.1'], 'share/man/man1/node22.1')
+ 
+   if 'true' == options.variables.get('node_install_npm'):
+     npm_files(options, action)
+@@ -333,28 +333,28 @@ def headers(options, action):
+     'src/node_buffer.h',
+     'src/node_object_wrap.h',
+     'src/node_version.h',
+-  ], 'include/node/')
++  ], 'include/node22/')
+ 
+   # Add the expfile that is created on AIX
+   if sys.platform.startswith('aix') or sys.platform == "os400":
+-    action(options, ['out/Release/node.exp'], 'include/node/')
++    action(options, ['out/Release/node.exp'], 'include/node22/')
+ 
+-  subdir_files(options, os.path.join(options.v8_dir, 'include'), 'include/node/', wanted_v8_headers)
++  subdir_files(options, os.path.join(options.v8_dir, 'include'), 'include/node22/', wanted_v8_headers)
+ 
+   if 'false' == options.variables.get('node_shared_libuv'):
+-    subdir_files(options, 'deps/uv/include', 'include/node/', action)
++    subdir_files(options, 'deps/uv/include', 'include/node22/', action)
+ 
+   if 'true' == options.variables.get('node_use_openssl') and \
+      'false' == options.variables.get('node_shared_openssl'):
+-    subdir_files(options, 'deps/openssl/openssl/include/openssl', 'include/node/openssl/', action)
+-    subdir_files(options, 'deps/openssl/config/archs', 'include/node/openssl/archs', action)
+-    subdir_files(options, 'deps/openssl/config', 'include/node/openssl', action)
++    subdir_files(options, 'deps/openssl/openssl/include/openssl', 'include/node22/openssl/', action)
++    subdir_files(options, 'deps/openssl/config/archs', 'include/node22/openssl/archs', action)
++    subdir_files(options, 'deps/openssl/config', 'include/node22/openssl', action)
+ 
+   if 'false' == options.variables.get('node_shared_zlib'):
+     action(options, [
+       'deps/zlib/zconf.h',
+       'deps/zlib/zlib.h',
+-    ], 'include/node/')
++    ], 'include/node22/')
+ 
+   if sys.platform == 'zos':
+     zoslibinc = os.environ.get('ZOSLIB_INCLUDES')
+Index: node-v22.10.0/doc/node.1
+===================================================================
+--- node-v22.10.0.orig/doc/node.1
++++ node-v22.10.0/doc/node.1
+@@ -28,24 +28,24 @@
+ .Dt NODE 1
+ .
+ .Sh NAME
+-.Nm node
++.Nm node22
+ .Nd server-side JavaScript runtime
+ .
+ .\"======================================================================
+ .Sh SYNOPSIS
+-.Nm node
++.Nm node22
+ .Op Ar options
+ .Op Ar v8-options
+ .Op Fl e Ar string | Ar script.js | Fl
+ .Op Fl -
+ .Op Ar arguments ...
+ .
+-.Nm node
++.Nm node22
+ .Cm inspect
+ .Op Fl e Ar string | Ar script.js | Fl | Ar <host>:<port>
+ .Ar ...
+ .
+-.Nm node
++.Nm node22
+ .Op Fl -v8-options
+ .
+ .\"======================================================================
+Index: node-v22.10.0/src/node_main.cc
+===================================================================
+--- node-v22.10.0.orig/src/node_main.cc
++++ node-v22.10.0/src/node_main.cc
+@@ -94,6 +94,7 @@ int wmain(int argc, wchar_t* wargv[]) {
+ // UNIX
+ 
+ int main(int argc, char* argv[]) {
++  setenv("NODE_VERSION", "22", 0);
+   return node::Start(argc, argv);
+ }
+ #endif
+Index: node-v22.10.0/tools/test.py
+===================================================================
+--- node-v22.10.0.orig/tools/test.py
++++ node-v22.10.0/tools/test.py
+@@ -972,7 +972,7 @@ class Context(object):
+     if self.vm is not None:
+       return self.vm
+     if arch == 'none':
+-      name = 'out/Debug/node' if mode == 'debug' else 'out/Release/node'
++      name = 'out/Debug/node' if mode == 'debug' else 'out/Release/node22'
+     else:
+       name = 'out/%s.%s/node' % (arch, mode)
+ 
+Index: node-v22.10.0/node.gyp
+===================================================================
+--- node-v22.10.0.orig/node.gyp
++++ node-v22.10.0/node.gyp
+@@ -27,8 +27,8 @@
+     'node_shared_openssl%': 'false',
+     'node_v8_options%': '',
+     'node_enable_v8_vtunejit%': 'false',
+-    'node_core_target_name%': 'node',
+-    'node_lib_target_name%': 'libnode',
++    'node_core_target_name%': 'node22',
++    'node_lib_target_name%': 'libnode22',
+     'node_intermediate_lib_type%': 'static_library',
+     'node_builtin_modules_path%': '',
+     'linked_module_files': [
+Index: node-v22.10.0/test/parallel/test-snapshot-warning.js
+===================================================================
+--- node-v22.10.0.orig/test/parallel/test-snapshot-warning.js
++++ node-v22.10.0/test/parallel/test-snapshot-warning.js
+@@ -60,7 +60,7 @@ tmpdir.refresh();
+     stderr(output) {
+       let match = output.match(/Warning: test warning/g);
+       assert.strictEqual(match.length, 1);
+-      match = output.match(/Use `node --trace-warnings/g);
++      match = output.match(/Use `node22 --trace-warnings/g);
+       assert.strictEqual(match.length, 1);
+       return true;
+     }
+@@ -79,7 +79,7 @@ tmpdir.refresh();
+       // Warnings should not be handled more than once.
+       let match = output.match(/Warning: test warning/g);
+       assert.strictEqual(match.length, 1);
+-      match = output.match(/Use `node --trace-warnings/g);
++      match = output.match(/Use `node22 --trace-warnings/g);
+       assert.strictEqual(match.length, 1);
+       return true;
+     }
+@@ -114,7 +114,7 @@ tmpdir.refresh();
+   console.log(warningFile1, ':', warnings1);
+   let match = warnings1.match(/Warning: test warning/g);
+   assert.strictEqual(match.length, 1);
+-  match = warnings1.match(/Use `node --trace-warnings/g);
++  match = warnings1.match(/Use `node22 --trace-warnings/g);
+   assert.strictEqual(match.length, 1);
+   fs.rmSync(warningFile1, {
+     maxRetries: 3, recursive: false, force: true
+@@ -140,6 +140,6 @@ tmpdir.refresh();
+   console.log(warningFile2, ':', warnings1);
+   match = warnings2.match(/Warning: test warning/g);
+   assert.strictEqual(match.length, 1);
+-  match = warnings2.match(/Use `node --trace-warnings/g);
++  match = warnings2.match(/Use `node22 --trace-warnings/g);
+   assert.strictEqual(match.length, 1);
+ }