From b3457b04358ffa20787ab4fea44e00f23a1476ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Wed, 7 Jun 2023 09:12:45 +0200 Subject: [PATCH] Sync from SUSE:ALP:Source:Standard:1.0 nodejs18 revision 4da017ae2ec3ff2f14abf19673a44563 --- .gitattributes | 23 + SHASUMS256.txt | 34 + SHASUMS256.txt.sig | Bin 0 -> 566 bytes _constraints | 32 + bash_output_helper.bash | 16 + cares_public_headers.patch | 13 + fix_ci_tests.patch | 103 +++ flaky_test_rerun.patch | 21 + legacy_python.patch | 26 + linker_lto_jobs.patch | 25 + manual_configure.patch | 20 + node-gyp-addon-gypi.patch | 79 ++ node-gyp_7.1.2.tar.xz | 3 + node-v18.16.0.tar.xz | 3 + node_modules.tar.xz | 3 + nodejs-libpath.patch | 54 ++ nodejs.keyring | Bin 0 -> 55415 bytes nodejs18.changes | 299 +++++++ nodejs18.spec | 1118 +++++++++++++++++++++++++ npm_search_paths.patch | 32 + openssl_binary_detection.patch | 42 + qemu_timeouts_arches.patch | 14 + rsa-pss-revert.patch | 443 ++++++++++ skip_no_console.patch | 29 + sle12_python3_compat.patch | 35 + test-skip-y2038-on-32bit-time_t.patch | 45 + update_npm_tarball.sh | 13 + versioned.patch | 348 ++++++++ 28 files changed, 2873 insertions(+) create mode 100644 .gitattributes create mode 100644 SHASUMS256.txt create mode 100644 SHASUMS256.txt.sig create mode 100644 _constraints create mode 100644 bash_output_helper.bash create mode 100644 cares_public_headers.patch create mode 100644 fix_ci_tests.patch create mode 100644 flaky_test_rerun.patch create mode 100644 legacy_python.patch create mode 100644 linker_lto_jobs.patch create mode 100644 manual_configure.patch create mode 100644 node-gyp-addon-gypi.patch create mode 100644 node-gyp_7.1.2.tar.xz create mode 100644 node-v18.16.0.tar.xz create mode 100644 node_modules.tar.xz create mode 100644 nodejs-libpath.patch create mode 100644 nodejs.keyring create mode 100644 nodejs18.changes create mode 100644 nodejs18.spec create mode 100644 npm_search_paths.patch create mode 100644 openssl_binary_detection.patch create mode 100644 qemu_timeouts_arches.patch create mode 100644 rsa-pss-revert.patch create mode 100644 skip_no_console.patch create mode 100644 sle12_python3_compat.patch create mode 100644 test-skip-y2038-on-32bit-time_t.patch create mode 100644 update_npm_tarball.sh create mode 100644 versioned.patch diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..fecc750 --- /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/SHASUMS256.txt b/SHASUMS256.txt new file mode 100644 index 0000000..00e5174 --- /dev/null +++ b/SHASUMS256.txt @@ -0,0 +1,34 @@ +a65bd3fe91ffeb31d12a208e811943e3ebba4706553a4845a03d857beaeec51e node-v18.16.0-aix-ppc64.tar.gz +82c7bb4869419ce7338669e6739a786dfc7e72f276ffbed663f85ffc905dcdb4 node-v18.16.0-darwin-arm64.tar.gz +b23cdf4fa0e9f77273720ab18eabdd7691edbb69e08ec3b65afd69bef23fe209 node-v18.16.0-darwin-arm64.tar.xz +cd520da6e2e89fab881c66a3e9aff02cb0d61d68104b1d6a571dd71bef920870 node-v18.16.0-darwin-x64.tar.gz +2c8aa0333111c2411564bfb85be44186aeb581392f73c4be5912cbb125d99043 node-v18.16.0-darwin-x64.tar.xz +effeb73616e5297922ed89a1b94d2664390040a83184504c1cc1305b0c0c853f node-v18.16.0-headers.tar.gz +0eb9823c2cc72792c2d4413f57b5a36232e173d7edefb1909c37e364a823f9c7 node-v18.16.0-headers.tar.xz +dc3dfaee899ed21682e47eaf15525f85aff29013c392490e9b25219cd95b1c35 node-v18.16.0-linux-arm64.tar.gz +c81dfa0bada232cb4583c44d171ea207934f7356f85f9184b32d0dde69e2e0ea node-v18.16.0-linux-arm64.tar.xz +a3968db44e5ae17243d126ff79b1756016b198f7cc94c6fad8522aac481b4ff3 node-v18.16.0-linux-armv7l.tar.gz +57ba6b71eb039fa896c329e68669b21f6717622c560c6f61a0c97d18ca866b2d node-v18.16.0-linux-armv7l.tar.xz +b4e66dcda5ba4a3697be3fded122dabb6a677deee3d7f4d3c7c13ebb5a13844c node-v18.16.0-linux-ppc64le.tar.gz +c43142fb9ef30658620ed095f8203beca92f469c1121eeb724df9a48bf0e59a5 node-v18.16.0-linux-ppc64le.tar.xz +a8b607c3c06f585c4fe9ba45be6dc76ce9459238c91b3f43533aa30344caed87 node-v18.16.0-linux-s390x.tar.gz +39b15c16347000b0be97133437bde0317dd2307d3fdfce15ddd8680b07a963ef node-v18.16.0-linux-s390x.tar.xz +fc83046a93d2189d919005a348db3b2372b598a145d84eb9781a3a4b0f032e95 node-v18.16.0-linux-x64.tar.gz +44d93d9b4627fe5ae343012d855491d62c7381b236c347f7666a7ad070f26548 node-v18.16.0-linux-x64.tar.xz +156aa5b9580288fb0b3c6134eb8fac64e50745d78d33eebe9e29eb7ff87b8e1e node-v18.16.0.pkg +6a4f5c5d76e5c50cef673099e56f19bc3266ae363f56ca0ab77dd2f3c5088c6d node-v18.16.0.tar.gz +33d81a233e235a509adda4a4f2209008d04591979de6b3f0f67c1c906093f118 node-v18.16.0.tar.xz +007848640ba414f32d968d303e75d9841ecd2cd95d6fdd81f80bc3dcbd74ae44 node-v18.16.0-win-x64.7z +4b3bd4cb5570cc217490639e93a7e1b7a7a341981366661e514ce61941824a85 node-v18.16.0-win-x64.zip +681be28e0acd057b4798f357d21eec5f49e21bc803bbbefeb1072bb4f166025a node-v18.16.0-win-x86.7z +2a7e0fb22e1a36144ee8183c80ef2705cd9754c1d894f94bb6c94a681de47924 node-v18.16.0-win-x86.zip +5bfb6f3ab89e198539408f7e0e8ec0b0bd5efe8898573ec05b381228efb45a5d node-v18.16.0-x64.msi +09534d1949c795c3e49d257fb72a9fd865ee28955673b87d569d4aec541333e7 node-v18.16.0-x86.msi +b548a55c2b5ef5de34f4636610bab27077fb9313d34f52280b9ec11dd25e9dd1 win-x64/node.exe +72b7fab9381af8f4958c8212f3d4cdfff8c7c5b1e33eaad0e7d5888293568cd5 win-x64/node.lib +3b9474e18a1bbb38b05b1876b4b37056063c2af82212d356a8a5cf91c1a3acf3 win-x64/node_pdb.7z +6b506b1fe654ca7161373916c7ba7e38f62545236698342fa97fd2faf39ebc4e win-x64/node_pdb.zip +36bf0f0a364ca8edc176776764831f9e88bef6d1e8056f6edc474a37b652a794 win-x86/node.exe +6a85c15a69238f0902b9a734d262bf36d211b273a46d5e3249857d4bb7f6d9b7 win-x86/node.lib +9256bdefae4491acfd523ca06d4f4344ddc4f1a28aac868b5efb6a72d8023e2a win-x86/node_pdb.7z +53c6b29afd58904e5143d9f3298b55695b8ecb2b6c08a9612ed30e9b0ed9589a win-x86/node_pdb.zip diff --git a/SHASUMS256.txt.sig b/SHASUMS256.txt.sig new file mode 100644 index 0000000000000000000000000000000000000000..ee2c2e76a08db86255672b2c7e72b1b4706367d4 GIT binary patch literal 566 zcmV-60?GY}0y6{v0SEvc79j+5@g@Sc@x_2 z!!+pzU=O`^*3_>Q^tpPySh#ioNvT|w{{_`igXm+fx@QM2dy{oxtXCM9bkApmhW00U z#^^vmAa<_=2@O4plJjguN^)(ZyrlV zcw0fmJlZGD8$SpAMl+LkKuRp{fc*&u(k=$b2f|ke!fao0_Bw+BSC!keFx7ycu9eWO za@T~RW>OI~?HF2 + + + + 8 + + + 10000 + + + + + aarch64 + + + + asimdrdm + + + + + + armv6l + armv7l + + + + 5 + + + + diff --git a/bash_output_helper.bash b/bash_output_helper.bash new file mode 100644 index 0000000..d5a74bd --- /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..bd004ca --- /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..c04e52f --- /dev/null +++ b/fix_ci_tests.patch @@ -0,0 +1,103 @@ +Author: Adam Majer +Date: Dec 20 09:18:49 UTC 2017 +Summary: Fix CI unit tests framework for OBS building + +Index: node-v18.9.0/test/parallel/test-module-loading-globalpaths.js +=================================================================== +--- node-v18.9.0.orig/test/parallel/test-module-loading-globalpaths.js ++++ node-v18.9.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-v18.9.0/test/parallel/test-tls-passphrase.js +=================================================================== +--- node-v18.9.0.orig/test/parallel/test-tls-passphrase.js ++++ node-v18.9.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-v18.9.0/test/parallel/test-repl-envvars.js +=================================================================== +--- node-v18.9.0.orig/test/parallel/test-repl-envvars.js ++++ node-v18.9.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 REPL = require('internal/repl'); + const assert = require('assert'); +Index: node-v18.9.0/test/common/index.mjs +=================================================================== +--- node-v18.9.0.orig/test/common/index.mjs ++++ node-v18.9.0/test/common/index.mjs +@@ -45,6 +45,7 @@ const { + expectsError, + skipIfInspectorDisabled, + skipIf32Bits, ++ skipIfWorker, + getArrayBufferViews, + getBufferSources, + getTTYfd, +@@ -94,6 +95,7 @@ export { + expectsError, + skipIfInspectorDisabled, + skipIf32Bits, ++ skipIfWorker, + getArrayBufferViews, + getBufferSources, + getTTYfd, +Index: node-v18.9.0/Makefile +=================================================================== +--- node-v18.9.0.orig/Makefile ++++ node-v18.9.0/Makefile +@@ -524,7 +524,8 @@ test-ci-js: | clear-stalled + .PHONY: test-ci + # Related CI jobs: most CI tests, excluding node-test-commit-arm-fanned + test-ci: LOGLEVEL := info +-test-ci: | clear-stalled bench-addons-build build-addons build-js-native-api-tests build-node-api-tests doc-only ++test-ci: | clear-stalled bench-addons-build build-addons build-js-native-api-tests build-node-api-tests ++ 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) \ +@@ -717,7 +718,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-v18.9.0/test/parallel/test-crypto-dh.js +=================================================================== +--- node-v18.9.0.orig/test/parallel/test-crypto-dh.js ++++ node-v18.9.0/test/parallel/test-crypto-dh.js +@@ -167,7 +167,7 @@ assert.throws(() => { + dh3.computeSecret(''); + }, { message: common.hasOpenSSL3 ? + 'error:02800080:Diffie-Hellman routines::invalid secret' : +- 'Supplied key is too small' }); ++ /Supplied key is too small|error:05066066:Diffie-Hellman routines:compute_key:invalid public key/ }); + + // Invalid test: curve argument is undefined + assert.throws( diff --git a/flaky_test_rerun.patch b/flaky_test_rerun.patch new file mode 100644 index 0000000..b1bccad --- /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/legacy_python.patch b/legacy_python.patch new file mode 100644 index 0000000..00fef03 --- /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..74f73ef --- /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-v18.16.0/node.gyp +=================================================================== +--- node-v18.16.0.orig/node.gyp ++++ node-v18.16.0/node.gyp +@@ -1220,6 +1220,7 @@ + 'node_dtrace_provider', + 'deps/simdutf/simdutf.gyp:simdutf', + 'deps/ada/ada.gyp:ada', ++ 'fuzz_env' + ], + + 'includes': [ +@@ -1389,6 +1390,7 @@ + 'deps/histogram/histogram.gyp:histogram', + 'deps/uvwasi/uvwasi.gyp:uvwasi', + 'deps/ada/ada.gyp:ada', ++ 'cctest' + ], + + 'includes': [ diff --git a/manual_configure.patch b/manual_configure.patch new file mode 100644 index 0000000..7a40b92 --- /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..301420c --- /dev/null +++ b/node-gyp-addon-gypi.patch @@ -0,0 +1,79 @@ +Index: node-git.b4f0a18b5a/addon-rpm.gypi +=================================================================== +--- /dev/null ++++ node-git.b4f0a18b5a/addon-rpm.gypi +@@ -0,0 +1,35 @@ ++{ ++ 'target_defaults': { ++ 'type': 'loadable_module', ++ 'product_prefix': '', ++ 'include_dirs': [ ++ '/usr/include/node18/', ++ '/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-git.b4f0a18b5a/deps/npm/node_modules/node-gyp/lib/configure.js +=================================================================== +--- node-git.b4f0a18b5a.orig/deps/npm/node_modules/node-gyp/lib/configure.js ++++ node-git.b4f0a18b5a/deps/npm/node_modules/node-gyp/lib/configure.js +@@ -46,10 +46,6 @@ function configure (gyp, argv, callback) + 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 +@@ -68,6 +64,12 @@ function configure (gyp, argv, callback) + nodeDir = path.resolve(gyp.devDir, release.versionDir) + createBuildDir() + }) ++ } 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/node18' ++ createBuildDir() ++ } + } + } + +@@ -282,7 +284,9 @@ function configure (gyp, argv, callback) + + // this logic ported from the old `gyp_addon` python file + var gypScript = path.resolve(__dirname, '..', 'gyp', 'gyp_main.py') +- var addonGypi = path.resolve(__dirname, '..', 'addon.gypi') ++ var addon_gypi_file = gyp.opts.target || gyp.opts.nodedir ? 'addon.gypi' : 'addon-rpm.gypi' ++ ++ var addonGypi = path.resolve(__dirname, '..', addon_gypi_file) + var commonGypi = path.resolve(nodeDir, 'include/node/common.gypi') + fs.stat(commonGypi, function (err) { + if (err) { diff --git a/node-gyp_7.1.2.tar.xz b/node-gyp_7.1.2.tar.xz new file mode 100644 index 0000000..12dc4bc --- /dev/null +++ b/node-gyp_7.1.2.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:172cd1f46b5b20cb4f443a83b24995ad35477c3ccdffe228b8e96ca4199d6103 +size 1245896 diff --git a/node-v18.16.0.tar.xz b/node-v18.16.0.tar.xz new file mode 100644 index 0000000..9421075 --- /dev/null +++ b/node-v18.16.0.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:33d81a233e235a509adda4a4f2209008d04591979de6b3f0f67c1c906093f118 +size 40467860 diff --git a/node_modules.tar.xz b/node_modules.tar.xz new file mode 100644 index 0000000..782bc34 --- /dev/null +++ b/node_modules.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6082cd5e67683f11f49ae144922d0dee412054ec2e9e2c1d715864986e44ee52 +size 1059176 diff --git a/nodejs-libpath.patch b/nodejs-libpath.patch new file mode 100644 index 0000000..2152360 --- /dev/null +++ b/nodejs-libpath.patch @@ -0,0 +1,54 @@ +Index: node-v18.9.0/tools/install.py +=================================================================== +--- node-v18.9.0.orig/tools/install.py ++++ node-v18.9.0/tools/install.py +@@ -7,6 +7,7 @@ import errno + import os + import shutil + import sys ++from distutils import sysconfig + import re + + # set at init time +@@ -66,6 +67,10 @@ def try_copy(path, dst): + try_unlink(target_path) # prevent ETXTBSY errors + return shutil.copy2(source_path, target_path) + ++def libdir(): ++ libdir_fq = sysconfig.get_config_var("LIBDIR") ++ return re.sub("^" + re.escape(node_prefix + "/"), "", libdir_fq) ++ + def try_remove(path, dst): + source_path, target_path = mkpaths(path, dst) + print('removing %s' % target_path) +@@ -81,7 +86,7 @@ def uninstall(paths, dst): + try_remove(path, dst) + + def package_files(action, name, bins): +- target_path = 'lib/node_modules/' + name + '/' ++ target_path = libdir() + '/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 +@@ -101,7 +106,7 @@ def package_files(action, name, bins): + if action == uninstall: + action([link_path], 'bin/' + bin_name) + elif action == install: +- try_symlink('../lib/node_modules/' + name + '/' + bin_target, link_path) ++ try_symlink('../' + libdir() + '/node_modules/' + name + '/' + bin_target, link_path) + else: + assert 0 # unhandled action type + +Index: node-v18.9.0/lib/internal/modules/cjs/loader.js +=================================================================== +--- node-v18.9.0.orig/lib/internal/modules/cjs/loader.js ++++ node-v18.9.0/lib/internal/modules/cjs/loader.js +@@ -1254,7 +1254,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 0000000000000000000000000000000000000000..a9b1ea5d388dde6a0fedf84403bafe6402ad748d GIT binary patch literal 55415 zcma&NbCl%mmMmPhZQEV8ZQHhO+qP}nwrzCTMt4qMocO8`tAZ|FBZ0lHPI&S80n;AL8s1qCtpjJo^pqsuO))Agh_kw)0_&N?w@777#p;O0C|mqA zAe*lnTK7rF2i8CdB!Gq%eF9^C*7(dqxHvGT{e+4&T`hj?bV<6pJV*525G>u|3iyq0 zzZD5?Z{TCY{1BTdRiodFtHYbR*5SH5{Da3Z#B+bK9);*BV?KpkN9oyR?Nl9i3H_O2}KLbOr_r9-B!GHQ!kN z*i=_DHjg@8m6A7O;NV0%pS4T52yQISsab%?B0V4!!)gHWj!7FykkrC+J~nCP{RoQMQ~5)%`@NU`7_Yle0s1?358qt-Vc_c=$jp zEcpv5Z9VbI7hP>VTD&6pjD8OC!-w*%n-;*YddFGEI($m2@2w|{8-chxvYWO%L$7L- zx|~G8Ju0@&o{>;lt{ z*~Ee)xih{b9xcke2%cv2f2%n=<3CkrW=3b{_+JXIDE|Mo@CpVX0OE`FdL&&oIKdT$ zp7oerlUI7}(ityYD@Hr%3a=Z_aM>7EH~B`_Cx(^~q#Xu_#-+Qer88`UL* zOT}|bHUu=PG2;g(0k?i@yGl@jMxaSz9p|te`^`u1Rz19he&Y&oE`82;zX=i)`S2tX~;|43X9|^R}o-&DWFc`okDEr{5 zyYEikG1JDZS+O3xEWi?(Q&B#Fz_3LMu#SCAmA^3D&->shits)qV;E>ruh+hxp0GH_ z7pv;qdesZfOMj69#%XHB?jQ5m=%4)f7Q>#a{XRsGO$76C14Or8Jew~`Fq6`MyB!`* z*{&~D2y0C94suvQM4q)HY2Rk6k8dW6Z13Bv3$kWuQ27z)S$EhE1`mJll%4^gmh#gz z;M`5tsNPF!BWcg%Ti3*zqob2X2V(8RnZ9 zKf8)en;p(df%R^hc>qdLNs{q%UJ;}TczlAvD<mh5=o{nMdpUDESDQv6o+Er#vr zk1BH{^cAw*5#)3fhoaN^e|P*#4J;(v?tOpT(s)2W7p?098hS=`5kvPGLHL+9 zze`0!qu87Cu9YqILy8lty81k?Q_V^D3mYPaUX7C>8f!W>(e24m25kJ& zfj>|X+OFTH3XijKlGepGP(y-Em1-?c&1bl!7%ooisw8*LUBITM9j?`Cea?2mf2Ryy z6g&P28sO+0cqaNu*`CVfe&X>9|MqV+5CMn}g7Js>A^*wzF#k^QYWENTEtV{&6!+Hs zA*`Z6!m=kUSfJp{eH2Qr=O+OL1%q++O!M@UQ>OfcG7sqqSU49*i>KfOa|4P9((n0W z)u8%m67hUxkAnU�z>p88ZS{C%;RGsz_2S1zcy)eeOC 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 N+wAft7<9u56ae7J$}s={ literal 0 HcmV?d00001 diff --git a/nodejs18.changes b/nodejs18.changes new file mode 100644 index 0000000..f6b5b98 --- /dev/null +++ b/nodejs18.changes @@ -0,0 +1,299 @@ +------------------------------------------------------------------- +Thu Apr 13 13:49:59 UTC 2023 - Adam Majer + +- Update to NodeJS 18.16.0 LTS version + * Add initial support for single executable applications + * Replace url parser with Ada + * buffer: add Buffer.copyBytesFrom + +- refreshed patches: versioned.patch linker_lto_jobs.patch + +------------------------------------------------------------------- +Mon Mar 13 16:43:33 UTC 2023 - Adam Majer + +- relax Requires to Suggests for alts on TW + +------------------------------------------------------------------- +Wed Mar 8 13:01:06 UTC 2023 - Adam Majer - 18.15.0 + +- Update to NodeJS 18.15.0 LTS version: + * test_runner: + + add initial code coverate support + + add reporters + * fs: add statfs() + * buffer: add isAscii() + +- s390.patch, sysctl.patch: upstreamed and removed + +------------------------------------------------------------------- +Thu Feb 23 10:41:38 UTC 2023 - Adam Majer + +- node-gyp_7.1.2.tar.xz: added dependencies so they don't conflict with + npm dependencies. + +------------------------------------------------------------------- +Wed Feb 22 13:59:45 UTC 2023 - Adam Majer + +- Update to NodeJS 18.14.2 LTS: + * deps: upgrade npm to 9.5.0 (bsc#1208744, CVE-2022-25881) + * deps: update undici to 5.20.0 + +- Changes in version 18.14.1: + * fixes permissions policies can be bypassed via process.mainModule + (bsc#1208481, CVE-2023-23918) + * fixes insecure loading of ICU data through ICU_DATA environment + variable (bsc#1208487, CVE-2023-23920) + * fixes OpenSSL error handling issues in nodejs crypto library + (bsc#1208483, CVE-2023-23919) + * updates undici to v5.19.1 + + Fetch API in Node.js did not protect against CRLF injection in host headers + + Regular Expression Denial of Service in Headers in Node.js fetch API + (bsc#1208413, bsc#1208485, CVE-2023-24807, CVE-2023-23936) + +- versioned.patch: refreshed +- sysctl.patch: unit test fixes + +------------------------------------------------------------------- +Fri Feb 3 11:43:02 UTC 2023 - Adam Majer + +- Update to NodeJS 18.14.0 LTS: + * deps: + + update npm to 9.2.0 + * http: + + join authorization headers + + improved timeout defaults handling + * stream: + + implement finished() for ReadableStream and WritableStream + +- refreshed patches: linker_lto_jobs.patch, npm_search_paths.patch, + versioned.patch + +------------------------------------------------------------------- +Wed Feb 1 07:58:26 UTC 2023 - Dominique Leuenberger + +- Do not use pkg_vcmp to decide BuildDependencies: this works based + on 'installed packages' which is not interpreted correctly by the + scheduler. Rather switch to boolean dependencies. + +------------------------------------------------------------------ +Wed Jan 25 12:01:18 UTC 2023 - Adam Majer + +- Again use openssl-3, if available. +- _constraints: reset aarch64 memory requirements back to original + otherwise some unit tests can fail +- s390.patch: fix unit test on s390 with patched zlib + +------------------------------------------------------------------- +Mon Jan 16 14:57:58 UTC 2023 - Adam Majer + +- Update to NodejJS 18.13.0 LTS: + * build: disable v8 snapshot compression by default + * crypto: update root certificates + * deps: update ICU to 72.1 + * doc: + + add doc-only deprecation for headers/trailers setters + + add Rafael to the tsc + + deprecate use of invalid ports in url.parse + + deprecate url.parse() + * lib: drop fetch experimental warning + * net: add autoSelectFamily and autoSelectFamilyAttemptTimeout options + * src: + + add uvwasi version + + add initial shadow realm support + * test_runner: + + add t.after() hook + + don't use a symbol for runHook() + * tls: + + add "ca" property to certificate object + * util: + + add fast path for utf8 encoding + + improve textdecoder decode performance + + add MIME utilities + +- new_python3.patch, icu721_fixes.patch: upstreamed, removed + +------------------------------------------------------------------- +Fri Dec 23 11:31:12 UTC 2022 - Guillaume GARDET + +- Update _constraints: + * Less RAM for aarch64 and 32-bit arm + * Use 'asimdrdm' cpu flag to use aarch64 workers where tests + are more stable + +------------------------------------------------------------------- +Thu Nov 10 08:18:42 UTC 2022 - Adam Majer + +- icu721_fixes.patch: fixes compatibility with ICU 72.1 (bsc#1205236) + +------------------------------------------------------------------- +Mon Nov 7 14:00:54 UTC 2022 - Adam Majer + +- Fix migration to openssl-3 (bsc#1205042) + +------------------------------------------------------------------- +Mon Nov 7 09:05:07 UTC 2022 - Adam Majer + +- Update to NodeJS 18.12.1 LTS: + * inspector: DNS rebinding in --inspect via invalid octal IP + (bsc#1205119, CVE-2022-43548) + +------------------------------------------------------------------- +Fri Oct 28 10:31:50 UTC 2022 - Adam Majer + +- Update to NodeJS 18.12.0 LTS: + * Running in 'watch' mode using node --watch restarts the process + when an imported file is changed. + * fs: add FileHandle.prototype.readLines + * http: add writeEarlyHints function to ServerResponse + * http2: make early hints generic + * util: add default value option to parsearg + +------------------------------------------------------------------- +Mon Oct 17 13:02:52 UTC 2022 - Adam Majer + +- Update to NodeJS 18.11.0: + * added experimental watch mode -- running in 'watch' mode using + node --watch restarts the process when an imported file is changed + * fs: add FileHandle.prototype.readLines + * http: add writeEarlyHints function to ServerResponse + * http2: make early hints generic + * lib: refactor transferable AbortSignal + * src: add detailed embedder process initialization API + * util: add default value option to parsearg + +- legacy_python.patch, versioned.patch: updated + +------------------------------------------------------------------- +Wed Oct 12 08:14:29 UTC 2022 - Adam Majer + +- qemu_timeouts_arches.patch: set timeouts on riscv5 to 7x normal + +------------------------------------------------------------------- +Fri Oct 7 08:05:59 UTC 2022 - Dirk Müller + +- skip more tests for riscv64/qemu emulation + +------------------------------------------------------------------- +Thu Sep 29 13:58:09 UTC 2022 - Adam Majer + +- Update to NodeJS 18.10.0: + * deps: upgrade npm to 8.19.2 + * http: throw error on content-length mismatch + * stream: add ReadableByteStream.tee() + +- openssl3_fixups.patch: upstreamed and removed + +------------------------------------------------------------------- +Mon Sep 26 13:13:39 UTC 2022 - Adam Majer + +- Update to Nodejs 18.9.1: + * deps: llhttp updated to 6.0.10 + + CVE-2022-32213 bypass via obs-fold mechanic (bsc#1201325) + + Incorrect Parsing of Multi-line Transfer-Encoding + (CVE-2022-32215, bsc#1201327) + + Incorrect Parsing of Header Fields (CVE-2022-35256, bsc#1203832) + * crypto: fix weak randomness in WebCrypto keygen + (CVE-2022-35255, bsc#1203831) + +------------------------------------------------------------------- +Sat Sep 17 10:35:31 UTC 2022 - Bruno Pitrus + +- Skip test-fs-utimes-y2K38.js on armv6hl as well as armv7hl. + +------------------------------------------------------------------- +Thu Sep 15 15:00:25 UTC 2022 - Adam Majer + +- Update to Nodejs 18.9.0: + * lib - add diagnostics channel for process and worker + * os - add machine method + * report - expose report public native apis + * src - expose environment RequestInterrupt api + * vm - include vm context in the embedded snapshot + +- Changes in 18.8.0: + * bootstrap: implement run-time user-land snapshots via + --build-snapshot and --snapshot-blob. See + * crypto: + + allow zero-length IKM in HKDF and in webcrypto PBKDF2 + + allow zero-length secret KeyObject + * deps: upgrade npm to 8.18.0 + * http: make idle http parser count configurable + * net: add local family + * src: print source map error source on demand + * tls: pass a valid socket on tlsClientError + +- dns.patch: upstreamed, removed +- nodejs-libpath.patch, versioned.patch: refreshed +- fix_ci_tests.patch: partially upstreamed +- openssl3_fixups.patch: fix unit tests with openssl 1.1.1 +- new_python3.patch: enable python 3.11 as valid interpreter + +------------------------------------------------------------------- +Thu Aug 18 10:41:57 UTC 2022 - Adam Majer + +- Update to Nodejs 18.7.0: + * events: add CustomEvent + * http: add drop request event for http server + * lib: improved diagnostics_channel subscribe/unsubscribe + * util: add tokens to parseArgs + +- enable crypto policy ciphers for TW and SLE15 SP4+ (bsc#1200303) + +------------------------------------------------------------------- +Sun Jul 31 15:37:05 UTC 2022 - Adam Majer + +- dns.patch: fix regression + https://github.com/nodejs/node/issues/44003 + +------------------------------------------------------------------- +Sun Jul 24 09:47:19 UTC 2022 - Adam Majer + +- Update to Nodejs 18.6.0: + * Experimental ESM Loader Hooks API. For details see, + https://nodejs.org/api/esm.html + * dns: export error code constants from dns/promises + * esm: add chaining to loaders + * http: add diagnostics channel for http client + * http: add perf_hooks detail for http request and client + * module: add isBuiltIn method + * net: add drop event for net server + * test_runner: expose describe and it + * v8: add v8.startupSnapshot utils + + For details, see + https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V18.md#18.6.0 + +------------------------------------------------------------------- +Mon Jul 11 12:00:48 UTC 2022 - Adam Majer + +- Update to Nodejs 18.5.0: + * http: stricter Transfer-Encoding and header separator parsing + (bsc#1201325, bsc#1201326, bsc#1201327, + CVE-2022-32213, CVE-2022-32214, CVE-2022-32215) + * src: fix IPv4 validation in inspector_socket + (bsc#1201328, CVE-2022-32212) + For details, see + https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V18.md#18.5.0 + +------------------------------------------------------------------- +Tue Jun 28 13:06:23 UTC 2022 - Adam Majer + +- Update to Nodejs 18.4.0. For detailed changes see, + https://github.com/nodejs/node/blob/main/doc/changelogs/CHANGELOG_V18.md#18.4.0 +- refreshed: versioned.patch, linker_lto_jobs.patch, nodejs-libpath.patch + +------------------------------------------------------------------- +Thu May 19 15:01:09 UTC 2022 - Adam Majer + +- Initial packaging of Nodejs 18.2.0. For detailed changes + since previous versions, see + + https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V18.md#18.2.0 + + Patches carried over from nodejs17: + legacy_python.patch node-gyp-addon-gypi.patch openssl_binary_detection.patch +test-skip-y2038-on-32bit-time_t.patch cares_public_headers.patch +rsa-pss-revert.patch linker_lto_jobs.patch versioned.patch fix_ci_tests.patch +manual_configure.patch npm_search_paths.patch skip_no_console.patch +flaky_test_rerun.patch nodejs-libpath.patch sle12_python3_compat.patch + diff --git a/nodejs18.spec b/nodejs18.spec new file mode 100644 index 0000000..8d61556 --- /dev/null +++ b/nodejs18.spec @@ -0,0 +1,1118 @@ +# +# spec file for package nodejs18 +# +# Copyright (c) 2022 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: nodejs18 +Version: 18.16.0 +Release: 0 + +# Double DWZ memory limits +%define _dwz_low_mem_die_limit 20000000 +%define _dwz_max_die_limit 100000000 + +%define node_version_number 18 + +# 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 + +%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 + +# Python 3.4 compatible node-gyp +### https://github.com/nodejs/node-gyp.git +### git archive v7.1.2 | xz > node-gyp_7.1.2.tar.xz +Source5: node-gyp_7.1.2.tar.xz +# Only required to run unit tests in NodeJS 10+ +Source10: update_npm_tarball.sh +Source11: node_modules.tar.xz +Source20: bash_output_helper.bash + +## Patches not distribution specific +Patch1: cares_public_headers.patch +Patch3: fix_ci_tests.patch +Patch5: sle12_python3_compat.patch +Patch7: manual_configure.patch +Patch13: openssl_binary_detection.patch + + + +## Patches specific to SUSE and openSUSE +Patch100: linker_lto_jobs.patch +# PATCH-FIX-OPENSUSE -- set correct path for dtrace if it is built +Patch101: nodejs-libpath.patch +# PATCH-FIX-UPSTREAM -- use custom addon.gypi by default instead of +# downloading node source +Patch102: node-gyp-addon-gypi.patch +# PATCH-FIX-SLE -- configure script uses Python check_output method +# which isn't included in Python 2.6 (used in SLE 11). +# PATCH-FIX-OPENSUSE -- install user global npm packages to /usr/local +# instead of /usr +Patch104: npm_search_paths.patch +Patch106: skip_no_console.patch +Patch110: legacy_python.patch + +Patch120: flaky_test_rerun.patch + +Patch132: test-skip-y2038-on-32bit-time_t.patch +Patch133: rsa-pss-revert.patch + +# Use versioned binaries and paths +Patch200: versioned.patch + +Patch305: qemu_timeouts_arches.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} && 0%{?suse_version} < 1500 +BuildRequires: python36 +%define forced_python_version 3.6m +%else +BuildRequires: python3 +%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.8 +%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.19.0 +%endif + +%if ! 0%{with intree_icu} +BuildRequires: pkgconfig(icu-i18n) >= 69 +%else +Provides: bundled(icu) = 72.1 +%endif + +%if ! 0%{with intree_nghttp2} +BuildRequires: libnghttp2-devel >= 1.41.0 +%else +Provides: bundled(nghttp2) = 1.52.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: npm18 + +#we need ABI virtual provides where SONAMEs aren't enough/not present so deps +#break when binary compatibility is broken +%global nodejs_abi 18.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.15 +Provides: bundled(libuv) = 1.44.2 +Provides: bundled(v8) = 10.2.154.26 +%if %{with intree_brotli} +Provides: bundled(brotli) = 1.0.9 +%else +BuildRequires: pkgconfig(libbrotlidec) +%endif + + +Provides: bundled(llhttp) = 6.0.10 +Provides: bundled(ngtcp2) = 0.8.1 +Provides: bundled(base64) = 0.5.0 +Provides: bundled(simdutf) = 3.2.2 +# bundled url-ada parser, not ada +Provides: bundled(ada) = 1.0.4 + +Provides: bundled(node-acorn) = 8.8.2 +Provides: bundled(node-acorn-walk) = 8.2.0 +Provides: bundled(node-busboy) = 1.6.0 +Provides: bundled(node-cjs-module-lexer) = 1.2.2 +Provides: bundled(node-corepack) = 0.17.0 +Provides: bundled(node-streamsearch) = 1.1.0 +Provides: bundled(node-undici) = 5.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 18.x +Group: Development/Languages/NodeJS +Provides: nodejs-devel = %{version} +Requires: npm18 = %{version} +Requires: %{name} = %{version} + +%description devel +This package provides development headers for Node.js needed for creation +of binary modules. + +%package -n npm18 +Summary: Package manager for Node.js +Group: Development/Languages/NodeJS +%if %{with libalternatives} +Requires: nodejs-common >= 5.0 +%else +Requires: nodejs-common +%endif +Requires: nodejs18 = %{version} +Provides: nodejs-npm = %{version} +Obsoletes: nodejs-npm < 4.0.0 +Provides: npm(npm) = 9.5.1 +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) = 1.1.1 +Provides: bundled(node-abbrev) = 2.0.0 +Provides: bundled(node-abort-controller) = 3.0.0 +Provides: bundled(node-agent-base) = 6.0.2 +Provides: bundled(node-agentkeepalive) = 4.2.1 +Provides: bundled(node-aggregate-error) = 3.1.0 +Provides: bundled(node-ansi-regex) = 5.0.1 +Provides: bundled(node-ansi-styles) = 4.3.0 +Provides: bundled(node-aproba) = 2.0.0 +Provides: bundled(node-archy) = 1.0.0 +Provides: bundled(node-are-we-there-yet) = 3.0.1 +Provides: bundled(node-are-we-there-yet) = 4.0.0 +Provides: bundled(node-balanced-match) = 1.0.2 +Provides: bundled(node-base64-js) = 1.5.1 +Provides: bundled(node-bin-links) = 4.0.1 +Provides: bundled(node-binary-extensions) = 2.2.0 +Provides: bundled(node-brace-expansion) = 1.1.11 +Provides: bundled(node-brace-expansion) = 2.0.1 +Provides: bundled(node-buffer) = 6.0.3 +Provides: bundled(node-builtins) = 5.0.1 +Provides: bundled(node-cacache) = 16.1.3 +Provides: bundled(node-cacache) = 17.0.4 +Provides: bundled(node-chalk) = 4.1.2 +Provides: bundled(node-chownr) = 2.0.0 +Provides: bundled(node-ci-info) = 3.8.0 +Provides: bundled(node-cidr-regex) = 3.1.1 +Provides: bundled(node-clean-stack) = 2.2.0 +Provides: bundled(node-cli-columns) = 4.0.0 +Provides: bundled(node-cli-table3) = 0.6.3 +Provides: bundled(node-clone) = 1.0.4 +Provides: bundled(node-cmd-shim) = 6.0.1 +Provides: bundled(node-color-convert) = 2.0.1 +Provides: bundled(node-color-name) = 1.1.4 +Provides: bundled(node-color-support) = 1.1.3 +Provides: bundled(node-columnify) = 1.6.0 +Provides: bundled(node-common-ancestor-path) = 1.0.1 +Provides: bundled(node-concat-map) = 0.0.1 +Provides: bundled(node-console-control-strings) = 1.1.0 +Provides: bundled(node-cssesc) = 3.0.0 +Provides: bundled(node-debug) = 4.3.4 +Provides: bundled(node-defaults) = 1.0.4 +Provides: bundled(node-delegates) = 1.0.0 +Provides: bundled(node-depd) = 1.1.2 +Provides: bundled(node-diff) = 5.1.0 +Provides: bundled(node-emoji-regex) = 8.0.0 +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-event-target-shim) = 5.0.1 +Provides: bundled(node-events) = 3.3.0 +Provides: bundled(node-fastest-levenshtein) = 1.0.16 +Provides: bundled(node-fs-minipass) = 2.1.0 +Provides: bundled(node-fs-minipass) = 3.0.1 +Provides: bundled(node-fs.realpath) = 1.0.0 +Provides: bundled(node-function-bind) = 1.1.1 +Provides: bundled(node-gauge) = 4.0.4 +Provides: bundled(node-gauge) = 5.0.0 +Provides: bundled(node-glob) = 7.2.3 +Provides: bundled(node-glob) = 8.1.0 +Provides: bundled(node-graceful-fs) = 4.2.10 +Provides: bundled(node-has) = 1.0.3 +Provides: bundled(node-has-flag) = 4.0.0 +Provides: bundled(node-has-unicode) = 2.0.1 +Provides: bundled(node-hosted-git-info) = 6.1.1 +Provides: bundled(node-http-cache-semantics) = 4.1.1 +Provides: bundled(node-http-proxy-agent) = 5.0.0 +Provides: bundled(node-https-proxy-agent) = 5.0.1 +Provides: bundled(node-humanize-ms) = 1.2.1 +Provides: bundled(node-iconv-lite) = 0.6.3 +Provides: bundled(node-ieee754) = 1.2.1 +Provides: bundled(node-ignore-walk) = 6.0.1 +Provides: bundled(node-imurmurhash) = 0.1.4 +Provides: bundled(node-indent-string) = 4.0.0 +Provides: bundled(node-infer-owner) = 1.0.4 +Provides: bundled(node-inflight) = 1.0.6 +Provides: bundled(node-inherits) = 2.0.4 +Provides: bundled(node-ini) = 3.0.1 +Provides: bundled(node-init-package-json) = 5.0.0 +Provides: bundled(node-ip) = 2.0.0 +Provides: bundled(node-ip-regex) = 4.3.0 +Provides: bundled(node-is-cidr) = 4.0.2 +Provides: bundled(node-is-core-module) = 2.11.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-json-parse-even-better-errors) = 3.0.0 +Provides: bundled(node-json-stringify-nice) = 1.1.4 +Provides: bundled(node-jsonparse) = 1.3.1 +Provides: bundled(node-just-diff) = 5.2.0 +Provides: bundled(node-just-diff-apply) = 5.5.0 +Provides: bundled(node-libnpmaccess) = 7.0.2 +Provides: bundled(node-libnpmdiff) = 5.0.11 +Provides: bundled(node-libnpmexec) = 5.0.11 +Provides: bundled(node-libnpmfund) = 4.0.11 +Provides: bundled(node-libnpmhook) = 9.0.3 +Provides: bundled(node-libnpmorg) = 5.0.3 +Provides: bundled(node-libnpmpack) = 5.0.11 +Provides: bundled(node-libnpmpublish) = 7.1.0 +Provides: bundled(node-libnpmsearch) = 6.0.2 +Provides: bundled(node-libnpmteam) = 5.0.3 +Provides: bundled(node-libnpmversion) = 4.0.2 +Provides: bundled(node-lru-cache) = 6.0.0 +Provides: bundled(node-lru-cache) = 7.16.2 +Provides: bundled(node-make-fetch-happen) = 10.2.1 +Provides: bundled(node-make-fetch-happen) = 11.0.3 +Provides: bundled(node-minimatch) = 3.1.2 +Provides: bundled(node-minimatch) = 5.1.6 +Provides: bundled(node-minimatch) = 6.2.0 +Provides: bundled(node-minipass) = 3.3.6 +Provides: bundled(node-minipass) = 4.0.3 +Provides: bundled(node-minipass-collect) = 1.0.2 +Provides: bundled(node-minipass-fetch) = 2.1.2 +Provides: bundled(node-minipass-fetch) = 3.0.1 +Provides: bundled(node-minipass-flush) = 1.0.5 +Provides: bundled(node-minipass-json-stream) = 1.0.1 +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-mkdirp) = 1.0.4 +Provides: bundled(node-ms) = 2.1.2 +Provides: bundled(node-ms) = 2.1.3 +Provides: bundled(node-mute-stream) = 1.0.0 +Provides: bundled(node-negotiator) = 0.6.3 +Provides: bundled(node-node-gyp) = 9.3.1 +Provides: bundled(node-nopt) = 6.0.0 +Provides: bundled(node-nopt) = 7.0.0 +Provides: bundled(node-normalize-package-data) = 5.0.0 +Provides: bundled(node-npm-audit-report) = 4.0.0 +Provides: bundled(node-npm-bundled) = 3.0.0 +Provides: bundled(node-npm-install-checks) = 6.0.0 +Provides: bundled(node-npm-normalize-package-bin) = 3.0.0 +Provides: bundled(node-npm-package-arg) = 10.1.0 +Provides: bundled(node-npm-packlist) = 7.0.4 +Provides: bundled(node-npm-pick-manifest) = 8.0.1 +Provides: bundled(node-npm-profile) = 7.0.1 +Provides: bundled(node-npm-registry-fetch) = 14.0.3 +Provides: bundled(node-npm-user-validate) = 2.0.0 +Provides: bundled(node-npmlog) = 6.0.2 +Provides: bundled(node-npmlog) = 7.0.1 +Provides: bundled(node-once) = 1.4.0 +Provides: bundled(node-p-map) = 4.0.0 +Provides: bundled(node-pacote) = 15.1.1 +Provides: bundled(node-parse-conflict-json) = 3.0.0 +Provides: bundled(node-path-is-absolute) = 1.0.1 +Provides: bundled(node-postcss-selector-parser) = 6.0.11 +Provides: bundled(node-proc-log) = 3.0.0 +Provides: bundled(node-process) = 0.11.10 +Provides: bundled(node-promise-all-reject-late) = 1.0.1 +Provides: bundled(node-promise-call-limit) = 1.0.1 +Provides: bundled(node-promise-inflight) = 1.0.1 +Provides: bundled(node-promise-retry) = 2.0.1 +Provides: bundled(node-promzard) = 1.0.0 +Provides: bundled(node-qrcode-terminal) = 0.12.0 +Provides: bundled(node-read) = 2.0.0 +Provides: bundled(node-read-cmd-shim) = 4.0.0 +Provides: bundled(node-read-package-json) = 6.0.0 +Provides: bundled(node-read-package-json-fast) = 3.0.2 +Provides: bundled(node-readable-stream) = 3.6.0 +Provides: bundled(node-readable-stream) = 4.3.0 +Provides: bundled(node-retry) = 0.12.0 +Provides: bundled(node-rimraf) = 3.0.2 +Provides: bundled(node-safe-buffer) = 5.1.2 +Provides: bundled(node-safer-buffer) = 2.1.2 +Provides: bundled(node-semver) = 7.3.8 +Provides: bundled(node-set-blocking) = 2.0.0 +Provides: bundled(node-signal-exit) = 3.0.7 +Provides: bundled(node-sigstore) = 1.0.0 +Provides: bundled(node-smart-buffer) = 4.2.0 +Provides: bundled(node-socks) = 2.7.1 +Provides: bundled(node-socks-proxy-agent) = 7.0.0 +Provides: bundled(node-spdx-correct) = 3.1.1 +Provides: bundled(node-spdx-exceptions) = 2.3.0 +Provides: bundled(node-spdx-expression-parse) = 3.0.1 +Provides: bundled(node-spdx-license-ids) = 3.0.12 +Provides: bundled(node-ssri) = 10.0.1 +Provides: bundled(node-ssri) = 9.0.1 +Provides: bundled(node-string_decoder) = 1.1.1 +Provides: bundled(node-string-width) = 4.2.3 +Provides: bundled(node-strip-ansi) = 6.0.1 +Provides: bundled(node-supports-color) = 7.2.0 +Provides: bundled(node-tar) = 6.1.13 +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) = 1.0.0 +Provides: bundled(node-unique-filename) = 2.0.1 +Provides: bundled(node-unique-filename) = 3.0.0 +Provides: bundled(node-unique-slug) = 3.0.0 +Provides: bundled(node-unique-slug) = 4.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) = 5.0.0 +Provides: bundled(node-walk-up-path) = 1.0.0 +Provides: bundled(node-wcwidth) = 1.0.1 +Provides: bundled(node-which) = 2.0.2 +Provides: bundled(node-which) = 3.0.0 +Provides: bundled(node-wide-align) = 1.1.5 +Provides: bundled(node-wrappy) = 1.0.2 +Provides: bundled(node-write-file-atomic) = 5.0.0 +Provides: bundled(node-yallist) = 4.0.0 + +%description -n npm18 +A package manager for Node.js that allows developers to install and +publish packages to a package registry. + +%package -n corepack18 +Summary: Helper bridge between NodeJS projects and their dependencies +Group: Development/Languages/NodeJS +Requires: nodejs-common >= 5.0 + +%description -n corepack18 +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} <= 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 +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 +%endif +%endif + +%patch1 -p1 +%patch3 -p1 +%if %{node_version_number} <= 12 && 0%{?suse_version} < 1500 +%patch5 -p1 +%endif +%patch7 -p1 +%if 0%{with valgrind_tests} +%endif +%patch13 -p1 +%patch100 -p1 +%patch101 -p1 +%patch102 -p1 +# Add check_output to configure script (not part of Python 2.6 in SLE11). +%if 0%{?suse_version} == 1110 +%endif +%patch104 -p1 +%patch106 -p1 +%patch110 -p1 +%patch120 -p1 +%patch132 -p1 +%if ! 0%{with openssl_RSA_get0_pss_params} +%patch133 -p1 +%endif +%patch200 -p1 + +%patch305 -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 + +# Node.js 4.x does not include the ICU database in the source tarball. +%define has_small_icu %(test -d "deps/icu-small" && echo 1 || echo 0) + +./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 \ +%else +%if %{has_small_icu} + --with-intl=small-icu \ + --with-icu-source=deps/icu-small \ +%endif +%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} >= 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} +%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 <= 12 +find test \( -name \*.out -or -name \*.js \) -exec sed -i 's,Use `node ,Use `node%{node_version_number} ,' {} \; +%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 +%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} +%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} + +%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 + +%endif + +%changelog diff --git a/npm_search_paths.patch b/npm_search_paths.patch new file mode 100644 index 0000000..bad598f --- /dev/null +++ b/npm_search_paths.patch @@ -0,0 +1,32 @@ +Index: node-v19.5.0/deps/npm/lib/commands/help-search.js +=================================================================== +--- node-v19.5.0.orig/deps/npm/lib/commands/help-search.js ++++ node-v19.5.0/deps/npm/lib/commands/help-search.js +@@ -19,7 +19,7 @@ class HelpSearch extends BaseCommand { + throw this.usageError() + } + +- const docPath = path.resolve(this.npm.npmRoot, 'docs/content') ++ const docPath = '/usr/share/doc/packages/nodejs' + const files = await glob(`${globify(docPath)}/*/*.md`) + const data = await this.readFiles(files) + const results = await this.searchFiles(args, data, files) +Index: node-v19.5.0/deps/npm/lib/npm.js +=================================================================== +--- node-v19.5.0.orig/deps/npm/lib/npm.js ++++ node-v19.5.0/deps/npm/lib/npm.js +@@ -381,7 +381,13 @@ class Npm extends EventEmitter { + } + + 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; + } + + set globalPrefix (r) { diff --git a/openssl_binary_detection.patch b/openssl_binary_detection.patch new file mode 100644 index 0000000..c13bb13 --- /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 + + * {Object} + * `modulusLength`: {number} Key size in bits (RSA, DSA). + * `publicExponent`: {bigint} Public exponent (RSA). +- * `hashAlgorithm`: {string} Name of the message digest (RSA-PSS). +- * `mgf1HashAlgorithm`: {string} Name of the message digest used by +- MGF1 (RSA-PSS). +- * `saltLength`: {number} Minimal salt length in bytes (RSA-PSS). + * `divisorLength`: {number} Size of `q` in bits (DSA). + * `namedCurve`: {string} Name of the curve (EC). + +@@ -1981,11 +1972,8 @@ this object contains information about t + through this property can be used to uniquely identify a key or to compromise + the security of the key. + +-For RSA-PSS keys, if the key material contains a `RSASSA-PSS-params` sequence, +-the `hashAlgorithm`, `mgf1HashAlgorithm`, and `saltLength` properties will be +-set. +- +-Other key details might be exposed via this API using additional attributes. ++RSA-PSS parameters, DH, or any future key type details might be exposed via this ++API using additional attributes. + + ### `keyObject.asymmetricKeyType` + +Index: node-v17.3.0/src/crypto/crypto_rsa.cc +=================================================================== +--- node-v17.3.0.orig/src/crypto/crypto_rsa.cc ++++ node-v17.3.0/src/crypto/crypto_rsa.cc +@@ -561,84 +561,10 @@ Maybe GetRsaKeyDetail( + reinterpret_cast(public_exponent.data()); + CHECK_EQ(BN_bn2binpad(e, data, len), len); + +- if (target +- ->Set( +- env->context(), +- env->public_exponent_string(), +- public_exponent.ToArrayBuffer()) +- .IsNothing()) { +- return Nothing(); +- } +- +- if (type == EVP_PKEY_RSA_PSS) { +- // Due to the way ASN.1 encoding works, default values are omitted when +- // encoding the data structure. However, there are also RSA-PSS keys for +- // which no parameters are set. In that case, the ASN.1 RSASSA-PSS-params +- // sequence will be missing entirely and RSA_get0_pss_params will return +- // nullptr. If parameters are present but all parameters are set to their +- // default values, an empty sequence will be stored in the ASN.1 structure. +- // In that case, RSA_get0_pss_params does not return nullptr but all fields +- // of the returned RSA_PSS_PARAMS will be set to nullptr. +- +- const RSA_PSS_PARAMS* params = RSA_get0_pss_params(rsa); +- if (params != nullptr) { +- int hash_nid = NID_sha1; +- int mgf_nid = NID_mgf1; +- int mgf1_hash_nid = NID_sha1; +- int64_t salt_length = 20; +- +- if (params->hashAlgorithm != nullptr) { +- hash_nid = OBJ_obj2nid(params->hashAlgorithm->algorithm); +- } +- +- if (target +- ->Set( +- env->context(), +- env->hash_algorithm_string(), +- OneByteString(env->isolate(), OBJ_nid2ln(hash_nid))) +- .IsNothing()) { +- return Nothing(); +- } +- +- if (params->maskGenAlgorithm != nullptr) { +- mgf_nid = OBJ_obj2nid(params->maskGenAlgorithm->algorithm); +- if (mgf_nid == NID_mgf1) { +- mgf1_hash_nid = OBJ_obj2nid(params->maskHash->algorithm); +- } +- } +- +- // If, for some reason, the MGF is not MGF1, then the MGF1 hash function +- // is intentionally not added to the object. +- if (mgf_nid == NID_mgf1) { +- if (target +- ->Set( +- env->context(), +- env->mgf1_hash_algorithm_string(), +- OneByteString(env->isolate(), OBJ_nid2ln(mgf1_hash_nid))) +- .IsNothing()) { +- return Nothing(); +- } +- } +- +- if (params->saltLength != nullptr) { +- if (ASN1_INTEGER_get_int64(&salt_length, params->saltLength) != 1) { +- ThrowCryptoError(env, ERR_get_error(), "ASN1_INTEGER_get_in64 error"); +- return Nothing(); +- } +- } +- +- if (target +- ->Set( +- env->context(), +- env->salt_length_string(), +- Number::New(env->isolate(), static_cast(salt_length))) +- .IsNothing()) { +- return Nothing(); +- } +- } +- } +- +- return Just(true); ++ return target->Set( ++ env->context(), ++ env->public_exponent_string(), ++ public_exponent.ToArrayBuffer()); + } + + namespace RSAAlg { +Index: node-v17.3.0/src/env.h +=================================================================== +--- node-v17.3.0.orig/src/env.h ++++ node-v17.3.0/src/env.h +@@ -271,7 +271,6 @@ constexpr size_t kFsStatsBufferLength = + V(gid_string, "gid") \ + V(h2_string, "h2") \ + V(handle_string, "handle") \ +- V(hash_algorithm_string, "hashAlgorithm") \ + V(help_text_string, "helpText") \ + V(homedir_string, "homedir") \ + V(host_string, "host") \ +@@ -320,7 +319,6 @@ constexpr size_t kFsStatsBufferLength = + V(message_port_string, "messagePort") \ + V(message_string, "message") \ + V(messageerror_string, "messageerror") \ +- V(mgf1_hash_algorithm_string, "mgf1HashAlgorithm") \ + V(minttl_string, "minttl") \ + V(module_string, "module") \ + V(modulus_string, "modulus") \ +@@ -390,7 +388,6 @@ constexpr size_t kFsStatsBufferLength = + V(replacement_string, "replacement") \ + V(require_string, "require") \ + V(retry_string, "retry") \ +- V(salt_length_string, "saltLength") \ + V(scheme_string, "scheme") \ + V(scopeid_string, "scopeid") \ + V(serial_number_string, "serialNumber") \ +Index: node-v17.3.0/test/fixtures/keys/Makefile +=================================================================== +--- node-v17.3.0.orig/test/fixtures/keys/Makefile ++++ node-v17.3.0/test/fixtures/keys/Makefile +@@ -64,11 +64,9 @@ all: \ + rsa_pss_private_2048.pem \ + rsa_pss_private_2048_sha256_sha256_16.pem \ + rsa_pss_private_2048_sha512_sha256_20.pem \ +- rsa_pss_private_2048_sha1_sha1_20.pem \ + rsa_pss_public_2048.pem \ + rsa_pss_public_2048_sha256_sha256_16.pem \ + rsa_pss_public_2048_sha512_sha256_20.pem \ +- rsa_pss_public_2048_sha1_sha1_20.pem \ + ed25519_private.pem \ + ed25519_public.pem \ + x25519_private.pem \ +@@ -710,9 +708,6 @@ rsa_pss_private_2048_sha256_sha256_16.pe + rsa_pss_private_2048_sha512_sha256_20.pem: + openssl genpkey -algorithm RSA-PSS -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:65537 -pkeyopt rsa_pss_keygen_md:sha512 -pkeyopt rsa_pss_keygen_mgf1_md:sha256 -pkeyopt rsa_pss_keygen_saltlen:20 -out rsa_pss_private_2048_sha512_sha256_20.pem + +-rsa_pss_private_2048_sha1_sha1_20.pem: +- openssl genpkey -algorithm RSA-PSS -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:65537 -pkeyopt rsa_pss_keygen_md:sha1 -pkeyopt rsa_pss_keygen_mgf1_md:sha1 -pkeyopt rsa_pss_keygen_saltlen:20 -out rsa_pss_private_2048_sha1_sha1_20.pem +- + rsa_pss_public_2048.pem: rsa_pss_private_2048.pem + openssl pkey -in rsa_pss_private_2048.pem -pubout -out rsa_pss_public_2048.pem + +@@ -722,9 +717,6 @@ rsa_pss_public_2048_sha256_sha256_16.pem + rsa_pss_public_2048_sha512_sha256_20.pem: rsa_pss_private_2048_sha512_sha256_20.pem + openssl pkey -in rsa_pss_private_2048_sha512_sha256_20.pem -pubout -out rsa_pss_public_2048_sha512_sha256_20.pem + +-rsa_pss_public_2048_sha1_sha1_20.pem: rsa_pss_private_2048_sha1_sha1_20.pem +- openssl pkey -in rsa_pss_private_2048_sha1_sha1_20.pem -pubout -out rsa_pss_public_2048_sha1_sha1_20.pem +- + ed25519_private.pem: + openssl genpkey -algorithm ED25519 -out ed25519_private.pem + +Index: node-v17.3.0/test/fixtures/keys/rsa_pss_private_2048_sha1_sha1_20.pem +=================================================================== +--- node-v17.3.0.orig/test/fixtures/keys/rsa_pss_private_2048_sha1_sha1_20.pem ++++ /dev/null +@@ -1,28 +0,0 @@ +------BEGIN PRIVATE KEY----- +-MIIEvQIBADANBgkqhkiG9w0BAQowAASCBKcwggSjAgEAAoIBAQCpdutzsPFQ1100 +-ouR5aAwYry8aAtG0c+zX9UqNXGCpRDWzPPpXHUZSB1BmTTL4EhK2tkAfblYNqzRu +-CAYlKHbFpFLs2zLEorfp0WsFNPaBHE9JHpLIM4oXxPCUypZ7JAn56ZYonYCZ8Il5 +-8SzD9aoF41RTEmpcx3XkL2RQa022RiSccYZKx/yzskUUAdTvTvYyujH1MkvsfVP+ +-Ns5bRL6IVqowFd3xv6ctvfQMxz0rltgTC+wOm3CFtn+G63y6P/Z0U2DRdacsNkN6 +-PFGXAIB0kSvKzs8gVocEBiSwMkcT/KD3R68PY18b2auqaGcm8gA+gaVJ36KAW4dO +-AjbY+YitAgMBAAECggEAfPvfFXln0Ra1gE+vMDdjzITPuWBg57Uj9fbMIEwEYnKT +-JHmRrNRDe9Y3HuxK7hjuQmFSE5xdzUD6rzgtyBP63TOfkV7tJ4dXGxS/2JxCPeDy +-PNxWp18Ttwoh4as0pudikDYN8DCRm3eC/TO5r2EtH6CVHZuUZI8bTMsDMiihrQ8F +-B8+KucBG5DDy/OlDeieAZxZA4Y0/c+W0DNZ/LIPGwaqMzYCSZJXyV0t33HytUwM2 +-QZ+RbWqcUcrCI3lFAO8IyEULCi+RnSByZeJ0xwUkdQTI5jT6+G8BrO70Oiab8g+Q +-Rx2s7PxWpIMVS7/JD1PsL4hLrVh3uqh8PZl3/FG9IQKBgQDZWkOR2LA+ixmD6XJb +-Q+7zW2guHnK6wDrQFKmBGLaDdAER64WL1Unt6Umu7FPxth2niYMEgRexBgnj5hQN +-LfPYTiIeXs5ErrU96fVQABsV0Hra1M2Rhve5nynjFFpbHjDXtizzLpE30MsC7YkN +-EqD4YYzjWHrbk/UlQ7tx3eAvtQKBgQDHmNM4TRuyH2yaYxDqnho6fgJv7Z4KgbM0 +-1wcUxi5kPDQsFtaVOzFhNserzsWvotQjLkC2+CK5qlCdm59ZlpUqszF6+YyUs5Gq +-WmHdqryduT1VxSV/pd6wGEQo27fxFV7LsT1JhVMh9Iri8MK0b1BD6+kVUf5NcKDB +-Od2o8A1gGQKBgA5Y3Pj1mrymJesFL91CYLWDpR7WN7CIG9m8Y2v4G6QVtjRenZQb +-YiPoMErxoqDj6pUyiIl1lADFa0W13ED6dYwjrDDhBTCXb7NEjELZnvATsOhc/6zJ +-gfSowvUQVN6K4aJ7jgAHZOKQT7ZDw7YvMpzyo4AmSQXRgG8TR34+rRu5AoGACApP +-9+SjSPmbFl0HQWw9Aj4xOvEHfMTcwzQmRN/23nLOZzhETJ6lzpS2VmVt8TVN9lzW +-nohAXdpOhQrP0HwQZjfxtlJ3J0ZUh9g8OQG3t2LO5bWbXRkBb3aKyFqRflSuDOaG +-4X9NagC/14R7U2loglPuf71d0SDIWQBLvZJt94ECgYEAnY7aKHnWdLszcB8uyEkJ +-EJkUEaa+K/nTqOzqffZ01cTWJmUG7a2KuvQ+UQM2BHk2+wBmUo45Iz/dyePOJY0B +-Fu2agiV4+R4z2XVQnIvXgY5HaPxvLz0THksY/pD58gBmFaLMx4ADEwQ+s4Y2g12H +-ABsKNRHfSnKTwOm/dYvcVqs= +------END PRIVATE KEY----- +Index: node-v17.3.0/test/fixtures/keys/rsa_pss_public_2048_sha1_sha1_20.pem +=================================================================== +--- node-v17.3.0.orig/test/fixtures/keys/rsa_pss_public_2048_sha1_sha1_20.pem ++++ /dev/null +@@ -1,9 +0,0 @@ +------BEGIN PUBLIC KEY----- +-MIIBIjANBgkqhkiG9w0BAQowAAOCAQ8AMIIBCgKCAQEAqXbrc7DxUNddNKLkeWgM +-GK8vGgLRtHPs1/VKjVxgqUQ1szz6Vx1GUgdQZk0y+BIStrZAH25WDas0bggGJSh2 +-xaRS7NsyxKK36dFrBTT2gRxPSR6SyDOKF8TwlMqWeyQJ+emWKJ2AmfCJefEsw/Wq +-BeNUUxJqXMd15C9kUGtNtkYknHGGSsf8s7JFFAHU7072Mrox9TJL7H1T/jbOW0S+ +-iFaqMBXd8b+nLb30DMc9K5bYEwvsDptwhbZ/hut8uj/2dFNg0XWnLDZDejxRlwCA +-dJErys7PIFaHBAYksDJHE/yg90evD2NfG9mrqmhnJvIAPoGlSd+igFuHTgI22PmI +-rQIDAQAB +------END PUBLIC KEY----- +Index: node-v17.3.0/test/parallel/test-crypto-key-objects.js +=================================================================== +--- node-v17.3.0.orig/test/parallel/test-crypto-key-objects.js ++++ node-v17.3.0/test/parallel/test-crypto-key-objects.js +@@ -582,21 +582,11 @@ const privateDsa = fixtures.readKey('dsa + const publicKey = createPublicKey(publicPem); + const privateKey = createPrivateKey(privatePem); + +- // Because no RSASSA-PSS-params appears in the PEM, no defaults should be +- // added for the PSS parameters. This is different from an empty +- // RSASSA-PSS-params sequence (see test below). +- const expectedKeyDetails = { +- modulusLength: 2048, +- publicExponent: 65537n +- }; +- + assert.strictEqual(publicKey.type, 'public'); + assert.strictEqual(publicKey.asymmetricKeyType, 'rsa-pss'); +- assert.deepStrictEqual(publicKey.asymmetricKeyDetails, expectedKeyDetails); + + assert.strictEqual(privateKey.type, 'private'); + assert.strictEqual(privateKey.asymmetricKeyType, 'rsa-pss'); +- assert.deepStrictEqual(privateKey.asymmetricKeyDetails, expectedKeyDetails); + + assert.throws( + () => publicKey.export({ format: 'jwk' }), +@@ -635,38 +625,6 @@ const privateDsa = fixtures.readKey('dsa + } + + { +- // This key pair enforces sha1 as the message digest and the MGF1 +- // message digest and a salt length of 20 bytes. +- +- const publicPem = fixtures.readKey('rsa_pss_public_2048_sha1_sha1_20.pem'); +- const privatePem = +- fixtures.readKey('rsa_pss_private_2048_sha1_sha1_20.pem'); +- +- const publicKey = createPublicKey(publicPem); +- const privateKey = createPrivateKey(privatePem); +- +- // Unlike the previous key pair, this key pair contains an RSASSA-PSS-params +- // sequence. However, because all values in the RSASSA-PSS-params are set to +- // their defaults (see RFC 3447), the ASN.1 structure contains an empty +- // sequence. Node.js should add the default values to the key details. +- const expectedKeyDetails = { +- modulusLength: 2048, +- publicExponent: 65537n, +- hashAlgorithm: 'sha1', +- mgf1HashAlgorithm: 'sha1', +- saltLength: 20 +- }; +- +- assert.strictEqual(publicKey.type, 'public'); +- assert.strictEqual(publicKey.asymmetricKeyType, 'rsa-pss'); +- assert.deepStrictEqual(publicKey.asymmetricKeyDetails, expectedKeyDetails); +- +- assert.strictEqual(privateKey.type, 'private'); +- assert.strictEqual(privateKey.asymmetricKeyType, 'rsa-pss'); +- assert.deepStrictEqual(privateKey.asymmetricKeyDetails, expectedKeyDetails); +- } +- +- { + // This key pair enforces sha256 as the message digest and the MGF1 + // message digest and a salt length of at least 16 bytes. + const publicPem = +@@ -724,21 +682,11 @@ const privateDsa = fixtures.readKey('dsa + const publicKey = createPublicKey(publicPem); + const privateKey = createPrivateKey(privatePem); + +- const expectedKeyDetails = { +- modulusLength: 2048, +- publicExponent: 65537n, +- hashAlgorithm: 'sha512', +- mgf1HashAlgorithm: 'sha256', +- saltLength: 20 +- }; +- + assert.strictEqual(publicKey.type, 'public'); + assert.strictEqual(publicKey.asymmetricKeyType, 'rsa-pss'); +- assert.deepStrictEqual(publicKey.asymmetricKeyDetails, expectedKeyDetails); + + assert.strictEqual(privateKey.type, 'private'); + assert.strictEqual(privateKey.asymmetricKeyType, 'rsa-pss'); +- assert.deepStrictEqual(privateKey.asymmetricKeyDetails, expectedKeyDetails); + + // Node.js usually uses the same hash function for the message and for MGF1. + // However, when a different MGF1 message digest algorithm has been +Index: node-v17.3.0/test/parallel/test-crypto-keygen.js +=================================================================== +--- node-v17.3.0.orig/test/parallel/test-crypto-keygen.js ++++ node-v17.3.0/test/parallel/test-crypto-keygen.js +@@ -309,20 +309,14 @@ const sec1EncExp = (cipher) => getRegExp + assert.strictEqual(publicKey.asymmetricKeyType, 'rsa-pss'); + assert.deepStrictEqual(publicKey.asymmetricKeyDetails, { + modulusLength: 512, +- publicExponent: 65537n, +- hashAlgorithm: 'sha256', +- mgf1HashAlgorithm: 'sha256', +- saltLength: 16 ++ publicExponent: 65537n + }); + + assert.strictEqual(privateKey.type, 'private'); + assert.strictEqual(privateKey.asymmetricKeyType, 'rsa-pss'); + assert.deepStrictEqual(privateKey.asymmetricKeyDetails, { + modulusLength: 512, +- publicExponent: 65537n, +- hashAlgorithm: 'sha256', +- mgf1HashAlgorithm: 'sha256', +- saltLength: 16 ++ publicExponent: 65537n + }); + + // Unlike RSA, RSA-PSS does not allow encryption. +@@ -381,10 +375,7 @@ const sec1EncExp = (cipher) => getRegExp + }, common.mustSucceed((publicKey, privateKey) => { + const expectedKeyDetails = { + modulusLength: 512, +- publicExponent: 65537n, +- hashAlgorithm: 'sha256', +- mgf1HashAlgorithm: 'sha256', +- saltLength: 16 ++ publicExponent: 65537n + }; + assert.deepStrictEqual(publicKey.asymmetricKeyDetails, expectedKeyDetails); + assert.deepStrictEqual(privateKey.asymmetricKeyDetails, expectedKeyDetails); +@@ -401,10 +392,7 @@ const sec1EncExp = (cipher) => getRegExp + }, common.mustSucceed((publicKey, privateKey) => { + const expectedKeyDetails = { + modulusLength: 512, +- publicExponent: 65537n, +- hashAlgorithm: 'sha512', +- mgf1HashAlgorithm: 'sha512', +- saltLength: 64 ++ publicExponent: 65537n + }; + assert.deepStrictEqual(publicKey.asymmetricKeyDetails, expectedKeyDetails); + assert.deepStrictEqual(privateKey.asymmetricKeyDetails, expectedKeyDetails); +@@ -418,10 +406,7 @@ const sec1EncExp = (cipher) => getRegExp + }, common.mustSucceed((publicKey, privateKey) => { + const expectedKeyDetails = { + modulusLength: 512, +- publicExponent: 65537n, +- hashAlgorithm: 'sha512', +- mgf1HashAlgorithm: 'sha512', +- saltLength: 0 ++ publicExponent: 65537n + }; + assert.deepStrictEqual(publicKey.asymmetricKeyDetails, expectedKeyDetails); + assert.deepStrictEqual(privateKey.asymmetricKeyDetails, expectedKeyDetails); +@@ -1646,20 +1631,14 @@ if (!common.hasOpenSSL3) { + assert.strictEqual(publicKey.asymmetricKeyType, 'rsa-pss'); + assert.deepStrictEqual(publicKey.asymmetricKeyDetails, { + modulusLength: 512, +- publicExponent: 65537n, +- hashAlgorithm: 'sha256', +- mgf1HashAlgorithm: 'sha256', +- saltLength: 16 ++ publicExponent: 65537n + }); + + assert.strictEqual(privateKey.type, 'private'); + assert.strictEqual(privateKey.asymmetricKeyType, 'rsa-pss'); + assert.deepStrictEqual(privateKey.asymmetricKeyDetails, { + modulusLength: 512, +- publicExponent: 65537n, +- hashAlgorithm: 'sha256', +- mgf1HashAlgorithm: 'sha256', +- saltLength: 16 ++ publicExponent: 65537n + }); + })); + } +Index: node-v17.3.0/test/parallel/test-crypto-keygen-deprecation.js +=================================================================== +--- node-v17.3.0.orig/test/parallel/test-crypto-keygen-deprecation.js ++++ node-v17.3.0/test/parallel/test-crypto-keygen-deprecation.js +@@ -32,20 +32,14 @@ const { generateKeyPair } = require('cry + assert.strictEqual(publicKey.asymmetricKeyType, 'rsa-pss'); + assert.deepStrictEqual(publicKey.asymmetricKeyDetails, { + modulusLength: 512, +- publicExponent: 65537n, +- hashAlgorithm: 'sha256', +- mgf1HashAlgorithm: 'sha256', +- saltLength: 16 ++ publicExponent: 65537n + }); + + assert.strictEqual(privateKey.type, 'private'); + assert.strictEqual(privateKey.asymmetricKeyType, 'rsa-pss'); + assert.deepStrictEqual(privateKey.asymmetricKeyDetails, { + modulusLength: 512, +- publicExponent: 65537n, +- hashAlgorithm: 'sha256', +- mgf1HashAlgorithm: 'sha256', +- saltLength: 16 ++ publicExponent: 65537n + }); + })); + } diff --git a/skip_no_console.patch b/skip_no_console.patch new file mode 100644 index 0000000..5d562f6 --- /dev/null +++ b/skip_no_console.patch @@ -0,0 +1,29 @@ +Index: node-v14.3.0/test/parallel/test-repl-mode.js +=================================================================== +--- node-v14.3.0.orig/test/parallel/test-repl-mode.js ++++ node-v14.3.0/test/parallel/test-repl-mode.js +@@ -1,9 +1,11 @@ + 'use strict'; +-require('../common'); ++const common = require('../common'); + const assert = require('assert'); + const Stream = require('stream'); + const repl = require('repl'); + ++common.skipIfDumbTerminal(); ++ + const tests = [ + testSloppyMode, + testStrictMode, +Index: node-v14.3.0/test/parallel/test-repl-strict-mode-previews.js +=================================================================== +--- node-v14.3.0.orig/test/parallel/test-repl-strict-mode-previews.js ++++ node-v14.3.0/test/parallel/test-repl-strict-mode-previews.js +@@ -5,6 +5,7 @@ + const common = require('../common'); + + common.skipIfInspectorDisabled(); ++common.skipIfDumbTerminal(); + + if (process.argv[2] === 'child') { + const stream = require('stream'); diff --git a/sle12_python3_compat.patch b/sle12_python3_compat.patch new file mode 100644 index 0000000..1e0632d --- /dev/null +++ b/sle12_python3_compat.patch @@ -0,0 +1,35 @@ +Index: node-v16.13.0/configure +=================================================================== +--- node-v16.13.0.orig/configure ++++ node-v16.13.0/configure +@@ -22,7 +22,7 @@ except ImportError: + from distutils.spawn import find_executable as which + + print('Node.js configure: Found Python {}.{}.{}...'.format(*sys.version_info)) +-acceptable_pythons = ((3, 10), (3, 9), (3, 8), (3, 7), (3, 6)) ++acceptable_pythons = ((3, 10), (3, 9), (3, 8), (3, 7), (3, 6), (3, 4)) + if sys.version_info[:2] in acceptable_pythons: + import configure + else: +Index: node-v16.13.0/deps/npm/node_modules/node-gyp/lib/find-python.js +=================================================================== +--- node-v16.13.0.orig/deps/npm/node_modules/node-gyp/lib/find-python.js ++++ node-v16.13.0/deps/npm/node_modules/node-gyp/lib/find-python.js +@@ -15,7 +15,7 @@ const programFiles = process.env.Program + const programFilesX86 = process.env['ProgramFiles(x86)'] || `${programFiles} (x86)` + + const winDefaultLocationsArray = [] +-for (const majorMinor of ['39', '38', '37', '36']) { ++for (const majorMinor of ['39', '38', '37', '36', '34']) { + if (foundLocalAppData) { + winDefaultLocationsArray.push( + `${localAppData}\\Programs\\Python\\Python${majorMinor}\\python.exe`, +@@ -49,7 +49,7 @@ PythonFinder.prototype = { + log: logWithPrefix(log, 'find Python'), + argsExecutable: ['-c', 'import sys; print(sys.executable);'], + argsVersion: ['-c', 'import sys; print("%s.%s.%s" % sys.version_info[:3]);'], +- semverRange: '>=3.6.0', ++ semverRange: '>=3.4.0', + + // These can be overridden for testing: + execFile: cp.execFile, diff --git a/test-skip-y2038-on-32bit-time_t.patch b/test-skip-y2038-on-32bit-time_t.patch new file mode 100644 index 0000000..1e3b16b --- /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..342bcc3 --- /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/versioned.patch b/versioned.patch new file mode 100644 index 0000000..75aadb8 --- /dev/null +++ b/versioned.patch @@ -0,0 +1,348 @@ +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-v18.16.0/Makefile +=================================================================== +--- node-v18.16.0.orig/Makefile ++++ node-v18.16.0/Makefile +@@ -76,7 +76,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 = node18$(EXEEXT) + NODE ?= ./$(NODE_EXE) + NODE_G_EXE = node_g$(EXEEXT) + NPM ?= ./deps/npm/bin/npm-cli.js +Index: node-v18.16.0/tools/install.py +=================================================================== +--- node-v18.16.0.orig/tools/install.py ++++ node-v18.16.0/tools/install.py +@@ -86,7 +86,7 @@ def uninstall(paths, dst): + try_remove(path, dst) + + def package_files(action, name, bins): +- target_path = libdir() + '/node_modules/' + name + '/' ++ target_path = libdir() + '/node_modules/' + name + '18/' + + # don't install npm if the target path is a symlink, it probably means + # that a dev version of npm is installed there +@@ -106,19 +106,19 @@ def package_files(action, name, bins): + if action == uninstall: + action([link_path], 'bin/' + bin_name) + elif action == install: +- try_symlink('../' + libdir() + '/node_modules/' + name + '/' + bin_target, link_path) ++ try_symlink('../' + libdir() + '/node_modules/' + name + '18/' + bin_target, link_path) + else: + assert 0 # unhandled action type + + def npm_files(action): + package_files(action, 'npm', { +- 'npm': 'bin/npm-cli.js', +- 'npx': 'bin/npx-cli.js', ++ 'npm18': 'bin/npm-cli.js', ++ 'npx18': 'bin/npx-cli.js', + }) + + def corepack_files(action): + package_files(action, 'corepack', { +- 'corepack': 'dist/corepack.js', ++ 'corepack18': 'dist/corepack.js', + # Not the default just yet: + # 'yarn': 'dist/yarn.js', + # 'yarnpkg': 'dist/yarn.js', +@@ -147,7 +147,7 @@ def subdir_files(path, dest, action): + + def files(action): + is_windows = sys.platform == 'win32' +- output_file = 'node' ++ output_file = 'node18' + output_prefix = 'out/Release/' + + if is_windows: +@@ -186,7 +186,7 @@ def files(action): + action(['out/Release/node.d'], 'lib/dtrace/node.d') + + # behave similarly for systemtap +- action(['src/node.stp'], 'share/systemtap/tapset/') ++ action(['src/node.stp'], 'share/systemtap/tapset/node18.stp') + + action(['deps/v8/tools/gdbinit'], 'share/doc/node/') + action(['deps/v8/tools/lldb_commands.py'], 'share/doc/node/') +@@ -194,7 +194,7 @@ def files(action): + if 'freebsd' in sys.platform or 'openbsd' in sys.platform: + action(['doc/node.1'], 'man/man1/') + else: +- action(['doc/node.1'], 'share/man/man1/') ++ action(['doc/node.1'], 'share/man/man1/node18.1') + + if 'true' == variables.get('node_install_npm'): + npm_files(action) +@@ -281,28 +281,28 @@ def headers(action): + 'src/node_buffer.h', + 'src/node_object_wrap.h', + 'src/node_version.h', +- ], 'include/node/') ++ ], 'include/node18/') + + # Add the expfile that is created on AIX + if sys.platform.startswith('aix') or sys.platform == "os400": +- action(['out/Release/node.exp'], 'include/node/') ++ action(['out/Release/node.exp'], 'include/node18/') + +- subdir_files('deps/v8/include', 'include/node/', wanted_v8_headers) ++ subdir_files('deps/v8/include', 'include/node18/', wanted_v8_headers) + + if 'false' == variables.get('node_shared_libuv'): +- subdir_files('deps/uv/include', 'include/node/', action) ++ subdir_files('deps/uv/include', 'include/node18/', action) + + if 'true' == variables.get('node_use_openssl') and \ + 'false' == variables.get('node_shared_openssl'): +- subdir_files('deps/openssl/openssl/include/openssl', 'include/node/openssl/', action) +- subdir_files('deps/openssl/config/archs', 'include/node/openssl/archs', action) +- subdir_files('deps/openssl/config', 'include/node/openssl', action) ++ subdir_files('deps/openssl/openssl/include/openssl', 'include/node18/openssl/', action) ++ subdir_files('deps/openssl/config/archs', 'include/node18/openssl/archs', action) ++ subdir_files('deps/openssl/config', 'include/node18/openssl', action) + + if 'false' == variables.get('node_shared_zlib'): + action([ + 'deps/zlib/zconf.h', + 'deps/zlib/zlib.h', +- ], 'include/node/') ++ ], 'include/node18/') + + if sys.platform == 'zos': + zoslibinc = os.environ.get('ZOSLIB_INCLUDES') +Index: node-v18.16.0/doc/node.1 +=================================================================== +--- node-v18.16.0.orig/doc/node.1 ++++ node-v18.16.0/doc/node.1 +@@ -31,24 +31,24 @@ + .Dt NODE 1 + . + .Sh NAME +-.Nm node ++.Nm node18 + .Nd server-side JavaScript runtime + . + .\"====================================================================== + .Sh SYNOPSIS +-.Nm node ++.Nm node18 + .Op Ar options + .Op Ar v8-options + .Op Fl e Ar string | Ar script.js | Fl + .Op Fl - + .Op Ar arguments ... + . +-.Nm node ++.Nm node18 + .Cm inspect + .Op Fl e Ar string | Ar script.js | Fl | Ar : + .Ar ... + . +-.Nm node ++.Nm node18 + .Op Fl -v8-options + . + .\"====================================================================== +Index: node-v18.16.0/src/node.stp +=================================================================== +--- node-v18.16.0.orig/src/node.stp ++++ node-v18.16.0/src/node.stp +@@ -19,7 +19,7 @@ + // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + // USE OR OTHER DEALINGS IN THE SOFTWARE. + +-probe node_net_server_connection = process("node").mark("net__server__connection") ++probe node_net_server_connection = process("node18").mark("net__server__connection") + { + remote = user_string($arg2); + port = $arg3; +@@ -32,7 +32,7 @@ probe node_net_server_connection = proce + fd); + } + +-probe node_net_stream_end = process("node").mark("net__stream__end") ++probe node_net_stream_end = process("node18").mark("net__stream__end") + { + remote = user_string($arg2); + port = $arg3; +@@ -45,7 +45,7 @@ probe node_net_stream_end = process("nod + fd); + } + +-probe node_http_server_request = process("node").mark("http__server__request") ++probe node_http_server_request = process("node18").mark("http__server__request") + { + remote = user_string($arg3); + port = $arg4; +@@ -62,7 +62,7 @@ probe node_http_server_request = process + fd); + } + +-probe node_http_server_response = process("node").mark("http__server__response") ++probe node_http_server_response = process("node18").mark("http__server__response") + { + remote = user_string($arg2); + port = $arg3; +@@ -75,7 +75,7 @@ probe node_http_server_response = proces + fd); + } + +-probe node_http_client_request = process("node").mark("http__client__request") ++probe node_http_client_request = process("node18").mark("http__client__request") + { + remote = user_string($arg3); + port = $arg4; +@@ -92,7 +92,7 @@ probe node_http_client_request = process + fd); + } + +-probe node_http_client_response = process("node").mark("http__client__response") ++probe node_http_client_response = process("node18").mark("http__client__response") + { + remote = user_string($arg2); + port = $arg3; +@@ -105,7 +105,7 @@ probe node_http_client_response = proces + fd); + } + +-probe node_gc_start = process("node").mark("gc__start") ++probe node_gc_start = process("node18").mark("gc__start") + { + scavenge = 1 << 0; + compact = 1 << 1; +@@ -125,7 +125,7 @@ probe node_gc_start = process("node").ma + flags); + } + +-probe node_gc_stop = process("node").mark("gc__done") ++probe node_gc_stop = process("node18").mark("gc__done") + { + scavenge = 1 << 0; + compact = 1 << 1; +Index: node-v18.16.0/deps/npm/man/man1/npm.1 +=================================================================== +--- node-v18.16.0.orig/deps/npm/man/man1/npm.1 ++++ node-v18.16.0/deps/npm/man/man1/npm.1 +@@ -1,11 +1,11 @@ + .TH "NPM" "1" "February 2023" "" "" + .SH "NAME" +-\fBnpm\fR - javascript package manager ++\fBnpm18\fR - javascript package manager + .SS "Synopsis" + .P + .RS 2 + .nf +-npm ++npm18 + .fi + .RE + .P +@@ -19,7 +19,7 @@ npm is the package manager for the Node + .P + It is extremely configurable to support a variety of use cases. Most commonly, you use it to publish, discover, install, and develop node programs. + .P +-Run \fBnpm help\fR to get a list of available commands. ++Run \fBnpm18 help\fR to get a list of available commands. + .SS "Important" + .P + npm comes preconfigured to use npm's public registry at https://registry.npmjs.org by default. Use of the npm public registry is subject to terms of use available at https://docs.npmjs.com/policies/terms. +@@ -115,17 +115,17 @@ Or suggest formal RFC proposals: + .SS "See Also" + .RS 0 + .IP \(bu 4 +-npm help help ++npm18 help help + .IP \(bu 4 + \fBpackage.json\fR \fI\(la/configuring-npm/package-json\(ra\fR + .IP \(bu 4 +-npm help npmrc ++npm18 help npmrc + .IP \(bu 4 +-npm help config ++npm18 help config + .IP \(bu 4 +-npm help install ++npm18 help install + .IP \(bu 4 +-npm help prefix ++npm18 help prefix + .IP \(bu 4 +-npm help publish ++npm18 help publish + .RE 0 +Index: node-v18.16.0/src/node_main.cc +=================================================================== +--- node-v18.16.0.orig/src/node_main.cc ++++ node-v18.16.0/src/node_main.cc +@@ -90,6 +90,7 @@ int wmain(int argc, wchar_t* wargv[]) { + // UNIX + + int main(int argc, char* argv[]) { ++ setenv("NODE_VERSION", "18", 0); + return node::Start(argc, argv); + } + #endif +Index: node-v18.16.0/tools/test.py +=================================================================== +--- node-v18.16.0.orig/tools/test.py ++++ node-v18.16.0/tools/test.py +@@ -954,7 +954,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/node18' + else: + name = 'out/%s.%s/node' % (arch, mode) + +Index: node-v18.16.0/node.gyp +=================================================================== +--- node-v18.16.0.orig/node.gyp ++++ node-v18.16.0/node.gyp +@@ -25,8 +25,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%': 'node18', ++ 'node_lib_target_name%': 'libnode18', + 'node_intermediate_lib_type%': 'static_library', + 'node_builtin_modules_path%': '', + # We list the deps/ files out instead of globbing them in js2c.py since we +Index: node-v18.16.0/deps/npm/man/man1/npx.1 +=================================================================== +--- node-v18.16.0.orig/deps/npm/man/man1/npx.1 ++++ node-v18.16.0/deps/npm/man/man1/npx.1 +@@ -1,14 +1,14 @@ + .TH "NPX" "1" "February 2023" "" "" + .SH "NAME" +-\fBnpx\fR - Run a command from a local or remote npm package ++\fBnpx18\fR - Run a command from a local or remote npm package + .SS "Synopsis" + .P + .RS 2 + .nf +-npx -- \[lB]@\[rB] \[lB]args...\[rB] +-npx --package=\[lB]@\[rB] -- \[lB]args...\[rB] +-npx -c ' \[lB]args...\[rB]' +-npx --package=foo -c ' \[lB]args...\[rB]' ++npx18 -- \[lB]@\[rB] \[lB]args...\[rB] ++npx18 --package=\[lB]@\[rB] -- \[lB]args...\[rB] ++npx18 -c ' \[lB]args...\[rB]' ++npx18 --package=foo -c ' \[lB]args...\[rB]' + .fi + .RE + .SS "Description"