Skip to content

Releases: google/zx

8.1.5

28 Aug 21:08
8c3730e
Compare
Choose a tag to compare

We've rolled out a new release!

Fixes

  • Added the minimist typings to the dts bundle. #872 brings the fix.
  • Re-enabled the YAML extra
    API. #870 #879

Chores

  • Clarified cd(), within() and syncProcessCwd() interactions. #878
  • Included mention of the cwd option in the documentation. #868
  • Test enhancements. #877 #880

8.1.4

04 Jul 10:44
d7d074d
Compare
Choose a tag to compare

We continue optimizing bundles and CI/CD pipelines.

  • Update @webpod/ps to v0.0.0-beta.7 to sync internal zurk version. #855
  • Split vendor chunk to reduce the zx/core entry size. #856
  • Add bundle size check. #857
  • Refactor the testing flow, remove duplicated tasks. #861
  • Add missing types for the global defaults. #864
  • Omit redundant YAML API extras. #866

Which gives us: 897 kB → 829 kB (-7.58%)

8.1.3

19 Jun 20:53
a3b7316
Compare
Choose a tag to compare

Nothing special today. We just keep improving the implementation.

Features

  • ESM support is now available for Node.js v12 (previously was cjs only):

    #824, #827, #828
import {$} from 'zx'
  • zx/cli exports its inners to allow more advanced usage.
    Imagine, your own CLI tool that uses zx as a base:

    #828
#!/usr/bin/env node

import './index.mjs'
import {main} from 'zx/cli'

main()
  • Provide intermediate store configuration for fine-grained control of memory usage.

    #650, #849
const getFixedSizeArray = (size) => {
  const arr = []
  return new Proxy(arr, {
    get: (target, prop) =>
      prop === 'push' && arr.length >= size
        ? () => {}
        : target[prop],
  })
}
const store = {
  stdout: getFixedSizeArray(1),
  stderr: getFixedSizeArray(1),
  stdall: getFixedSizeArray(0),
}

const p = await $({ store })`echo foo`

p.stdout.trim() //  'foo'
p.toString()    // ''
  • Introduced sync methods for ps:

    #840
import { ps } from 'zx'

const list1 = await ps()
const list2 = await tree()

// new methods
const list3 = ps.sync()
const list4 = tree.sync()

Chore

  • $.log accepts kind: 'custom' #834
  • Describe $.verbose and $.quiet modes internals #835
  • Mention quotePowerShell in docs #851
  • Finally fixed the annoying flaky problem of the process end detection in Bun #839, coderef
  • Suppress async_hooks.createHook warning on bun #848
  • Remove node-abort-controller in favor of built-in node-fetch polyfill #842
  • Add missing global types #853

8.1.2

27 May 16:30
73f0558
Compare
Choose a tag to compare

Every new zx version is better than previous one. What have we here?

Features

  • Added ProcessPromise.verbose() to enhance debugging experience.

    #820, #710
const p = $`echo foo`
p.quiet()        // enable silent mode
p.quiet(false)   // then disable
p.verbose()      // enable verbose/debug mode
p.verbose(false) // and turn it off

await p
  • Aligned ProcessPromise.isSmth() API:

    #823
const p = $`echo foo`

p.isHalted()
p.isVerbose()
p.isQuiet()
p.isNothrow()

Bug Fixes

  • fix: apply EOL ensurer to the last chunk only #825
  • fix(cli): return exit code 1 on incorrect inputs #826
  • fix: set cjs bundle as legacy main entrypoint #827

Chore

8.1.1

23 May 10:51
73c829c
Compare
Choose a tag to compare

This release brings a pinch of sugar and minor fixes.

Features

  • Introduced $.preferLocal option to prefer node_modules/.bin located binaries over globally system installed ones.

    #798
$.preferLocal = true

await $`c8 npm test`

await $({ preferLocal: true })`eslint .`
  • Added some formatter shortcuts for ProcessPromise:

    #764, #811, #815
const p = $`echo 'foo\nbar'`

await p.text()        // foo\n\bar\n
await p.text('hex')   //  666f6f0a0861720a
await p.buffer()      //  Buffer.from('foo\n\bar\n')
await p.lines()       // ['foo', 'bar']
await $`echo '{"foo": "bar"}'`.json() // {foo: 'bar'}
  • ProcessPromise now exposes its signal reference.

    #816
const p = $`sleep 999`
const {signal} = p

const res = fetch('https://example.com', {signal})

setTimeout(() => p.abort('reason'), 1000)

Fixes

  • CLI flag --quiet is mapped to $.quiet option. #813
  • Module conditional exports are properly sorted now. #812
  • A newline character is appended to the output of ProcessPromise if it's missing. #810

8.1.0

13 May 21:05
3d24076
Compare
Choose a tag to compare

This new release is a big deal. It brings significant improvements in reliability and compatibility.

New features

Added usePwsh() helper to switch to PowerShell v7+ #790

import {usePwsh, useBash} from 'zx'

usePwsh()
$.shell // 'pwsh'

useBash()
$.shell // 'bash'

timeout is now configurable $ opts #796

import {$} from 'zx'

await $({ timeout: 100 })`sleep 999`

$.timeout = 1000            // Sets default timeout for all commands
$.timeoutSignal = 'SIGKILL' // Sets signal to send on timeout

await $`sleep 999`

Added --cwd option for CLI #804

zx --cwd=/some/path script.js

Introduced tmpdir and tmpfile helpers #803

import {tmpdir, tmpfile} from 'zx'

t1 = tmpdir()          // /os/based/tmp/zx-1ra1iofojgg/
t2 = tmpdir('foo')     // /os/based/tmp/zx-1ra1iofojgg/foo/

f1 = tmpfile()         // /os/based/tmp/zx-1ra1iofojgg
f2 = tmpfile('f.txt')  // /os/based/tmp/zx-1ra1iofojgg/foo.txt
f3 = tmpfile('f.txt', 'string or buffer')
  • Support CRLF for markdown script #788
  • Added help digest for man #806
  • Added compatibility with Deno 1.x. → zx seems to be working with Deno 1.x.

8.0.2

18 Apr 15:29
5fd3d8a
Compare
Choose a tag to compare

In this release:

  • Added configurable detached option (#782)
  • Fixed pkg typings entries for tsd tests (#780)

8.0.1

08 Apr 06:39
00d1b74
Compare
Choose a tag to compare

In this release:

  • Added feature: add stdio option (#772)
  • Added feature: support signal opt (#769)
  • Fixed: additional process.kill fallback for bun (#770)

8.0.0

05 Apr 23:27
7fa9bfc
Compare
Choose a tag to compare

We 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.

🚀 New Shiny Features

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.

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

⚠️ Breaking changes

We've tried our best to avoid them, but it was necessary.

  1. $.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
  2. 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`
  3. 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
  4. 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

🧰 Other Improvements

7.2.3

06 Jul 10:21
483cc88
Compare
Choose a tag to compare

What's Changed

New Contributors

Full Changelog: 7.2.2...7.2.3