Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package nodejs26 for openSUSE:Factory 
checked in at 2026-08-26 19:55:32
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/nodejs26 (Old)
 and      /work/SRC/openSUSE:Factory/.nodejs26.new.1258 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "nodejs26"

Wed Aug 26 19:55:32 2026 rev:4 rq:1373780 version:26.7.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/nodejs26/nodejs26.changes        2026-08-02 
23:14:34.096571368 +0200
+++ /work/SRC/openSUSE:Factory/.nodejs26.new.1258/nodejs26.changes      
2026-08-26 19:55:42.339942136 +0200
@@ -1,0 +2,38 @@
+Tue Aug 25 10:56:32 UTC 2026 - Adam Majer <[email protected]>
+
+- Update to 26.7.0:
+  - crypto: support loading private keys through STORE loaders
+  - lib: add perfetto support
+  - module: implement Symbol.dispose in ModuleHooks
+  - st_runner: add support for --test-coverage-include-all
+
+For details, see https://github.com/nodejs/node/releases#release-v26.7.0
+
+- fix_ci_tests.patch: look up libnode location instead of hardcoding it
+- no_avx2_on_i586.patch: remove AVX2 from i586
+
+-------------------------------------------------------------------
+Tue Aug 25 10:39:43 UTC 2026 - Adam Majer <[email protected]>
+
+- npm-line-truncation.patch: do not truncate long lines in help output 
(bsc#1276224)
+
+-------------------------------------------------------------------
+Mon Aug  3 14:39:30 UTC 2026 - Adam Majer <[email protected]>
+
+- Add shared library (bsc#1174792)
+- versioned.patch: use libnode.so.* instead of versioning it
+  as soname is already unique between major versions
+- no-rpath.patch: remove fixed RPATH
+
+-------------------------------------------------------------------
+Mon Aug  3 14:27:08 UTC 2026 - Adam Majer <[email protected]>
+
+- Update to 26.6.0:
+  - ffi: add getCurrentEventLoop
+  - test_runner: add context.log() and test:log event
+  - test_runner: report entryFile in TestStream events
+
+- CVE-2026-54272: ip-address.patch: misclassification of IPv4-mapped/NAT64 
IPv6 addresses allows for bypass of SSRF and trust-boundary checks (bsc#1272882)
+- For details, see https://github.com/nodejs/node/releases#release-v26.6.0
+
+-------------------------------------------------------------------

Old:
----
  node-v26.5.1.tar.xz

New:
----
  ip-address.patch
  no-rpath.patch
  no_avx2_on_i586.patch
  node-v26.7.0.tar.xz
  npm-line-truncation.patch

----------(New B)----------
  New:
- CVE-2026-54272: ip-address.patch: misclassification of IPv4-mapped/NAT64 IPv6 
addresses allows for bypass of SSRF and trust-boundary checks (bsc#1272882)
- For details, see https://github.com/nodejs/node/releases#release-v26.6.0
  New:  as soname is already unique between major versions
- no-rpath.patch: remove fixed RPATH
  New:- fix_ci_tests.patch: look up libnode location instead of hardcoding it
- no_avx2_on_i586.patch: remove AVX2 from i586
  New:
- npm-line-truncation.patch: do not truncate long lines in help output 
(bsc#1276224)
----------(New E)----------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ nodejs26.spec ++++++
--- /var/tmp/diff_new_pack.ugfhMK/_old  2026-08-26 19:55:44.920033256 +0200
+++ /var/tmp/diff_new_pack.ugfhMK/_new  2026-08-26 19:55:44.922033326 +0200
@@ -25,7 +25,7 @@
 %endif
 
 Name:           nodejs26
-Version:        26.5.1
+Version:        26.7.0
 Release:        0
 
 # Double DWZ memory limits
@@ -119,8 +119,12 @@
 
 ## Patches not distribution specific
 Patch1:         v8-i586.patch
+Patch2:         no-rpath.patch
 Patch3:         fix_ci_tests.patch
+Patch4:         no_avx2_on_i586.patch
 Patch5:         icu_781.patch
+Patch6:         ip-address.patch
+Patch7:         npm-line-truncation.patch
 
 ## Patches specific to SUSE and openSUSE
 # PATCH-FIX-OPENSUSE -- set correct path for dtrace if it is built
@@ -223,7 +227,7 @@
 %if ! 0%{with intree_cares}
 BuildRequires:  pkgconfig(libcares) >= 1.17.0
 %else
-Provides:       bundled(libcares2) = 1.34.6
+Provides:       bundled(libcares2) = 1.34.8
 %endif
 
 %if %node_version_number >= 22
@@ -242,7 +246,7 @@
 %if ! 0%{with intree_nghttp2}
 BuildRequires:  libnghttp2-devel >= 1.41.0
 %else
-Provides:       bundled(nghttp2) = 1.69.0
+Provides:       bundled(nghttp2) = 1.70.0
 %endif
 
 %if 0%{with valgrind_tests}
@@ -301,17 +305,18 @@
 
 # bundled url-ada parser, not ada
 Provides:       bundled(LIEF) = 0.17.0
-Provides:       bundled(ada) = 3.4.4
+Provides:       bundled(ada) = 4.0.0
 Provides:       bundled(libuv) = 1.52.1
 Provides:       bundled(llhttp) = 9.4.3
 Provides:       bundled(merve) = 1.2.2
-Provides:       bundled(ngtcp2) = 1.23.0
-Provides:       bundled(node-acorn) = 8.17.0
+Provides:       bundled(nghttp3) = 1.18.0
+Provides:       bundled(ngtcp2) = 1.25.0
+Provides:       bundled(node-acorn) = 8.18.0
 Provides:       bundled(node-acorn-walk) = 8.3.5
-Provides:       bundled(node-amaro) = 1.1.10
-Provides:       bundled(node-minimatch) = 10.2.5
+Provides:       bundled(node-amaro) = 1.1.11
+Provides:       bundled(node-minimatch) = 10.2.6
 Provides:       bundled(node-undici) = 8.9.0
-Provides:       bundled(simdjson) = 4.6.4
+Provides:       bundled(simdjson) = 4.6.6
 Provides:       bundled(uvwasi) = 0.0.23
 Provides:       bundled(v8) = 14.6.202.34
 ## END NON-NPM PROVIDES ##
@@ -360,7 +365,7 @@
 Provides:       bundled(node-balanced-match) = 4.0.4
 Provides:       bundled(node-bin-links) = 6.0.2
 Provides:       bundled(node-binary-extensions) = 3.1.0
-Provides:       bundled(node-brace-expansion) = 5.0.6
+Provides:       bundled(node-brace-expansion) = 5.0.7
 Provides:       bundled(node-cacache) = 20.0.4
 Provides:       bundled(node-chalk) = 5.6.2
 Provides:       bundled(node-chownr) = 3.0.0
@@ -395,11 +400,11 @@
 Provides:       bundled(node-just-diff) = 6.0.2
 Provides:       bundled(node-just-diff-apply) = 5.5.0
 Provides:       bundled(node-libnpmaccess) = 10.0.3
-Provides:       bundled(node-libnpmdiff) = 8.1.10
-Provides:       bundled(node-libnpmexec) = 10.3.0
-Provides:       bundled(node-libnpmfund) = 7.0.24
+Provides:       bundled(node-libnpmdiff) = 8.1.12
+Provides:       bundled(node-libnpmexec) = 10.3.2
+Provides:       bundled(node-libnpmfund) = 7.0.26
 Provides:       bundled(node-libnpmorg) = 8.0.1
-Provides:       bundled(node-libnpmpack) = 9.1.10
+Provides:       bundled(node-libnpmpack) = 9.1.12
 Provides:       bundled(node-libnpmpublish) = 11.2.0
 Provides:       bundled(node-libnpmsearch) = 9.0.1
 Provides:       bundled(node-libnpmteam) = 8.0.2
@@ -427,7 +432,7 @@
 Provides:       bundled(node-npm-package-arg) = 13.0.2
 Provides:       bundled(node-npm-packlist) = 10.0.4
 Provides:       bundled(node-npm-pick-manifest) = 11.0.3
-Provides:       bundled(node-npm-profile) = 12.0.1
+Provides:       bundled(node-npm-profile) = 12.0.2
 Provides:       bundled(node-npm-registry-fetch) = 19.1.1
 Provides:       bundled(node-npm-user-validate) = 4.0.0
 Provides:       bundled(node-p-map) = 7.0.4
@@ -445,7 +450,7 @@
 Provides:       bundled(node-read) = 5.0.1
 Provides:       bundled(node-read-cmd-shim) = 6.0.0
 Provides:       bundled(node-safer-buffer) = 2.1.2
-Provides:       bundled(node-semver) = 7.8.4
+Provides:       bundled(node-semver) = 7.8.5
 Provides:       bundled(node-signal-exit) = 4.1.0
 Provides:       bundled(node-sigstore) = 4.1.1
 Provides:       bundled(node-smart-buffer) = 4.2.0
@@ -456,13 +461,13 @@
 Provides:       bundled(node-spdx-license-ids) = 3.0.23
 Provides:       bundled(node-ssri) = 13.0.1
 Provides:       bundled(node-supports-color) = 10.2.2
-Provides:       bundled(node-tar) = 7.5.16
+Provides:       bundled(node-tar) = 7.5.19
 Provides:       bundled(node-text-table) = 0.2.0
 Provides:       bundled(node-tiny-relative-date) = 2.0.2
 Provides:       bundled(node-tinyglobby) = 0.2.17
 Provides:       bundled(node-treeverse) = 3.0.0
 Provides:       bundled(node-tuf-js) = 4.1.0
-Provides:       bundled(node-undici) = 6.26.0
+Provides:       bundled(node-undici) = 6.27.0
 Provides:       bundled(node-util-deprecate) = 1.0.2
 Provides:       bundled(node-validate-npm-package-name) = 7.0.2
 Provides:       bundled(node-walk-up-path) = 4.0.0
@@ -596,6 +601,8 @@
 %endif
 %if %{node_version_number} >= 22
     --shared-zstd \
+    --shared \
+    --libdir=%_lib \
 %endif
 %if %{node_version_number} >= 16 && (0%{?suse_version} > 1550 || 
0%{?sle_version} >= 150400)
     --openssl-default-cipher-list=PROFILE=SYSTEM \
@@ -612,6 +619,11 @@
 . ./spec.build.config
 
 decoupled_cmd %make_install %{?_smp_mflags}
+
+pushd %{buildroot}%{_libdir}
+ln -s libnode.so.* %{buildroot}%{_libdir}/libnode.so
+popd
+
 rm %{buildroot}%{_datadir}/doc/node/gdbinit
 rm -f %{buildroot}%{_datadir}/doc/node/lldbinit
 rm -f %{buildroot}%{_datadir}/doc/node/lldb_commands.py
@@ -710,6 +722,7 @@
 
 export CI_JS_SUITES=default
 export NODE_TEST_NO_INTERNET=1
+export LD_LIBRARY_PATH=%{buildroot}%{_libdir}
 
 %ifarch %{ix86} %{arm}
 rm -f test/parallel/test-fs-utimes-y2K38.js
@@ -802,6 +815,7 @@
 %dir %{_datadir}/libalternatives/node
 %{_datadir}/libalternatives/node/%{node_version_number}.conf
 %{_bindir}/node%{node_version_number}
+%{_libdir}/libnode.so.*
 %{_mandir}/man1/node%{node_version_number}.1%{ext_man}
 %if ! 0%{with libalternatives}
 %ghost %{_bindir}/node-default
@@ -844,6 +858,7 @@
 %files devel
 %defattr(-, root, root)
 %{_includedir}/node%{node_version_number}
+%{_libdir}/libnode.so
 %if %{node_version_number} < 19
 %dir %{_datadir}/systemtap
 %dir %{_datadir}/systemtap/tapset

++++++ SHASUMS256.txt ++++++
--- /var/tmp/diff_new_pack.ugfhMK/_old  2026-08-26 19:55:45.019036752 +0200
+++ /var/tmp/diff_new_pack.ugfhMK/_new  2026-08-26 19:55:45.024036929 +0200
@@ -1,33 +1,33 @@
-0bafe816b17bcaee285e79e325b7a44eea605d12d81b2caa78cddcadf5d1b5f6  
node-v26.5.1-aix-ppc64.tar.gz
-01875f52263953ad81972d304263f36a71e5e97873fa9fa60989e8973d18d00b  
node-v26.5.1-arm64.msi
-f4387df0b46556516d19abf2f2d6806481ac8368aa7f9d96bafed422a56a1d01  
node-v26.5.1-darwin-arm64.tar.gz
-f4665a1e764653ec6fe7686309e8907e9ebb9ba68c4b88b9185fdc29f221559b  
node-v26.5.1-darwin-arm64.tar.xz
-077d5c936868dab19d21f77f1e71ce13697e80b3e86a399dcab238902a2ebf93  
node-v26.5.1-darwin-x64.tar.gz
-4436be8db0e2bd5ca3dee8c48aa8a157c9a8fef99580036ff1da8ef6aba44708  
node-v26.5.1-darwin-x64.tar.xz
-598a3139679db65461f8af50463d668008eaee5e0d09df4eeaa27f3eeefecc03  
node-v26.5.1-headers.tar.gz
-f72d24a5a34b40ba738f6d28cdcd50e3f4976558d4f14bebfa64fdbdcfc4951a  
node-v26.5.1-headers.tar.xz
-21194bbf41c18d9ec277545c4d14cce8597d57a9d9f494c323d8121a25de33e8  
node-v26.5.1-linux-arm64.tar.gz
-0b6b0cc2a1eecbe736f9918de8b5a6c9a48d286b88bec1298a3c1e3376182ea8  
node-v26.5.1-linux-arm64.tar.xz
-cf518dd2772ea7e5046daf4a4ba9e348fce01e2b9741f32ba21b4bbd87b8dfaf  
node-v26.5.1-linux-ppc64le.tar.gz
-692d0c45896bf232e22b8b64a4a826ed0a70fec75545f208d120c109d0a86752  
node-v26.5.1-linux-ppc64le.tar.xz
-af5a58fca0c3fc130c6a649bd6c29f4b000145055eb7a364bde189abdf1516f5  
node-v26.5.1-linux-s390x.tar.gz
-ff4635062f82308dda7c7164337ad9bb383568dac984ff64b35b888e7d7a4ef3  
node-v26.5.1-linux-s390x.tar.xz
-2b07f09c218d473a26442bff5a90151f53f7b7c0a23bad244eda2c26303a2ba7  
node-v26.5.1-linux-x64.tar.gz
-cc7b3484ade63bd203a9d304f21ec37a3b622b988d7bdecf1dc4d68fc44a91b7  
node-v26.5.1-linux-x64.tar.xz
-a6e6cfdb0af6d7d68b50a6f663b8ff321923089309076ea7943a19dbe5eb662a  
node-v26.5.1-win-arm64.7z
-467f425228a2fdcc83a330f5f38b124b5b43b42f5033d7848b4e47c9becc36f9  
node-v26.5.1-win-arm64.zip
-0c8a1a3604e57400432089cf7e179eac4f25b26445a156aaa98cca5619e50f5c  
node-v26.5.1-win-x64.7z
-c432c996b95cbf7568f13a0fbb37526de84a27e3a5c520c3be15f05a9a168212  
node-v26.5.1-win-x64.zip
-826a4551bb9d3c00c61c17a2521a1e901ac7304e3090a3c2d07c1e0fe2b4d60d  
node-v26.5.1-x64.msi
-ae175856e12aadc081a539af37a70a71d3233b2e710fa00266137e23e24faca2  
node-v26.5.1.pkg
-1143281232fc4640188aaa20afb0f9c4f06031f554cd3f1e5ac86e8a0387511a  
node-v26.5.1.tar.gz
-df7770a9a99346f8b73ba6d31ad89bd6f868b51c7387c3627dcb44ca065f4948  
node-v26.5.1.tar.xz
-c6ca33154ee426f46e02aa9f5676d69b768808b564aa22652fe18bb08c188fe5  
win-arm64/node.exe
+6a26e53441fb7e1097fa0b19616000a030a9b96156eb15a0fe22682cfdf19ad2  
node-v26.7.0-aix-ppc64.tar.gz
+1c0b19dbbdc485aae6a2a43a647c94ba3b75cb5f191d154f6798344fc84721e3  
node-v26.7.0-arm64.msi
+7ee659a7768e641bbfd5360940660b8e8fd0052f77488f365562bac522fc15d4  
node-v26.7.0-darwin-arm64.tar.gz
+595d2f934e081b82961d1a5fd41c6dbd0c5a952d9e8be5b4566ab754426968d2  
node-v26.7.0-darwin-arm64.tar.xz
+f279d1ed28ce57f7788bf23435d2ad7fdd7438904ad5c4d8a1081a7cde3d4b96  
node-v26.7.0-darwin-x64.tar.gz
+bd19c6b98d923fb049f64b547163b9f7d52ae73f16fdee09ecef9ab248c4d6ff  
node-v26.7.0-darwin-x64.tar.xz
+00ef24b4724342592aa7a14f9105282a59a7397c8ff7a28166243f5029ce2217  
node-v26.7.0-headers.tar.gz
+453153ebefe7999965211df9ad3029f99a3c57b89eded9862e17be7ee0aaf1ba  
node-v26.7.0-headers.tar.xz
+925aa6157dd37542d0d7f2e28b7bf61e7b39284411210b0498bc3788db4aef68  
node-v26.7.0-linux-arm64.tar.gz
+afc7a004018485092ac8985b817b0d5684472bd9472e0b57d2ab88737e50090d  
node-v26.7.0-linux-arm64.tar.xz
+b41dfc68169e20e54d79e0b0443d0acf5b652535a4010a3258d6ddb1d118d914  
node-v26.7.0-linux-ppc64le.tar.gz
+c3f7cd5c9e149dce1f5955b182c21468ffa20f602aba863ca93cb198b76c07ea  
node-v26.7.0-linux-ppc64le.tar.xz
+c335e3a78ff723f36c17929390d1bd4003f267befba12c92764acbf6a37267ee  
node-v26.7.0-linux-s390x.tar.gz
+ff3a5c7b93a2ec4c6188ed9992495363a22892853db7ce466b57ce55119d20f4  
node-v26.7.0-linux-s390x.tar.xz
+bd6b6c31e377bad9ad579bed72e5bc11f4c879ac9452ad51d30e646ea3d828df  
node-v26.7.0-linux-x64.tar.gz
+982aa24dd8be4c889c6a8ab337ddff3b0896645b20f4239356e80552c16277ee  
node-v26.7.0-linux-x64.tar.xz
+a1d534dcb6c060f486d88e126318657725569da9d30cbb47a26ef6cf0d5afa60  
node-v26.7.0-win-arm64.7z
+be8775204cfceca5a73c30f91bf0de5e85274c01b776dc13f16b91aa251ebb01  
node-v26.7.0-win-arm64.zip
+073be1a597ff9f0130b067fb35eb84225d3970fdd7a84ee898f4b6270aadec0f  
node-v26.7.0-win-x64.7z
+d3bd72755141ed32bbcd841228ee81897c8a98d50dfa7dae2179399a0a7c90f8  
node-v26.7.0-win-x64.zip
+28dd9d5e53f829a32310a4fed334000a1681a7534641c599d05617f893c06a2b  
node-v26.7.0-x64.msi
+18a470bd132cb3b135455304ae7c86aea23bdd7dce9af5d2fc257ddd2f9a9943  
node-v26.7.0.pkg
+e7feefd8d65781c9bbca1a128f8c80b357275156e6e15a3ed32cb7992035bdb2  
node-v26.7.0.tar.gz
+e6b182cbeeab032d1082ca4ac4fe15e3a57de691d3bde78ecf8a761fd56ee356  
node-v26.7.0.tar.xz
+ed13b0ca216ef8d9e8a1781cf26e95ec7f56983d25beaf46b01cb472132d8e80  
win-arm64/node.exe
 c01ce0d5e4e956f0e5e73cdba925d15a6d6f86883aa49f8f0b0de87aa93508ce  
win-arm64/node.lib
-83961c8a59f1771a2e0ffcf89487b3fa0a7ca18a69f1061683c27671b36665e5  
win-arm64/node_pdb.7z
-7b40fa280b35d3aef700852220075f262a25c4cdd9a6f90fb8a3a4b1bed9cf8b  
win-arm64/node_pdb.zip
-b48b0224081224cda1f49374e2fc63d143041ade51754f0cc6608fe8510ba29e  
win-x64/node.exe
+ca037cb8e6ee9029cd5059ad61c1aedf5e7910ba08fa6c6faac2d4f46a7fcb22  
win-arm64/node_pdb.7z
+5fa0b2b4656f3ccf3e4c0724a5fb8dec73ce34857a47e7921f969de16ed20e25  
win-arm64/node_pdb.zip
+e921fe5307e29bf6fd00000dd594356affd3a7b044e52720c7f10decbdc305b9  
win-x64/node.exe
 56f06350037085fce04930befd98327afc86ee46f52af6f6f8a68a03630e8380  
win-x64/node.lib
-cbd18315c40cb831d1a398c0df64a43876999e77eb56b52589b64ee8a5bf93d0  
win-x64/node_pdb.7z
-fb3b232e033a25d0aae20c0413589569688807471e98a1620ef7f7ec959fbf83  
win-x64/node_pdb.zip
+c88a9b921f1fd208c2988c5a927d147a3e1dc780549b4f214a18019fec9179c8  
win-x64/node_pdb.7z
+1b226fa023bdca9c29d93f908eb1ffc32eb43744840eae5b3dd0a940e281429c  
win-x64/node_pdb.zip
 

++++++ SHASUMS256.txt.sig ++++++
Binary files /var/tmp/diff_new_pack.ugfhMK/_old and 
/var/tmp/diff_new_pack.ugfhMK/_new differ

++++++ _scmsync.obsinfo ++++++
--- /var/tmp/diff_new_pack.ugfhMK/_old  2026-08-26 19:55:45.127040566 +0200
+++ /var/tmp/diff_new_pack.ugfhMK/_new  2026-08-26 19:55:45.136040884 +0200
@@ -1,6 +1,6 @@
-mtime: 1785512532
-commit: 10a80b222b7bb32dde8050f3c4136021153459322528c63d4f3a05030fead613
+mtime: 1787738537
+commit: 28b3eaf1e60d4baa367ed93c476851a99b32521593446561096152c66d2e07a7
 url: https://src.opensuse.org/nodejs/nodejs26
-revision: 10a80b222b7bb32dde8050f3c4136021153459322528c63d4f3a05030fead613
+revision: 28b3eaf1e60d4baa367ed93c476851a99b32521593446561096152c66d2e07a7
 projectscmsync: https://src.opensuse.org/nodejs/_ObsPrj.git
 

++++++ build.specials.obscpio ++++++

++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore      1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore      2026-08-26 12:02:17.000000000 +0200
@@ -0,0 +1,8 @@
+*.obscpio
+*.osc
+_build.*
+.pbuild
+.assets
+*.obsinfo
+_service:*
+nodejs26-*-build/

++++++ fix_ci_tests.patch ++++++
--- /var/tmp/diff_new_pack.ugfhMK/_old  2026-08-26 19:55:45.376049361 +0200
+++ /var/tmp/diff_new_pack.ugfhMK/_new  2026-08-26 19:55:45.383049608 +0200
@@ -2,10 +2,10 @@
 Date: Dec 20 09:18:49 UTC 2017
 Summary: Fix CI unit tests framework for OBS building
 
-Index: node-v26.2.0/test/parallel/test-module-loading-globalpaths.js
+Index: node-v26.7.0/test/parallel/test-module-loading-globalpaths.js
 ===================================================================
---- node-v26.2.0.orig/test/parallel/test-module-loading-globalpaths.js
-+++ node-v26.2.0/test/parallel/test-module-loading-globalpaths.js
+--- node-v26.7.0.orig/test/parallel/test-module-loading-globalpaths.js
++++ node-v26.7.0/test/parallel/test-module-loading-globalpaths.js
 @@ -11,6 +11,9 @@ const { addLibraryPath } = require('../c
  
  addLibraryPath(process.env);
@@ -16,10 +16,10 @@
  if (process.argv[2] === 'child') {
    console.log(require(pkgName).string);
  } else {
-Index: node-v26.2.0/test/parallel/test-tls-passphrase.js
+Index: node-v26.7.0/test/parallel/test-tls-passphrase.js
 ===================================================================
---- node-v26.2.0.orig/test/parallel/test-tls-passphrase.js
-+++ node-v26.2.0/test/parallel/test-tls-passphrase.js
+--- node-v26.7.0.orig/test/parallel/test-tls-passphrase.js
++++ node-v26.7.0/test/parallel/test-tls-passphrase.js
 @@ -223,7 +223,7 @@ server.listen(0, common.mustCall(functio
    }, onSecureConnect());
  })).unref();
@@ -29,10 +29,10 @@
  
  // Missing passphrase
  assert.throws(function() {
-Index: node-v26.2.0/test/parallel/test-repl-envvars.js
+Index: node-v26.7.0/test/parallel/test-repl-envvars.js
 ===================================================================
---- node-v26.2.0.orig/test/parallel/test-repl-envvars.js
-+++ node-v26.2.0/test/parallel/test-repl-envvars.js
+--- node-v26.7.0.orig/test/parallel/test-repl-envvars.js
++++ node-v26.7.0/test/parallel/test-repl-envvars.js
 @@ -3,6 +3,8 @@
  // Flags: --expose-internals
  
@@ -42,10 +42,10 @@
  const stream = require('stream');
  const { describe, test } = require('node:test');
  const REPL = require('internal/repl');
-Index: node-v26.2.0/Makefile
+Index: node-v26.7.0/Makefile
 ===================================================================
---- node-v26.2.0.orig/Makefile
-+++ node-v26.2.0/Makefile
+--- node-v26.7.0.orig/Makefile
++++ node-v26.7.0/Makefile
 @@ -414,7 +414,6 @@ ADDONS_HEADERS_PREREQS := tools/install.
        $(wildcard deps/uv/include/*/*.h) \
        $(wildcard deps/v8/include/*.h) \
@@ -72,10 +72,10 @@
                echo "Skipping tools/doc/node_modules (no crypto and/or no 
ICU)"; \
        else \
                cd tools/doc && $(call available-node,$(run-npm-ci)) \
-Index: node-v26.2.0/tools/test.py
+Index: node-v26.7.0/tools/test.py
 ===================================================================
---- node-v26.2.0.orig/tools/test.py
-+++ node-v26.2.0/tools/test.py
+--- node-v26.7.0.orig/tools/test.py
++++ node-v26.7.0/tools/test.py
 @@ -1400,7 +1400,7 @@ def BuildOptions():
    result.add_argument("-s", "--suite", help="A test suite",
        default=[], action="append")
@@ -85,10 +85,10 @@
    result.add_argument("--arch", help='The architecture to run tests for',
        default='none')
    result.add_argument("--snapshot", help="Run the tests with snapshot turned 
on",
-Index: node-v26.2.0/test/parallel/test-crypto-dh.js
+Index: node-v26.7.0/test/parallel/test-crypto-dh.js
 ===================================================================
---- node-v26.2.0.orig/test/parallel/test-crypto-dh.js
-+++ node-v26.2.0/test/parallel/test-crypto-dh.js
+--- node-v26.7.0.orig/test/parallel/test-crypto-dh.js
++++ node-v26.7.0/test/parallel/test-crypto-dh.js
 @@ -93,7 +93,7 @@ const {
        dh3.computeSecret('');
      }, { message: process.features.openssl_is_boringssl ?
@@ -98,10 +98,10 @@
    }
  }
  
-Index: node-v26.2.0/test/parallel/test-dns.js
+Index: node-v26.7.0/test/parallel/test-dns.js
 ===================================================================
---- node-v26.2.0.orig/test/parallel/test-dns.js
-+++ node-v26.2.0/test/parallel/test-dns.js
+--- node-v26.7.0.orig/test/parallel/test-dns.js
++++ node-v26.7.0/test/parallel/test-dns.js
 @@ -451,7 +451,7 @@ assert.throws(() => {
  
    const server = dgram.createSocket('udp4');
@@ -111,10 +111,10 @@
      const parsed = dnstools.parseDNSPacket(msg);
      const domain = parsed.questions[0].domain;
      assert.strictEqual(domain, 'example.org');
-Index: node-v26.2.0/test/wpt/test-webcrypto.js
+Index: node-v26.7.0/test/wpt/test-webcrypto.js
 ===================================================================
---- node-v26.2.0.orig/test/wpt/test-webcrypto.js
-+++ node-v26.2.0/test/wpt/test-webcrypto.js
+--- node-v26.7.0.orig/test/wpt/test-webcrypto.js
++++ node-v26.7.0/test/wpt/test-webcrypto.js
 @@ -1,7 +1,8 @@
  'use strict';
  
@@ -125,10 +125,10 @@
    common.skip('missing crypto');
  
  const { WPTRunner } = require('../common/wpt');
-Index: node-v26.2.0/test/parallel/test-sqlite.js
+Index: node-v26.7.0/test/parallel/test-sqlite.js
 ===================================================================
---- node-v26.2.0.orig/test/parallel/test-sqlite.js
-+++ node-v26.2.0/test/parallel/test-sqlite.js
+--- node-v26.7.0.orig/test/parallel/test-sqlite.js
++++ node-v26.7.0/test/parallel/test-sqlite.js
 @@ -243,6 +243,7 @@ suite('SQL APIs enabled at build time',
    });
  
@@ -153,10 +153,10 @@
      const db = new DatabaseSync(':memory:');
      db.exec(`
        CREATE VIRTUAL TABLE t1 USING geopoly(a,b,c);
-Index: node-v26.2.0/test/parallel/test-internal-util-construct-sab.js
+Index: node-v26.7.0/test/parallel/test-internal-util-construct-sab.js
 ===================================================================
---- node-v26.2.0.orig/test/parallel/test-internal-util-construct-sab.js
-+++ node-v26.2.0/test/parallel/test-internal-util-construct-sab.js
+--- node-v26.7.0.orig/test/parallel/test-internal-util-construct-sab.js
++++ node-v26.7.0/test/parallel/test-internal-util-construct-sab.js
 @@ -1,7 +1,6 @@
  // Flags: --enable-sharedarraybuffer-per-context --expose-internals
  'use strict';
@@ -165,11 +165,11 @@
  const assert = require('assert');
  const { kMaxLength } = require('buffer');
  const { isSharedArrayBuffer } = require('util/types');
-Index: node-v26.2.0/test/common/index.js
+Index: node-v26.7.0/test/common/index.js
 ===================================================================
---- node-v26.2.0.orig/test/common/index.js
-+++ node-v26.2.0/test/common/index.js
-@@ -968,6 +968,7 @@ function resolveBuiltBinary(binary) {
+--- node-v26.7.0.orig/test/common/index.js
++++ node-v26.7.0/test/common/index.js
+@@ -1003,6 +1003,7 @@ function resolveBuiltBinary(binary) {
  
  const common = {
    allowGlobals,
@@ -177,10 +177,10 @@
    buildType,
    canCreateSymLink,
    childShouldThrowAndAbort,
-Index: node-v26.2.0/test/common/index.mjs
+Index: node-v26.7.0/test/common/index.mjs
 ===================================================================
---- node-v26.2.0.orig/test/common/index.mjs
-+++ node-v26.2.0/test/common/index.mjs
+--- node-v26.7.0.orig/test/common/index.mjs
++++ node-v26.7.0/test/common/index.mjs
 @@ -5,6 +5,7 @@ const common = require('./index.js');
  
  const {
@@ -189,4 +189,40 @@
    buildType,
    canCreateSymLink,
    childShouldThrowAndAbort,
+Index: node-v26.7.0/test/common/shared-lib-util.js
+===================================================================
+--- node-v26.7.0.orig/test/common/shared-lib-util.js
++++ node-v26.7.0/test/common/shared-lib-util.js
+@@ -1,6 +1,7 @@
+ 'use strict';
+ const common = require('../common');
+ const path = require('path');
++const fs = require('fs');
+ 
+ const kNodeShared = Boolean(process.config.variables.node_shared);
+ const kShlibSuffix = process.config.variables.shlib_suffix;
+@@ -35,6 +36,23 @@ function getSharedLibPath() {
+   if (common.isWindows) {
+     return path.join(kExecPath, 'node.dll');
+   }
++
++  // On Linux/Unix, dynamically find the real loaded library path from the 
process memory map
++  try {
++    const maps = fs.readFileSync('/proc/self/maps', 'utf8');
++    const targetLib = `libnode.${kShlibSuffix}`;
++    for (const line of maps.split('\n')) {
++      if (line.includes(targetLib)) {
++        const match = line.match(/(\/\S+)/);
++        if (match) {
++          return match[1];
++        }
++      }
++    }
++  } catch {
++    // Graceful fallback if /proc/self/maps is unavailable
++  }
++
+   return path.join(kExecPath, `libnode.${kShlibSuffix}`);
+ }
+ 
 

++++++ ip-address.patch ++++++
Index: node-v24.18.1/deps/npm/node_modules/ip-address/dist/common.js
===================================================================
--- node-v24.18.1.orig/deps/npm/node_modules/ip-address/dist/common.js
+++ node-v24.18.1/deps/npm/node_modules/ip-address/dist/common.js
@@ -1,20 +1,43 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.isInSubnet = isInSubnet;
+exports.isHostInSubnet = isHostInSubnet;
 exports.isCorrect = isCorrect;
 exports.prefixLengthFromMask = prefixLengthFromMask;
 exports.numberToPaddedHex = numberToPaddedHex;
 exports.stringToPaddedHex = stringToPaddedHex;
 exports.testBit = testBit;
 const address_error_1 = require("./address-error");
+/**
+ * Returns whether this address's *network* is contained within `address`,
+ * i.e. whether every address this one can represent also falls inside
+ * `address`. A network wider than `address` is not contained in it, so
+ * `10.0.0.0/8` is not in `10.0.0.0/16`.
+ *
+ * To ask whether the address itself falls inside a range, ignoring any CIDR
+ * suffix it was written with, use {@link isHostInSubnet} instead. That is the
+ * question the special-use classifiers ask.
+ */
 function isInSubnet(address) {
     if (this.subnetMask < address.subnetMask) {
         return false;
     }
-    if (this.mask(address.subnetMask) === address.mask()) {
-        return true;
-    }
-    return false;
+    return isHostInSubnet.call(this, address);
+}
+/**
+ * Returns whether this address's host bits fall inside `address`, ignoring
+ * this address's own subnet mask.
+ *
+ * This is the primitive the special-use classifiers (`isLoopback`,
+ * `isPrivate`, `isLinkLocal`, `getType`, …) are built on: they answer a
+ * question about the address, so the answer must not change with the CIDR
+ * suffix the caller happened to write. Use this rather than
+ * {@link isInSubnet} when classifying a single address — notably when the
+ * address came from untrusted input and the result backs a trust-boundary
+ * decision such as an SSRF allow/deny filter.
+ */
+function isHostInSubnet(address) {
+    return this.mask(address.subnetMask) === address.mask();
 }
 function isCorrect(defaultBits) {
     return function () {
Index: node-v24.18.1/deps/npm/node_modules/ip-address/dist/ipv4.js
===================================================================
--- node-v24.18.1.orig/deps/npm/node_modules/ip-address/dist/ipv4.js
+++ node-v24.18.1/deps/npm/node_modules/ip-address/dist/ipv4.js
@@ -35,6 +35,7 @@ const isCorrect4 = common.isCorrect(cons
  */
 class Address4 {
     constructor(address) {
+        this.addressMinusSuffix = '';
         this.groups = constants.GROUPS;
         this.parsedAddress = [];
         this.parsedSubnet = '';
@@ -51,6 +52,13 @@ class Address4 {
          * @returns {boolean}
          */
         this.isInSubnet = common.isInSubnet;
+        /**
+         * Returns true if this address's host bits fall inside the given 
subnet,
+         * ignoring this address's own subnet mask. See
+         * {@link common.isHostInSubnet}.
+         * @returns {boolean}
+         */
+        this.isHostInSubnet = common.isHostInSubnet;
         this.address = address;
         const subnet = constants.RE_SUBNET_STRING.exec(address);
         if (subnet) {
@@ -403,49 +411,49 @@ class Address4 {
      * @returns {boolean}
      */
     isMulticast() {
-        return this.isInSubnet(MULTICAST_V4);
+        return this.isHostInSubnet(MULTICAST_V4);
     }
     /**
      * Returns true if the address is in one of the [RFC 
1918](https://datatracker.ietf.org/doc/html/rfc1918) private address ranges 
(`10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16`).
      * @returns {boolean}
      */
     isPrivate() {
-        return PRIVATE_V4.some((subnet) => this.isInSubnet(subnet));
+        return PRIVATE_V4.some((subnet) => this.isHostInSubnet(subnet));
     }
     /**
      * Returns true if the address is in the loopback range `127.0.0.0/8` 
([RFC 1122](https://datatracker.ietf.org/doc/html/rfc1122)).
      * @returns {boolean}
      */
     isLoopback() {
-        return this.isInSubnet(LOOPBACK_V4);
+        return this.isHostInSubnet(LOOPBACK_V4);
     }
     /**
      * Returns true if the address is in the link-local range `169.254.0.0/16` 
([RFC 3927](https://datatracker.ietf.org/doc/html/rfc3927)).
      * @returns {boolean}
      */
     isLinkLocal() {
-        return this.isInSubnet(LINK_LOCAL_V4);
+        return this.isHostInSubnet(LINK_LOCAL_V4);
     }
     /**
      * Returns true if the address is the unspecified address `0.0.0.0`.
      * @returns {boolean}
      */
     isUnspecified() {
-        return this.isInSubnet(UNSPECIFIED_V4);
+        return this.isHostInSubnet(UNSPECIFIED_V4);
     }
     /**
      * Returns true if the address is the limited broadcast address 
`255.255.255.255` ([RFC 919](https://datatracker.ietf.org/doc/html/rfc919)).
      * @returns {boolean}
      */
     isBroadcast() {
-        return this.isInSubnet(BROADCAST_V4);
+        return this.isHostInSubnet(BROADCAST_V4);
     }
     /**
      * Returns true if the address is in the carrier-grade NAT range 
`100.64.0.0/10` ([RFC 6598](https://datatracker.ietf.org/doc/html/rfc6598)).
      * @returns {boolean}
      */
     isCGNAT() {
-        return this.isInSubnet(CGNAT_V4);
+        return this.isHostInSubnet(CGNAT_V4);
     }
     /**
      * Returns a zero-padded base-2 string representation of the address
@@ -463,7 +471,7 @@ class Address4 {
      */
     groupForV6() {
         const segments = this.parsedAddress;
-        return this.address.replace(constants.RE_ADDRESS, `<span 
class="hover-group group-v4 group-6">${segments
+        return this.correctForm().replace(constants.RE_ADDRESS, `<span 
class="hover-group group-v4 group-6">${segments
             .slice(0, 2)
             .join('.')}</span>.<span class="hover-group group-v4 
group-7">${segments
             .slice(2, 4)
Index: node-v24.18.1/deps/npm/node_modules/ip-address/dist/ipv6.js
===================================================================
--- node-v24.18.1.orig/deps/npm/node_modules/ip-address/dist/ipv6.js
+++ node-v24.18.1/deps/npm/node_modules/ip-address/dist/ipv6.js
@@ -98,6 +98,13 @@ class Address6 {
          */
         this.isInSubnet = common.isInSubnet;
         /**
+         * Returns true if this address's host bits fall inside the given 
subnet,
+         * ignoring this address's own subnet mask. See
+         * {@link common.isHostInSubnet}.
+         * @returns {boolean}
+         */
+        this.isHostInSubnet = common.isHostInSubnet;
+        /**
          * Returns true if the address is correct, false otherwise
          * @returns {boolean}
          */
@@ -184,9 +191,11 @@ class Address6 {
         let host;
         let port = null;
         let result;
+        // Remove the protocol prefix, if any
+        const stripped = url.replace(/^[a-z][a-z0-9+.-]*:\/\//i, '');
         // If we have brackets parse them and find a port
-        if (url.indexOf('[') !== -1 && url.indexOf(']:') !== -1) {
-            result = constants6.RE_URL_WITH_PORT.exec(url);
+        if (stripped.indexOf('[') !== -1 && stripped.indexOf(']:') !== -1) {
+            result = constants6.RE_URL_WITH_PORT.exec(stripped);
             if (result === null) {
                 return {
                     error: 'failed to parse address with port',
@@ -196,13 +205,9 @@ class Address6 {
             }
             host = result[1];
             port = result[2];
-            // If there's a URL extract the address
         }
-        else if (url.indexOf('/') !== -1) {
-            // Remove the protocol prefix
-            url = url.replace(/^[a-z0-9]+:\/\//, '');
-            // Parse the address
-            result = constants6.RE_URL.exec(url);
+        else {
+            result = constants6.RE_URL.exec(stripped);
             if (result === null) {
                 return {
                     error: 'failed to parse address from URL',
@@ -210,11 +215,7 @@ class Address6 {
                     port: null,
                 };
             }
-            host = result[1];
-            // Otherwise just assign the URL to the host and let the library 
parse it
-        }
-        else {
-            host = url;
+            host = result[1] ?? result[2];
         }
         // If there's a port convert it to an integer
         if (port) {
@@ -493,7 +494,7 @@ class Address6 {
     getType() {
         for (let i = 0; i < TYPE_SUBNETS.length; i++) {
             const entry = TYPE_SUBNETS[i];
-            if (this.isInSubnet(entry[0])) {
+            if (this.isHostInSubnet(entry[0])) {
                 return entry[1];
             }
         }
@@ -638,7 +639,8 @@ class Address6 {
         const address4 = lastGroup.match(constants4.RE_ADDRESS);
         if (address4) {
             this.parsedAddress4 = address4[0];
-            this.address4 = new ipv4_1.Address4(this.parsedAddress4);
+            const v4Suffix = this.subnetMask >= 96 ? `/${this.subnetMask - 
96}` : '';
+            this.address4 = new 
ipv4_1.Address4(`${this.parsedAddress4}${v4Suffix}`);
             for (let i = 0; i < this.address4.groups; i++) {
                 if (/^0[0-9]+/.test(this.address4.parsedAddress[i])) {
                     // The prefix groups haven't been through the 
bad-character check
@@ -734,7 +736,11 @@ class Address6 {
         return BigInt(`0x${this.parsedAddress.map(paddedHex).join('')}`);
     }
     /**
-     * Return the last two groups of this address as an IPv4 address string
+     * Return the last two groups of this address as an IPv4 address string.
+     * If this address carries a CIDR prefix that covers the trailing 32 bits
+     * (i.e. `subnetMask >= 96`), the resulting `Address4` inherits the
+     * corresponding v4 prefix (`subnetMask - 96`); otherwise it defaults to
+     * `/32`.
      * @returns {Address4}
      * @example
      * var address = new Address6('2001:4860:4001::1825:bf11');
@@ -742,7 +748,16 @@ class Address6 {
      */
     to4() {
         const binary = this.binaryZeroPad().split('');
-        return ipv4_1.Address4.fromHex(BigInt(`0b${binary.slice(96, 
128).join('')}`).toString(16).padStart(8, '0'));
+        const hex = BigInt(`0b${binary.slice(96, 
128).join('')}`).toString(16).padStart(8, '0');
+        if (this.subnetMask >= 96) {
+            const v4Mask = this.subnetMask - 96;
+            const groups = [];
+            for (let i = 0; i < 8; i += 2) {
+                groups.push(parseInt(hex.slice(i, i + 2), 16));
+            }
+            return new ipv4_1.Address4(`${groups.join('.')}/${v4Mask}`);
+        }
+        return ipv4_1.Address4.fromHex(hex);
     }
     /**
      * Return the v4-in-v6 form of the address
@@ -756,7 +771,7 @@ class Address6 {
         if (!/:$/.test(correct)) {
             infix = ':';
         }
-        return correct + infix + address4.address;
+        return correct + infix + address4.correctForm();
     }
     /**
      * Decodes the Teredo tunneling fields embedded in this address. Returns 
the
@@ -902,7 +917,7 @@ class Address6 {
         if (pl !== 32 && pl !== 40 && pl !== 48 && pl !== 56 && pl !== 64 && 
pl !== 96) {
             throw new address_error_1.AddressError('NAT64 prefix length must 
be 32, 40, 48, 56, 64, or 96');
         }
-        if (!this.isInSubnet(prefix6)) {
+        if (!this.isHostInSubnet(prefix6)) {
             return null;
         }
         const bits = this.binaryZeroPad();
@@ -982,7 +997,11 @@ class Address6 {
      * @returns {boolean}
      */
     isLinkLocal() {
-        // Zeroes are required, i.e. we can't check isInSubnet with 'fe80::/10'
+        const embedded = this.embeddedIPv4();
+        if (embedded) {
+            return embedded.isLinkLocal();
+        }
+        // Zeroes are required, i.e. we can't check isHostInSubnet with 
'fe80::/10'
         if (this.getBitsBase2(0, 64) ===
             
'1111111010000000000000000000000000000000000000000000000000000000') {
             return true;
@@ -994,6 +1013,10 @@ class Address6 {
      * @returns {boolean}
      */
     isMulticast() {
+        const embedded = this.embeddedIPv4();
+        if (embedded) {
+            return embedded.isMulticast();
+        }
         const type = this.getType();
         return type === 'Multicast' || type.startsWith('Multicast ');
     }
@@ -1016,27 +1039,54 @@ class Address6 {
      * @returns {boolean}
      */
     isMapped4() {
-        return this.isInSubnet(IPV4_MAPPED_SUBNET);
+        return this.isHostInSubnet(IPV4_MAPPED_SUBNET);
+    }
+    /**
+     * If this address embeds a routable IPv4 address — i.e. it is IPv4-mapped
+     * (`::ffff:0:0/96`) or sits in the NAT64 well-known prefix 
(`64:ff9b::/96`,
+     * [RFC 6052](https://datatracker.ietf.org/doc/html/rfc6052)) — return that
+     * embedded address as an {@link Address4}; otherwise return null.
+     *
+     * The special-property checks (`isLoopback`, `isLinkLocal`, `isMulticast`,
+     * `isUnspecified`, `isPrivate`, `isCGNAT`, `isBroadcast`) call this first 
and
+     * delegate to the embedded {@link Address4} when present, so a literal 
such as
+     * `::ffff:127.0.0.1` is classified by what it actually reaches (loopback)
+     * rather than by its IPv6 wrapper (which `getType()` reports as 
IPv4-mapped).
+     * This matters wherever the checks back a trust-boundary decision (e.g. an
+     * SSRF allow/deny filter): without normalization, `::ffff:10.0.0.1`,
+     * `::ffff:169.254.169.254`, `64:ff9b::7f00:1`, etc. would all read as
+     * non-internal.
+     * @returns {Address4 | null}
+     */
+    embeddedIPv4() {
+        if (this.isMapped4() || this.isHostInSubnet(NAT64_WELL_KNOWN_SUBNET)) {
+            return this.to4();
+        }
+        return null;
     }
     /**
      * Returns true if the address is a Teredo address, false otherwise
      * @returns {boolean}
      */
     isTeredo() {
-        return this.isInSubnet(TEREDO_SUBNET);
+        return this.isHostInSubnet(TEREDO_SUBNET);
     }
     /**
      * Returns true if the address is a 6to4 address, false otherwise
      * @returns {boolean}
      */
     is6to4() {
-        return this.isInSubnet(SIX_TO_FOUR_SUBNET);
+        return this.isHostInSubnet(SIX_TO_FOUR_SUBNET);
     }
     /**
      * Returns true if the address is a loopback address, false otherwise
      * @returns {boolean}
      */
     isLoopback() {
+        const embedded = this.embeddedIPv4();
+        if (embedded) {
+            return embedded.isLoopback();
+        }
         return this.getType() === 'Loopback';
     }
     /**
@@ -1044,13 +1094,64 @@ class Address6 {
      * @returns {boolean}
      */
     isULA() {
-        return this.isInSubnet(ULA_SUBNET);
+        return this.isHostInSubnet(ULA_SUBNET);
+    }
+    /**
+     * Returns true if the address is private, i.e. a Unique Local Address in
+     * `fc00::/7` ([RFC 4193](https://datatracker.ietf.org/doc/html/rfc4193)) 
or an
+     * IPv4-mapped / NAT64 address whose embedded IPv4 address is in one of the
+     * [RFC 1918](https://datatracker.ietf.org/doc/html/rfc1918) private ranges
+     * (e.g. `::ffff:10.0.0.1`). This is the IPv6 counterpart to
+     * {@link Address4.isPrivate}; use it instead of {@link isULA} when you 
need to
+     * catch mapped RFC 1918 addresses as well as native ULAs.
+     * @returns {boolean}
+     */
+    isPrivate() {
+        const embedded = this.embeddedIPv4();
+        if (embedded) {
+            return embedded.isPrivate();
+        }
+        return this.isULA();
+    }
+    /**
+     * Returns true if the address is an IPv4-mapped / NAT64 address whose 
embedded
+     * IPv4 address is in the carrier-grade NAT range `100.64.0.0/10`
+     * ([RFC 6598](https://datatracker.ietf.org/doc/html/rfc6598)), false
+     * otherwise. There is no native IPv6 CGNAT range, so this only ever 
returns
+     * true for an embedded IPv4 address (e.g. `::ffff:100.64.0.1`).
+     * @returns {boolean}
+     */
+    isCGNAT() {
+        const embedded = this.embeddedIPv4();
+        if (embedded) {
+            return embedded.isCGNAT();
+        }
+        return false;
+    }
+    /**
+     * Returns true if the address is an IPv4-mapped / NAT64 address whose 
embedded
+     * IPv4 address is the limited broadcast address `255.255.255.255`
+     * ([RFC 919](https://datatracker.ietf.org/doc/html/rfc919)), false 
otherwise.
+     * There is no IPv6 broadcast, so this only ever returns true for an 
embedded
+     * IPv4 address (e.g. `::ffff:255.255.255.255`).
+     * @returns {boolean}
+     */
+    isBroadcast() {
+        const embedded = this.embeddedIPv4();
+        if (embedded) {
+            return embedded.isBroadcast();
+        }
+        return false;
     }
     /**
      * Returns true if the address is the unspecified address `::`.
      * @returns {boolean}
      */
     isUnspecified() {
+        const embedded = this.embeddedIPv4();
+        if (embedded) {
+            return embedded.isUnspecified();
+        }
         return this.getType() === 'Unspecified';
     }
     /**
@@ -1058,7 +1159,7 @@ class Address6 {
      * @returns {boolean}
      */
     isDocumentation() {
-        return this.isInSubnet(DOCUMENTATION_SUBNET);
+        return this.isHostInSubnet(DOCUMENTATION_SUBNET);
     }
     // #endregion
     // #region HTML
@@ -1214,4 +1315,5 @@ const SIX_TO_FOUR_SUBNET = new Address6(
 const ULA_SUBNET = new Address6('fc00::/7');
 const DOCUMENTATION_SUBNET = new Address6('2001:db8::/32');
 const IPV4_MAPPED_SUBNET = new Address6('::ffff:0:0/96');
+const NAT64_WELL_KNOWN_SUBNET = new Address6('64:ff9b::/96');
 //# sourceMappingURL=ipv6.js.map
\ No newline at end of file
Index: node-v24.18.1/deps/npm/node_modules/ip-address/dist/v6/constants.js
===================================================================
--- node-v24.18.1.orig/deps/npm/node_modules/ip-address/dist/v6/constants.js
+++ node-v24.18.1/deps/npm/node_modules/ip-address/dist/v6/constants.js
@@ -44,6 +44,7 @@ exports.TYPES = {
     'ff05::1:3/128': 'Multicast (All DHCP servers in this site)',
     '::/128': 'Unspecified',
     '::1/128': 'Loopback',
+    '::ffff:0:0/96': 'IPv4-mapped',
     'ff00::/8': 'Multicast',
     'fe80::/10': 'Link-local unicast',
     'fc00::/7': 'Unique local',
@@ -76,6 +77,6 @@ exports.RE_SUBNET_STRING = /\/\d{1,3}(?=
  * @static
  */
 exports.RE_ZONE_STRING = /%.*$/;
-exports.RE_URL = /^\[{0,1}([0-9a-f:]+)\]{0,1}/;
-exports.RE_URL_WITH_PORT = /\[([0-9a-f:]+)\]:([0-9]{1,5})/;
+exports.RE_URL = /^(?:\[([0-9a-f:.]+)\]|([0-9a-f:.]+))(?:[/?#].*)?$/i;
+exports.RE_URL_WITH_PORT = /^\[([0-9a-f:.]+)\]:([0-9]{1,5})(?:[/?#].*)?$/i;
 //# sourceMappingURL=constants.js.map
\ No newline at end of file
Index: node-v24.18.1/deps/npm/node_modules/ip-address/package.json
===================================================================
--- node-v24.18.1.orig/deps/npm/node_modules/ip-address/package.json
+++ node-v24.18.1/deps/npm/node_modules/ip-address/package.json
@@ -16,7 +16,7 @@
     "bigint",
     "browser"
   ],
-  "version": "10.2.0",
+  "version": "10.2.2",
   "author": "Beau Gunderson <[email protected]> 
(https://beaugunderson.com/)",
   "license": "MIT",
   "main": "dist/ip-address.js",

++++++ maintainer_scripts.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/maintainer_scripts/bundling.sh 
new/maintainer_scripts/bundling.sh
--- old/maintainer_scripts/bundling.sh  2026-07-31 17:42:12.000000000 +0200
+++ new/maintainer_scripts/bundling.sh  2026-08-26 12:02:17.000000000 +0200
@@ -86,10 +86,11 @@
 {
     extract_version_from_string_define ncrypto.h '#define NCRYPTO_VERSION '
 }
-# merged into ngtcp2 packages...
+# merged into ngtcp2 packages... so we need full path as this is called 
directly now
 function load_nghttp3_version
 {
-    extract_version_from_string_define lib/includes/nghttp3/version.h 
'NGHTTP3_VERSION '
+    # extract_version_from_string_define lib/includes/nghttp3/version.h 
'NGHTTP3_VERSION '
+    extract_version_from_string_define 
ngtcp2/nghttp3/lib/includes/nghttp3/version.h 'NGHTTP3_VERSION '
 }
 function load_ngtcp2_version
 {
@@ -207,7 +208,7 @@
         (icu-small)
         load_icu_small_version
         ;;
-        
(ada|brotli|cares|http_parser|LIEF|merve|nbytes|ncrypto|nghttp2|nghttp3|openssl|uv|v8|llhttp|uvwasi|ngtcp2|npm|base64|simdutf|simdjson|zstd):
+        
(ada|brotli|cares|http_parser|LIEF|merve|nbytes|ncrypto|nghttp2|openssl|uv|v8|llhttp|uvwasi|ngtcp2|npm|base64|simdutf|simdjson|zstd):
         load_${PKG}_version
         ;;
         (*):
@@ -221,6 +222,19 @@
         exit 20
     fi
 }
+function load_special_bundled_version
+{
+    local PKG=$1
+    BUNDLED_VERSION=""
+    case $PKG in
+        (nghttp3):
+            load_${PKG}_version
+    esac
+    if [ -z "$BUNDLED_VERSION" ]; then
+        echo "!!! cannot get bundled version for $PKG! FIX!"
+        exit 20
+    fi
+}
 function find_npm_packages
 {
     local IS_NPM_MODE=$1
@@ -284,6 +298,9 @@
 load_bundled_version cares; CARES_VER=$BUNDLED_VERSION
 load_bundled_version icu-small; ICU_VER=$BUNDLED_VERSION
 load_bundled_version nghttp2; NGHTTP2_VER=$BUNDLED_VERSION
+# We load special versions
+load_special_bundled_version nghttp3; NGHTTP3_VER=$BUNDLED_VERSION
+
 NPM_PROVIDES=$(find_npm_packages "node")
 cat <<INNER_EOF > final_replacement_raw.txt
 Provides:       bundled(uvwasi) = $UVWASI_VER
@@ -293,6 +310,7 @@
 Provides:       bundled(merve) = $MERVE_VER
 Provides:       bundled(llhttp) = $LLHTTP_VER
 Provides:       bundled(ngtcp2) = $NGTCP2_VER
+Provides:       bundled(nghttp3) = $NGHTTP3_VER
 Provides:       bundled(simdjson) = $SIMDJSON_VER
 # bundled url-ada parser, not ada
 Provides:       bundled(ada) = $ADA_VER

++++++ no-rpath.patch ++++++
Index: node-v26.6.0/node.gyp
===================================================================
--- node-v26.6.0.orig/node.gyp
+++ node-v26.6.0/node.gyp
@@ -705,13 +705,6 @@
           'xcode_settings': {
             'OTHER_LDFLAGS': [ '-Wl,-rpath,@loader_path', 
'-Wl,-rpath,@loader_path/../lib'],
           },
-          'conditions': [
-            ['OS=="linux" or OS=="openharmony"', {
-               'ldflags': [
-                 '-Wl,-rpath,\\$$ORIGIN/../lib'
-               ],
-            }],
-          ],
         }],
         [ 'enable_lto=="true"', {
           'xcode_settings': {
@@ -1617,12 +1610,7 @@
             'OTHER_LDFLAGS': [ '-Wl,-rpath,@loader_path', ],
           }
         }],
-        ['OS=="linux"', {
-          'ldflags': [
-            '-Wl,-rpath,\\$$ORIGIN'
-          ],
-        }],
-      ],
+     ],
     }, # shared_embedtest
 
     {
Index: node-v26.6.0/tools/gyp/pylib/gyp/generator/make.py
===================================================================
--- node-v26.6.0.orig/tools/gyp/pylib/gyp/generator/make.py
+++ node-v26.6.0/tools/gyp/pylib/gyp/generator/make.py
@@ -1738,12 +1738,7 @@ $(obj).$(TOOLSET)/$(TARGET)/%%.o: $(obj)
                         target_postbuilds[configname] = target_postbuild
                 else:
                     ldflags = config.get("ldflags", [])
-                    # Compute an rpath for this output if needed.
-                    if any(dep.endswith(".so") or ".so." in dep for dep in 
deps):
-                        # We want to get the literal string "$ORIGIN"
-                        # into the link command, so we need lots of escaping.
-                        ldflags.append(r"-Wl,-rpath=\$$ORIGIN/")
-                        ldflags.append(r"-Wl,-rpath-link=\$(builddir)/")
+
                 if library_dirs := config.get("library_dirs", []):
                     library_dirs = [Sourceify(self.Absolutify(i)) for i in 
library_dirs]
                 ldflags += [("-L%s" % library_dir) for library_dir in 
library_dirs]

++++++ no_avx2_on_i586.patch ++++++
===================================================================
Index: node-v26.7.0/deps/histogram/src/hdr_histogram.c
===================================================================
--- node-v26.7.0.orig/deps/histogram/src/hdr_histogram.c
+++ node-v26.7.0/deps/histogram/src/hdr_histogram.c
@@ -36,7 +36,7 @@
 
 /* Runtime-dispatched AVX2 path: keep the rest of this TU at the project's
    baseline ISA so the shipped binary does not silently require AVX2. */
-#if (defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || 
defined(_M_IX86)) \
+#if (defined(__x86_64__) || defined(_M_X64)) \
     && (defined(__GNUC__) || defined(__clang__)) && !defined(__INTEL_COMPILER) 
&& !defined(_MSC_VER)
 #  define HDR_HAS_AVX2_DISPATCH 1
 #  include <immintrin.h>

++++++ node-v26.5.1.tar.xz -> node-v26.7.0.tar.xz ++++++
/work/SRC/openSUSE:Factory/nodejs26/node-v26.5.1.tar.xz 
/work/SRC/openSUSE:Factory/.nodejs26.new.1258/node-v26.7.0.tar.xz differ: char 
27, line 1

++++++ node_modules.obscpio ++++++
/work/SRC/openSUSE:Factory/nodejs26/node_modules.obscpio 
/work/SRC/openSUSE:Factory/.nodejs26.new.1258/node_modules.obscpio differ: char 
49, line 1


++++++ npm-line-truncation.patch ++++++
Index: node-v26.6.0/deps/npm/lib/base-cmd.js
===================================================================
--- node-v26.6.0.orig/deps/npm/lib/base-cmd.js
+++ node-v26.6.0/deps/npm/lib/base-cmd.js
@@ -104,7 +104,7 @@ class BaseCommand {
         fullUsage.push('')
         for (const def of cmdDefs) {
           if (def.description) {
-            const desc = def.description.trim().split('\n')[0]
+            const desc = 
def.description.split('\n\n')[0].trim().replace(/\s+/g, ' ')
             const shortcuts = def.short ? `-${def.short}` : ''
             const aliases = (def.alias || []).map(v => `--${v}`).join('|')
             const mainFlag = `--${def.key}`

++++++ versioned.patch ++++++
--- /var/tmp/diff_new_pack.ugfhMK/_old  2026-08-26 19:55:45.720061510 +0200
+++ /var/tmp/diff_new_pack.ugfhMK/_new  2026-08-26 19:55:45.725061686 +0200
@@ -18,11 +18,11 @@
  tools/test.py                          |    2 +-
  7 files changed, 28 insertions(+), 27 deletions(-)
 
-Index: node-v26.4.0/Makefile
+Index: node-v26.6.0/Makefile
 ===================================================================
---- node-v26.4.0.orig/Makefile 2026-06-29 17:19:15.696302706 +0200
-+++ node-v26.4.0/Makefile      2026-06-29 17:19:33.819512691 +0200
-@@ -77,7 +77,7 @@
+--- node-v26.6.0.orig/Makefile
++++ node-v26.6.0/Makefile
+@@ -77,7 +77,7 @@ BUILDTYPE_LOWER := $(shell echo $(BUILDT
  EXEEXT := $(shell $(PYTHON) -c \
                "import sys; print('.exe' if sys.platform == 'win32' else '')")
  
@@ -31,10 +31,10 @@
  NODE_G_EXE = node_g$(EXEEXT)
  NPM ?= ./deps/npm/bin/npm-cli.js
  
-Index: node-v26.4.0/doc/node.1
+Index: node-v26.6.0/doc/node.1
 ===================================================================
---- node-v26.4.0.orig/doc/node.1       2026-06-24 09:02:39.000000000 +0200
-+++ node-v26.4.0/doc/node.1    2026-06-29 17:20:55.538396086 +0200
+--- node-v26.6.0.orig/doc/node.1
++++ node-v26.6.0/doc/node.1
 @@ -10,22 +10,22 @@
  .Dt NODE 1
  .
@@ -62,11 +62,11 @@
  .Op Fl -v8-options
  .
  .Sh DESCRIPTION
-Index: node-v26.4.0/node.gyp
+Index: node-v26.6.0/node.gyp
 ===================================================================
---- node-v26.4.0.orig/node.gyp 2026-06-24 09:02:38.000000000 +0200
-+++ node-v26.4.0/node.gyp      2026-06-29 17:21:28.974035930 +0200
-@@ -7,12 +7,12 @@
+--- node-v26.6.0.orig/node.gyp
++++ node-v26.6.0/node.gyp
+@@ -7,7 +7,7 @@
      'force_dynamic_crt%': 0,
      'node_builtin_modules_path%': '',
      # `node` executable target name.
@@ -75,17 +75,11 @@
      # `libnode` target type, `static_library` if `node_shared` is false and 
`shared_library` if `node_shared` is true.
      'node_lib_type%': 'static_library',
      # `libnode` target name, can be a `static_library` or `shared_library` 
based on `node_shared`.
-     # NOTE: Gyp will prefix this with `lib` if this name does not start with 
`lib`.
--    'node_lib_target_name%': 'libnode',
-+    'node_lib_target_name%': 'libnode26',
-     'node_module_version%': '',
-     'node_no_browser_globals%': 'false',
-     'node_shared_brotli%': 'false',
-Index: node-v26.4.0/src/node_main.cc
-===================================================================
---- node-v26.4.0.orig/src/node_main.cc 2026-06-24 09:02:38.000000000 +0200
-+++ node-v26.4.0/src/node_main.cc      2026-06-29 17:19:33.821512133 +0200
-@@ -94,6 +94,7 @@
+Index: node-v26.6.0/src/node_main.cc
+===================================================================
+--- node-v26.6.0.orig/src/node_main.cc
++++ node-v26.6.0/src/node_main.cc
+@@ -94,6 +94,7 @@ int wmain(int argc, wchar_t* wargv[]) {
  // UNIX
  
  int main(int argc, char* argv[]) {
@@ -93,11 +87,11 @@
    return node::Start(argc, argv);
  }
  #endif
-Index: node-v26.4.0/test/parallel/test-snapshot-warning.js
+Index: node-v26.6.0/test/parallel/test-snapshot-warning.js
 ===================================================================
---- node-v26.4.0.orig/test/parallel/test-snapshot-warning.js   2026-06-24 
09:02:39.000000000 +0200
-+++ node-v26.4.0/test/parallel/test-snapshot-warning.js        2026-06-29 
17:19:33.822641133 +0200
-@@ -60,7 +60,7 @@
+--- node-v26.6.0.orig/test/parallel/test-snapshot-warning.js
++++ node-v26.6.0/test/parallel/test-snapshot-warning.js
+@@ -60,7 +60,7 @@ tmpdir.refresh();
      stderr(output) {
        let match = output.match(/Warning: test warning/g);
        assert.strictEqual(match.length, 1);
@@ -106,7 +100,7 @@
        assert.strictEqual(match.length, 1);
        return true;
      }
-@@ -79,7 +79,7 @@
+@@ -79,7 +79,7 @@ tmpdir.refresh();
        // Warnings should not be handled more than once.
        let match = output.match(/Warning: test warning/g);
        assert.strictEqual(match.length, 1);
@@ -115,7 +109,7 @@
        assert.strictEqual(match.length, 1);
        return true;
      }
-@@ -114,7 +114,7 @@
+@@ -114,7 +114,7 @@ tmpdir.refresh();
    console.log(warningFile1, ':', warnings1);
    let match = warnings1.match(/Warning: test warning/g);
    assert.strictEqual(match.length, 1);
@@ -124,7 +118,7 @@
    assert.strictEqual(match.length, 1);
    fs.rmSync(warningFile1, {
      maxRetries: 3, recursive: false, force: true
-@@ -140,6 +140,6 @@
+@@ -140,6 +140,6 @@ tmpdir.refresh();
    console.log(warningFile2, ':', warnings1);
    match = warnings2.match(/Warning: test warning/g);
    assert.strictEqual(match.length, 1);
@@ -132,11 +126,11 @@
 +  match = warnings2.match(/Use `node26 --trace-warnings/g);
    assert.strictEqual(match.length, 1);
  }
-Index: node-v26.4.0/tools/install.py
+Index: node-v26.6.0/tools/install.py
 ===================================================================
---- node-v26.4.0.orig/tools/install.py 2026-06-29 17:19:20.275004906 +0200
-+++ node-v26.4.0/tools/install.py      2026-06-29 17:19:33.820017142 +0200
-@@ -93,7 +93,7 @@
+--- node-v26.6.0.orig/tools/install.py
++++ node-v26.6.0/tools/install.py
+@@ -93,7 +93,7 @@ def uninstall(options, paths, dest):
      try_remove(options, path, dest)
  
  def package_files(options, action, name, bins):
@@ -145,7 +139,7 @@
  
    # don't install npm if the target path is a symlink, it probably means
    # that a dev version of npm is installed there
-@@ -114,19 +114,19 @@
+@@ -114,19 +114,19 @@ def package_files(options, action, name,
      if action == uninstall:
        action(options, [link_path], os.path.join('bin', bin_name))
      elif action == install:
@@ -169,7 +163,7 @@
  #   Not the default just yet:
  #   'yarn': 'dist/yarn.js',
  #   'yarnpkg': 'dist/yarn.js',
-@@ -155,7 +155,7 @@
+@@ -155,7 +155,7 @@ def subdir_files(options, path, dest, ac
      action(options, files_in_path, subdir + os.path.sep)
  
  def files(options, action):
@@ -178,7 +172,7 @@
    if options.is_win:
      node_bin += '.exe'
    action(options, [os.path.join(options.build_dir, node_bin)], 
os.path.join('bin', node_bin))
-@@ -206,7 +206,7 @@
+@@ -206,7 +206,7 @@ def files(options, action):
    if 'openbsd' in sys.platform:
      action(options, ['doc/node.1'], 'man/man1/')
    else:
@@ -187,7 +181,7 @@
  
    if 'true' == options.variables.get('node_install_npm'):
      npm_files(options, action)
-@@ -350,28 +350,28 @@
+@@ -350,28 +350,28 @@ def headers(options, action):
      'src/node_buffer.h',
      'src/node_object_wrap.h',
      'src/node_version.h',
@@ -224,11 +218,11 @@
  
    if sys.platform == 'zos':
      zoslibinc = os.environ.get('ZOSLIB_INCLUDES')
-Index: node-v26.4.0/tools/test.py
+Index: node-v26.6.0/tools/test.py
 ===================================================================
---- node-v26.4.0.orig/tools/test.py    2026-06-29 17:19:29.840074939 +0200
-+++ node-v26.4.0/tools/test.py 2026-06-29 17:19:33.821748629 +0200
-@@ -986,7 +986,7 @@
+--- node-v26.6.0.orig/tools/test.py
++++ node-v26.6.0/tools/test.py
+@@ -986,7 +986,7 @@ class Context(object):
      if self.vm is not None:
        return self.vm
      if arch == 'none':

Reply via email to