release notes
release notes
Published 4/5/2024
MajorContains breaking changesWe are thrilled to announce the release of zx v8.0.0! 🎉
With this release, we have introduced a lot of new features, improvements, and bug fixes. We have also made some breaking changes, so please read the following release notes carefully.
Squashed deps: we use esbuild with custom plugins to forge js bundles and dts-bundle-generator for typings 2acb0f, #722
More safety, more stability and significantly reduced installation time. Zx now is ~20x smaller.
npx zx@8.0.0
npm install zx@8.0.0
Options presets are here. To implement this, we have also completely refactored the zx core, and now it's available as a separate package – zurk
aeec7a, #733, #600
const $$ = $({quiet: true})
await $$`echo foo`
$({nothrow: true})`exit 1`
We have introduced $.sync() API
1f8c8b, #738, #681, 1d8aa9, #739
import {$} from 'zx'
const { output } = $.sync`echo foo` // foo
You can also override the internal API to implement pools, test mocking, etc.
$.spawnSync = () => {} // defaults to `child_process.spawnSync`
The input option is now available to pass data to the command.
b38972, #736
const p1 = $({ input: 'foo' })`cat`
const p2 = $({ input: Readable.from('bar') })`cat`
const p3 = $({ input: Buffer.from('baz') })`cat`
const p4 = $({ input: p3 })`cat`
const p5 = $({ input: await p3 })`cat`
AbortController has been introduced to abort the command execution. It's available via the ac option.
fa4a7b, #734, #527
const ac = new AbortController()
const p = $({ ac })`sleep 9999`
setTimeout(() => ac.abort(), 100)
If not specified, the default instance will be used. Abortion trigger is also available via PromiseResponse:
const p = $`sleep 9999`
setTimeout(() => p.abort(), 100)
kill method is exposed now. To terminate any (not only zx starter) process:
import { kill } from 'zx'
await kill(123)
await kill(123, 'SIGKILL')
Btw, we have replaced ps-tree with @webpod/ps & @webpod/ingrid, and exposed ps util:
import {ps} from 'zx'
const children = await ps.tree(123)
/**
[
{pid: 124, ppid: 123},
{pid: 125, ppid: 123}
]
*/
const children2 = await ps.tree({pid: 123, recursive: true})
/**
[
{pid: 124, ppid: 123},
{pid: 125, ppid: 123},
{pid: 126, ppid: 124},
{pid: 127, ppid: 124},
{pid: 128, ppid: 124},
{pid: 129, ppid: 125},
{pid: 130, ppid: 125},
]
*/
Introduced $.postfix option. It's like a $.prefix, but for the end of the command.
fb9554, #756, #536
import {$} from 'zx'
$.postfix = '; exit $LastExitCode' // for PowerShell compatibility
minimist API exposed
#661
import { minimist } from 'zx'
const argv = minimist(process.argv.slice(2), {})
Fixed npm package name pattern on --install mode
956dcc, #659, #660, #663
import '@qux/pkg' // valid
import '@qux/pkg/entry' // was invalid before and valid now
We've tried our best to avoid them, but it was necessary.
$.verbose is set to false by default, but errors are still printed to stderr. Set $.quiet = true to suppress all output.
cafb90, #745, #569
$.verbose = true // everything works like in v7
$.quiet = true // to completely turn off logging
ssh API was dropped. Install webpod package instead.
8925a1, #750
// import {ssh} from 'zx' ↓
import {ssh} from 'webpod'
const remote = ssh('user@host')
await remote`echo foo`
zx is not looking for powershell anymore, on Windows by default. If you still need it, use the usePowerShell helper:
24dcf3, #757
import { usePowerShell, useBash } from 'zx'
usePowerShell() // to enable powershell
useBash() // switch to bash, the default
Process cwd synchronization between $ invocations is disabled by default. This functionality is provided via an async hook and can now be controlled directly.
d79a63, #765
import { syncProcessCwd } from 'zx'
syncProcessCwd() // restores legacy v7 behavior
lib DOM fe0356 #735, #619, #722)ProcessPromise.valueOf() to simplify value comparisons 0640b8, #737, #690--install API: use depkeek for deps extraction 1a03a6--experimental toggle, all APIs are available by default 8a7a8f, #751spinner issue on weird TTY 1124e3, #755, #607node:test cd1835release notes
Published 4/5/2024
MajorContains breaking changesWe are thrilled to announce the release of zx v8.0.0! 🎉
With this release, we have introduced a lot of new features, improvements, and bug fixes. We have also made some breaking changes, so please read the following release notes carefully.
Squashed deps: we use esbuild with custom plugins to forge js bundles and dts-bundle-generator for typings 2acb0f, #722
More safety, more stability and significantly reduced installation time. Zx now is ~20x smaller.
npx zx@8.0.0
npm install zx@8.0.0
Options presets are here. To implement this, we have also completely refactored the zx core, and now it's available as a separate package – zurk
aeec7a, #733, #600
const $$ = $({quiet: true})
await $$`echo foo`
$({nothrow: true})`exit 1`
We have introduced $.sync() API
1f8c8b, #738, #681, 1d8aa9, #739
import {$} from 'zx'
const { output } = $.sync`echo foo` // foo
You can also override the internal API to implement pools, test mocking, etc.
$.spawnSync = () => {} // defaults to `child_process.spawnSync`
The input option is now available to pass data to the command.
b38972, #736
const p1 = $({ input: 'foo' })`cat`
const p2 = $({ input: Readable.from('bar') })`cat`
const p3 = $({ input: Buffer.from('baz') })`cat`
const p4 = $({ input: p3 })`cat`
const p5 = $({ input: await p3 })`cat`
AbortController has been introduced to abort the command execution. It's available via the ac option.
fa4a7b, #734, #527
const ac = new AbortController()
const p = $({ ac })`sleep 9999`
setTimeout(() => ac.abort(), 100)
If not specified, the default instance will be used. Abortion trigger is also available via PromiseResponse:
const p = $`sleep 9999`
setTimeout(() => p.abort(), 100)
kill method is exposed now. To terminate any (not only zx starter) process:
import { kill } from 'zx'
await kill(123)
await kill(123, 'SIGKILL')
Btw, we have replaced ps-tree with @webpod/ps & @webpod/ingrid, and exposed ps util:
import {ps} from 'zx'
const children = await ps.tree(123)
/**
[
{pid: 124, ppid: 123},
{pid: 125, ppid: 123}
]
*/
const children2 = await ps.tree({pid: 123, recursive: true})
/**
[
{pid: 124, ppid: 123},
{pid: 125, ppid: 123},
{pid: 126, ppid: 124},
{pid: 127, ppid: 124},
{pid: 128, ppid: 124},
{pid: 129, ppid: 125},
{pid: 130, ppid: 125},
]
*/
Introduced $.postfix option. It's like a $.prefix, but for the end of the command.
fb9554, #756, #536
import {$} from 'zx'
$.postfix = '; exit $LastExitCode' // for PowerShell compatibility
minimist API exposed
#661
import { minimist } from 'zx'
const argv = minimist(process.argv.slice(2), {})
Fixed npm package name pattern on --install mode
956dcc, #659, #660, #663
import '@qux/pkg' // valid
import '@qux/pkg/entry' // was invalid before and valid now
We've tried our best to avoid them, but it was necessary.
$.verbose is set to false by default, but errors are still printed to stderr. Set $.quiet = true to suppress all output.
cafb90, #745, #569
$.verbose = true // everything works like in v7
$.quiet = true // to completely turn off logging
ssh API was dropped. Install webpod package instead.
8925a1, #750
// import {ssh} from 'zx' ↓
import {ssh} from 'webpod'
const remote = ssh('user@host')
await remote`echo foo`
zx is not looking for powershell anymore, on Windows by default. If you still need it, use the usePowerShell helper:
24dcf3, #757
import { usePowerShell, useBash } from 'zx'
usePowerShell() // to enable powershell
useBash() // switch to bash, the default
Process cwd synchronization between $ invocations is disabled by default. This functionality is provided via an async hook and can now be controlled directly.
d79a63, #765
import { syncProcessCwd } from 'zx'
syncProcessCwd() // restores legacy v7 behavior
lib DOM fe0356 #735, #619, #722)ProcessPromise.valueOf() to simplify value comparisons 0640b8, #737, #690--install API: use depkeek for deps extraction 1a03a6--experimental toggle, all APIs are available by default 8a7a8f, #751spinner issue on weird TTY 1124e3, #755, #607node:test cd1835A tool for writing better scripts