commit b6ba0e7b1cbb015ec6948da96207ea7c766b2a97a46726e31c6319ce53343ccd Author: OBS User unknown Date: Fri Dec 20 12:58:55 2024 +0000 [info=9832a6e96a6f3a9a1ed3753f8ecf3ea5c9f69f85db85fbff92b68a08295f052d] OBS-URL: https://build.opensuse.org/package/show/devel:languages:nodejs/nodejs22?expand=0&rev=25 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?= +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?= +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..845590b --- /dev/null +++ b/SHASUMS256.txt @@ -0,0 +1,41 @@ +b4cb7707b22218154cdcf8cbc9bbb5c941dab09961a544cc7aba6ab50da99926 node-v22.12.0-aix-ppc64.tar.gz +587e4f0fc2c27106e4e758a29db5726b337e660483dd554ea1610a4246fbf71b node-v22.12.0-arm64.msi +293dcc6c2408da21562d135b0412525e381bb6fe150d688edb58fe850d0f3e13 node-v22.12.0-darwin-arm64.tar.gz +0047be0cfda922eb73876f9ef41de361c36b7654c884d13d9b783b0efd1db9aa node-v22.12.0-darwin-arm64.tar.xz +52bc25dd026db7247c3c00439afdb83e95087248267f02d6c1a7250d1f896173 node-v22.12.0-darwin-x64.tar.gz +d68ef0c4c19b3b3b88c0e7408668d0a539607c136a14668e079feed0c6ec8bec node-v22.12.0-darwin-x64.tar.xz +c0760383af3c23637f46959a53113490fefb84cb388ac71a08d28761527e7b1b node-v22.12.0-headers.tar.gz +3cde28bb5820cf0f7593c7817c7a9ab1f15016dd85a6e5c240bbdf2a9c59130d node-v22.12.0-headers.tar.xz +9e7905fdee722f9650a03ae644b51c4c6effd3b98ac93c588700072ab35c9ddb node-v22.12.0-linux-arm64.tar.gz +8cfd5a8b9afae5a2e0bd86b0148ca31d2589c0ea669c2d0b11c132e35d90ed68 node-v22.12.0-linux-arm64.tar.xz +f6f3dc6493befa7844e2f65024f857dc8fbbc0d86089b09f6e73d5eb7e2ce9ad node-v22.12.0-linux-armv7l.tar.gz +afedb2695faacb22805adde9534f2a360f2b39cab622ebdfe5e7383a2b58ebb9 node-v22.12.0-linux-armv7l.tar.xz +a01148778eb1e9c56413e6a69cfe8d4563524c914dc3f9c667948a0d7a1a151a node-v22.12.0-linux-ppc64le.tar.gz +199a606ba1ee86cce6d6b369c71f9d00873d2836a6662592afc3b6a5923e2004 node-v22.12.0-linux-ppc64le.tar.xz +63dd2e20cb50e2145c06f8f55b5682753691965b20fa08797a969a15b751ac8e node-v22.12.0-linux-s390x.tar.gz +9b517f8006eb4b451d40c461cbe64f93c6455566dbe2613387ab02412bc06d35 node-v22.12.0-linux-s390x.tar.xz +e05a4d65232ae2b27b3d77da2e368522fb46b923335b8e0d5f77624c32484044 node-v22.12.0-linux-x64.tar.gz +22982235e1b71fa8850f82edd09cdae7e3f32df1764a9ec298c72d25ef2c164f node-v22.12.0-linux-x64.tar.xz +94068d6877faa376f0b00aa775b490d59ea9accc8dbc5616efaff400f670fee1 node-v22.12.0.pkg +3157e7c002b6e964bdbefb331ec38db1e2dceb064ab11c038275155461b22ce3 node-v22.12.0.tar.gz +fe1bc4be004dc12721ea2cb671b08a21de01c6976960ef8a1248798589679e16 node-v22.12.0.tar.xz +9c8e8fc0e409dc0cf32f159f9ccf11e95f1be5bb26e1a9b34f40bb9a6da3f0e2 node-v22.12.0-win-arm64.7z +17401720af48976e3f67c41e8968a135fb49ca1f88103a92e0e8c70605763854 node-v22.12.0-win-arm64.zip +922285593360adbe1fcd16d4e0049a13552dcad085fa53768c21c8d17089a134 node-v22.12.0-win-x64.7z +2b8f2256382f97ad51e29ff71f702961af466c4616393f767455501e6aece9b8 node-v22.12.0-win-x64.zip +6fa5480413f3bacc170f94e7aa332e5e8d8c3f9a03f05f802c6cbf6b1a265eef node-v22.12.0-win-x86.7z +b52129972529f22f1c8a726655842ca1fc13e0b4c37cd4d397270ba772032d43 node-v22.12.0-win-x86.zip +5fa43604523be95f8e73c4c98337a5c2bf02450a6525ad25ec2926e464e6bcef node-v22.12.0-x64.msi +97fd52500c6947d5886c616ce37c93d40f5b0b811a1f87f89783c25e0de345e3 node-v22.12.0-x86.msi +cfd2e0d9a708cf37acfecfd11ff237bb141893dc057080b4edb23af6a45d3f55 win-arm64/node.exe +423502a56ef7f7dd087df41b518f53104ce321ef2ab3031fe4ca22b965382d86 win-arm64/node.lib +739c03416daf8d2f2efc0bf48a8c2e53e0c14438b8a5889cc2995c5012ae7824 win-arm64/node_pdb.7z +70f9745e3380cf452d3a8fd156d5ed7ead92a30fdead78ea703afe5331f77e35 win-arm64/node_pdb.zip +b3b117a08ee61efee09e6fd523ab33c0c018da1b570bde08e4fd914dc1170ed6 win-x64/node.exe +7980a34112c38a9b269226bcd3a9148bf101411d794750f18dc15c5026b92b30 win-x64/node.lib +e9fc26cea58f8e1520a5a930c7fc40ac99f22c8470f5617d3e3f09dcd1feb7ef win-x64/node_pdb.7z +6a9417c99259f5d15a3c11dbe7a011a1484532b33bb84e5e8f8e3c733af74064 win-x64/node_pdb.zip +ab2390e667e9abfa16b97a27adf84cd9f08a4788816db54f56bc25893f76e9d1 win-x86/node.exe +289e832c5ff6ebb6be1644bf06d7078638447947cc6e314122e7f17b30ba268a win-x86/node.lib +525560e7fe53036a1caaf63ec3d4e508ea59079111c0f18b4de2bbf1069537ff win-x86/node_pdb.7z +82150928ab3f6bc3f50b4cc540b987b3c41ea7f3f93f790e4acf58553572faea win-x86/node_pdb.zip diff --git a/SHASUMS256.txt.sig b/SHASUMS256.txt.sig new file mode 100644 index 0000000..dc4b074 Binary files /dev/null and b/SHASUMS256.txt.sig differ diff --git a/_constraints b/_constraints new file mode 100644 index 0000000..3891a8f --- /dev/null +++ b/_constraints @@ -0,0 +1,32 @@ + + + + + 8 + + + 10000 + + + + + aarch64 + + + + asimdrdm + + + + + + armv6l + armv7l + + + + 5 + + + + diff --git a/_scmsync.obsinfo b/_scmsync.obsinfo new file mode 100644 index 0000000..1c2c759 --- /dev/null +++ b/_scmsync.obsinfo @@ -0,0 +1,3 @@ +mtime: 1734699515 +commit: 9832a6e96a6f3a9a1ed3753f8ecf3ea5c9f69f85db85fbff92b68a08295f052d +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 + #endif // __POSIX__ + +-# include ++#include + + 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 +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 + + #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..22ceffe --- /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.12.0/node.gyp +=================================================================== +--- node-v22.12.0.orig/node.gyp ++++ node-v22.12.0/node.gyp +@@ -1186,6 +1186,7 @@ + 'deps/simdutf/simdutf.gyp:simdutf', + 'deps/ada/ada.gyp:ada', + 'deps/nbytes/nbytes.gyp:nbytes', ++ 'fuzz_env' + ], + + 'includes': [ +@@ -1264,6 +1265,7 @@ + 'deps/histogram/histogram.gyp:histogram', + 'deps/ada/ada.gyp:ada', + '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 +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 header file. */ +-/* #undef HAVE_NETINET_IN_H */ ++#define HAVE_NETINET_IN_H 1 + + /* Define to 1 if you have the 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' ++ # 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.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 0000000..2d1e055 Binary files /dev/null and b/nodejs.keyring differ diff --git a/nodejs22.changes b/nodejs22.changes new file mode 100644 index 0000000..235707a --- /dev/null +++ b/nodejs22.changes @@ -0,0 +1,193 @@ +------------------------------------------------------------------- +Fri Dec 20 12:56:09 UTC 2024 - Adam Majer + +- fix_ci_tests.patch: skip wpt/test-webcrypto on s390x as it has + unexpected differences between z13 and z15 + +------------------------------------------------------------------- +Thu Dec 5 13:53:22 UTC 2024 - Adam Majer + +- add python3-setuptools requirements (needed for python 3.13+) + +------------------------------------------------------------------- +Wed Dec 4 16:59:08 UTC 2024 - Adam Majer + +- 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 + +- BuildRequire python311 for SLE15 + +------------------------------------------------------------------- +Mon Nov 18 12:02:26 UTC 2024 - Adam Majer + +- 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 + +- 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 + +- 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 + +- 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 + +- fix_ci_tests.patch: add fix for issue #53085 + +------------------------------------------------------------------- +Tue May 14 14:25:41 UTC 2024 - Adam Majer + +- 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..98f1430 --- /dev/null +++ b/nodejs22.spec @@ -0,0 +1,1170 @@ +# +# 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.12.0 +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 + + +Patch82: CVE-2024-21538.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.3 +%endif + +%if %node_version_number >= 22 +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.1 +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.3.0 + +Provides: bundled(simdutf) = 5.6.1 +Provides: bundled(simdjson) = 3.10.0 +# 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.29.4 +Provides: bundled(node-minimatch) = 10.0.1 +Provides: bundled(node-undici) = 6.21.0 + +%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.0 +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.0.1 +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) = 18.0.4 +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.0.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.3 +Provides: bundled(node-cssesc) = 3.0.0 +Provides: bundled(node-debug) = 4.3.6 +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.0 +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.1 +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-is-lambda) = 1.0.1 +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.0 +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) = 13.0.1 +Provides: bundled(node-make-fetch-happen) = 14.0.1 +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) = 3.0.5 +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.2 +Provides: bundled(node-ms) = 2.1.3 +Provides: bundled(node-mute-stream) = 2.0.0 +Provides: bundled(node-negotiator) = 0.6.3 +Provides: bundled(node-node-gyp) = 10.2.0 +Provides: bundled(node-nopt) = 7.2.1 +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.0 +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.1 +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.0 +Provides: bundled(node-pacote) = 19.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) = 4.2.0 +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.1 +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) = 2.3.1 +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.18 +Provides: bundled(node-sprintf-js) = 1.1.3 +Provides: bundled(node-ssri) = 10.0.6 +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) = 2.2.1 +Provides: bundled(node-unique-filename) = 3.0.0 +Provides: bundled(node-unique-filename) = 4.0.0 +Provides: bundled(node-unique-slug) = 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) = 4.0.0 +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 82 -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 <= 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 + --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 < %{buildroot}%{_datadir}/libalternatives/npm/%{node_version_number}.conf < %{buildroot}%{_datadir}/libalternatives/npx/%{node_version_number}.conf <= 14 +mkdir -p %{buildroot}%{_datadir}/libalternatives/corepack; +cat > %{buildroot}%{_datadir}/libalternatives/corepack/%{node_version_number}.conf <= 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 + +%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 +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 + Reviewed-By: Matteo Collina + + +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* 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* 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* 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* 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* 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* 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* 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* 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* 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* 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* 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* 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* 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(answer_len); ++ memcpy(buf_copy, answer_buf, answer_len); + } + + wrap->response_data_ = std::make_unique(); 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=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 + void VisitAtomicExchange(InstructionSelectorT* selector, + typename Adapter::node_t node, ArchOpcode opcode, + MachineRepresentation rep) { +- using node_t = Adapter::node_t; ++ using node_t = typename Adapter::node_t; + IA32OperandGeneratorT g(selector); + node_t base = selector->input_at(node, 0); + node_t index = selector->input_at(node, 1); +@@ -1732,7 +1732,7 @@ template + void VisitWord32PairShift(InstructionSelectorT* selector, + InstructionCode opcode, + typename Adapter::node_t node) { +- using node_t = Adapter::node_t; ++ using node_t = typename Adapter::node_t; + IA32OperandGeneratorT g(selector); + + node_t shift = selector->input_at(node, 2); +@@ -2507,7 +2507,7 @@ template + void VisitAtomicBinOp(InstructionSelectorT* 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 g(selector); + node_t base = selector->input_at(node, 0); +@@ -2528,7 +2528,7 @@ void VisitAtomicBinOp(InstructionSelecto + template + void VisitPairAtomicBinOp(InstructionSelectorT* selector, + typename Adapter::node_t node, ArchOpcode opcode) { +- using node_t = Adapter::node_t; ++ using node_t = typename Adapter::node_t; + IA32OperandGeneratorT 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 +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 : + .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); + }