chore(deps): update dependency zx to v8.8.5 [security] #13029
+3
−24
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
8.3.0->8.8.5GitHub Vulnerability Alerts
CVE-2025-13437
When zx is invoked with --prefer-local=, the CLI creates a symlink named ./node_modules pointing to /node_modules. Due to a logic error in src/cli.ts (linkNodeModules / cleanup), the function returns the target path instead of the alias (symlink path). The later cleanup routine removes what it received, which deletes the target directory itself. Result: zx can delete an external /node_modules outside the current working directory.
Release Notes
google/zx (zx)
v8.8.5: — Temporary ReservoirCompare Source
This release fixes the issue, when zx flushes external
node_moduleson linking #1348 #1349 #1355Also
[email protected]arrives here.v8.8.4: — Flange CouplingCompare Source
It's time. This release updates zx internals to make the
psAPI and related methodsProcessPromise.kill(),kill()work on Windows systems withoutwmic.#1344 webpod/ps#15
https://github.blog/changelog/2025-07-31-github-actions-new-apis-and-windows-latest-migration-notice/#windows-latest-image-label-migration
v8.8.3: — Sealing GasketCompare Source
Continues #1339 to prevent injections via
Proxyinput or customtoString()manipulations.v8.8.2: — Leaking ValveCompare Source
Fixes potential cmd injection via
kill()method for Windows platform. #1337 #1339. Affects the versions range8.7.1...8.8.1.v8.8.1: — Turbo FlushCompare Source
We keep improving the projects internal infra to bring more stability, safety and performance for artifacts.
Featfixes
kill()event logging #1312SIGTERMaskill()fallback signal #1313stdio()arg be an array #1311Enhancements
ProcessPromise[asyncIterator]inners #1307shellsetters #1314v8.8.0: — Pressure TestedCompare Source
This release enhances the coherence between the ProcessPromise and the Streams API, eliminating the need for certain script-level workarounds.
✨ New Features
unpipe()— Selectively stop pipingYou can now call
.unpipe()to stop data transfer from a source to a destination without closing any of the pair. #1302Many-to-one piping
Multiple sources can now stream into a single destination. All sources complete before the destination closes. #1300
Piping from rejected processes
Processes that exit with errors can now still pipe their output. The internal recorder retains their stream, status, and exit code. #1296
Components versions
Since zx bundles third-party libraries without their package.jsons, their versions weren’t previously visible. You can now access them via the
versionsstatic map — including zx itself. #1298 #1295v8.7.2: — Copper CrafterCompare Source
Stability and customizability improvements
nothrowoption onProcessPromiseinit stage #1288_snapshot.killSignalvalue onkill()#1287Failclass #1285$as type #1283Internal tweak ups #1276 #1277 #1278 #1279 #1280 #1281 #1282 #1286 #1289
Described the zx architecture basics. This section helps to better understand the zx concepts and internal logic, and will be useful for those who want to become a project contributor, make tools based on it, or create something similar from scratch. #1290 #1291 #1292
v8.7.1: — Pipe WhispererCompare Source
Continues v8.7.0: handles new
ps()corner case and improves$.killmechanics on Windows #1266 #1267 #1269 webpod/ps#14v8.7.0: — Solder SaviorCompare Source
Important fixes for annoying flaky bugs
kill() 🐞
We've found an interesting case #1262
If we kill the process again, the result might be unexpected:
This happens because the
pidmay be reused by the system for another process, so we've added extra assertions to prevent indeterminacy:ps() 🐛
ps()uses wmic internally on Windows, it relies on fragile heuristics to parse the output. We have improved this logic to handle more format variants, but over time (in v9 maybe) we're planning to change the approach.#1256 #1263 webpod/ps#12 webpod/ingrid#6
v8.6.2: — Flow UnstoppableCompare Source
Fixes
$.prefix&$.postfixvalues settings via env variables #1261 #1260v8.6.1: — Drain HeroCompare Source
process.env.SHELLas default shell if defined #1252parseDuration()arg #1249node:24-alpine#1239v8.6.0: — Valve VanguardCompare Source
thenableparams processing for$literals #1237v8.5.5: — PVC WizardCompare Source
Minor feature polish.
ProcessPromiseandProcessOutputlines()getters now accept a custom delimiter #1220 #1218.nothrow()option inProcessProcess[AsyncIterator]#1216 #1217v8.5.4: — Pipe DreamerCompare Source
pipe(file: string)signature type declaration #1208 #1209v8.5.3: — Trap MasterCompare Source
expBackoffimplementation$.log.outputas defaultspinner()outputquestion()I/Ov8.5.2: — Threaded PerfectionCompare Source
v8.5.0: — Flow SplitterCompare Source
In this release we're significantly expanding the zx setup capabilities.
zx@lite
Just core functions without extras, ~7x smaller than the full version.
#1131
Detailed comparison: zx/versions
Channels
We have completely reforged the distribution flow. Now zx is available in multiple formats:
#1141...
#1157
Docker
If you'd prefer to run zx in a container, you can pull the image from the GH docker registry.
node:22-alpine is used as a base. #1142 #1145
docker pull ghcr.io/google/zx:8.5.0 docker run -t ghcr.io/google/zx:8.5.0 -e="await \$({verbose: true})\`echo foo\`" docker run -t -i -v ./:/script ghcr.io/google/zx:8.5.0 script/t.jsChores
glob.syncshortcut #1135ZX_REGISTRY='https://custom-registry.example.com' zx script.jsv8.4.2Compare Source
v8.4.1: – Rusty ElbowCompare Source
Logger enhancements are arriving in this release. #1119 #1122 #1123 #1125
v8.4.0: – Drip DetectiveCompare Source
Try the new batch of enhancements:
npm i [email protected]https://www.npmjs.com/package/zx/v/8.4.0Changes
--prefer-localnow allows linking both external binaries and packages #1116 #1117quotehas been slightly changed for a conner case, when zx literal gets an array.#999 #1113
nothrowoption to suppress any errors #1108 #1109@types/nodeand@types/fs-extradeps replaced with triple-slash typing refs #1102ProcessOutputiterable #1101ProcessPromiseinstantiation #1097 #1098ProcessOuputcause #1110ProcessOutputinners #1096 #1095.tsextensions for relative imports #1111v8.3.2: – Clogged DrainCompare Source
Restrics unsafe vals usage on
dotenv.stringify#1093 #1094v8.3.1: – Perfect SealCompare Source
The release essence: introduced full-featured
.envsupport #461 → #1060 #1052 #1043 #1037 #1032 #1030 #1022API
envapi is a tiny 100 LOC dotenv-inspired parser and serializer that we've integrated into zx.
CLI
QnA
— Why not use
dotenvdirectly?— 1) Size does matter 2) We'd like to avoid internal vaults.
— Why not load
.envby default?— 1) Explicit is better than implicit 2) Runtime itself (like bun) may provide the feature.
Chore
stdallpiping #1033fullCmdand uniqueid#1035haltandrunAPI in docs #1046timeoutoption handling for corner cases #1049killSignalsetting via env vars #1054diagnostic_channelto built-ins list #1056idfield and introducedendevent #1057 #1058nothrown()toggleable #1066 #1029ZX_REPL_HISTORYenvvar #1065file://protocol check #1064modeoption fortmpdirandtmpfile#1063_timeoutSignaloverride #1075ProcessPromisestage #1077 #967Configuration
📅 Schedule: Branch creation - "" in timezone America/Los_Angeles, Automerge - At any time (no schedule defined).
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.