Releases: google/zx
Releases ยท google/zx
8.2.0
Pipes supercharge today! ๐
Features
- Delayed piping. You can fill dependent streams at any time during the origin process lifecycle (even when finished) without losing data. #914
const result = $`echo 1; sleep 1; echo 2; sleep 1; echo 3`
const piped1 = result.pipe`cat`
let piped2
setTimeout(() => {
piped2 = result.pipe`cat`
}, 1500)
await piped1
assert.equal((await piped1).toString(), '1\n2\n3\n')
assert.equal((await piped2).toString(), '1\n2\n3\n')
const file = tempfile()
const fileStream = fs.createWriteStream(file)
const p = $`echo "hello"`
.pipe(
new Transform({
transform(chunk, encoding, callback) {
callback(null, String(chunk).toUpperCase())
},
})
)
.pipe(fileStream)
p instanceof WriteStream // true
await p === fileStream // true
(await fs.readFile(file)).toString() // 'HELLO\n'
Chore
8.1.9
Today's release is a minor update that includes:
Enhancements
- We have replaced
ProcessOutput
fields with lazy getters to reduce mem consumption #903, #908 - Reduced ReDos risks for codeblock patterns #906
- Kept
argv
reference on update #916 - Strengthened
Shell
interface to properly handlesync
mode #915:
expectType<ProcessPromise>($`cmd`)
expectType<ProcessPromise>($({ sync: false })`cmd`)
expectType<ProcessOutput>($({ sync: true })`cmd`)
expectType<ProcessOutput>($.sync`cmd`)
Fixes
8.1.8
8.1.7
Step by step on the road to improvements
Fixes
Finally, we've fixed the issue with piped process rejection #640 #899:
const p1 = $`exit 1`.pipe($`echo hello`)
try {
await p1
} catch (e) {
assert.equal(e.exitCode, 1)
}
const p2 = await $({ nothrow: true })`echo hello && exit 1`.pipe($`cat`)
assert.equal(p2.exitCode, 0)
assert.equal(p2.stdout.trim(), 'hello')
Enhancements
Added cmd
display to ProcessPromise
#891:
const foo = 'bar'
const p = $`echo ${foo}`
p.cmd // 'echo bar'
and duration
field to ProcessOutput
#892:
const p = $`sleep 1`.nothrow()
const o = await p
o.duration // ~1000 (in ms)
Enabled zurk-like pipe string literals #900:
const p = await $`echo foo`.pipe`cat`
p.stdout.trim() // 'foo'
8.1.6
Improvements & Fixes
$.preferLocal = true // injects node_modules/.bin to the $PATH
$.preferLocal = '/foo/bar' // attaches /foo/bar to the $PATH
$.preferLocal = ['/bar', '/baz'] // now the $PATH includes both /bar and /baz
Why not just $.env['PATH'] = 'extra:' + '$.env['PATH']
?
Well, the API internally does the same, but also handles the win paths peculiarities.
- Provided
$.killSignal
option for the symmetry with the$.timeoutSignal
. You can override the default termination flow #885:
$.killSignal = 'SIGKILL'
const p = $({nothrow: true})`sleep 10000`
setTimeout(p.kill, 100)
(await p).signal // SIGKILL
$
opt presets became chainable #883:
const $$ = $({ nothrow: true })
assert.equal((await $$`exit 1`).exitCode, 1)
const $$$ = $$({ sync: true }) // Both {nothrow: true, sync: true} are applied
assert.equal($$$`exit 2`.exitCode, 2)
- Enhanced the internal
Duration
parser #884:
const p = $({timeout: '1mss'})`sleep 999` // raises an error now
8.1.5
8.1.4
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
Nothing special today. We just keep improving the implementation.
Features
import {$} from 'zx'
zx/cli
exports its inners to allow more advanced usage.
Imagine, your own CLI tool that useszx
as a base:
#828
#!/usr/bin/env node
import './index.mjs'
import {main} from 'zx/cli'
main()
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
acceptskind: '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
Every new zx version is better than previous one. What have we here?
Features
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
- Published with npm provenance #818
- Minor polyfills optimizations #821
8.1.1
This release brings a pinch of sugar and minor fixes.
Features
- Introduced
$.preferLocal
option to prefernode_modules/.bin
located binaries over globally system installed ones.
#798
$.preferLocal = true
await $`c8 npm test`
await $({ preferLocal: true })`eslint .`
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 itssignal
reference.
#816
const p = $`sleep 999`
const {signal} = p
const res = fetch('https://example.com', {signal})
setTimeout(() => p.abort('reason'), 1000)