fix(deps): Update dependency zx to v8.8.5 [SECURITY] #305
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.1->8.8.5GitHub Vulnerability Alerts
CVE-2025-24959
Impact
This vulnerability is an Environment Variable Injection issue in
dotenv.stringify, affectinggoogle/zxversion 8.3.1.An attacker with control over environment variable values can inject unintended environment variables into
process.env. This can lead to arbitrary command execution or unexpected behavior in applications that rely on environment variables for security-sensitive operations. Applications that process untrusted input and pass it throughdotenv.stringifyare particularly vulnerable.Patches
This issue has been patched in version 8.3.2. Users should immediately upgrade to this version to mitigate the vulnerability.
Workarounds
If upgrading is not feasible, users can mitigate the vulnerability by sanitizing user-controlled environment variable values before passing them to
dotenv.stringify. Specifically, avoid using",', and backticks in values, or enforce strict validation of environment variables before usage.References
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 #1094Configuration
📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by Mend Renovate using a curated preset maintained by
. View repository job log here