lobe-cli-toolbox
lobe-cli-toolbox copied to clipboard
Update dependency execa to v9
This PR contains the following updates:
Package | Change | Age | Adoption | Passing | Confidence |
---|---|---|---|---|---|
execa | ^8 -> ^9.0.0 |
Release Notes
sindresorhus/execa (execa)
v9.3.0
Features
- The
verbose
option can now be a function to customize logging. (#β1130)
v9.2.0
This release includes a new set of methods to exchange messages between the current process and a Node.js subprocess, also known as "IPC". This allows passing and returning almost any message type to/from a Node.js subprocess. Also, debugging IPC is now much easier.
Moreover, a new gracefulCancel
option has also been added to terminate a subprocess gracefully.
For a deeper dive-in, please check and share the release post!
Thanks @βiiroj for your contribution, @βSimonSiefke and @βadymorz for reporting the bugs fixed in this release, and @βkarlhorky for improving the documentation!
Deprecations
- Passing
'ipc'
to thestdio
option has been deprecated. It will be removed in the next major release. Instead, theipc: true
option should be used. (#β1056)
- await execa('npm', ['run', 'build'], {stdio: ['pipe', 'pipe', 'pipe', 'ipc']});
+ await execa('npm', ['run', 'build'], {ipc: true});
- The
execaCommand()
method has been deprecated. It will be removed in the next major release. If most cases, the template string syntax should be used instead.
- import {execaCommand} from 'execa';
+ import {execa} from 'execa';
- await execaCommand('npm run build');
+ await execa`npm run build`;
const taskName = 'build';
- await execaCommand(`npm run ${taskName}`);
+ await execa`npm run ${taskName}`;
const commandArguments = ['run', 'task with space'];
await execa`npm ${commandArguments}`;
If the file and/or multiple arguments are supplied as a single string, parseCommandString(command) can split that string into an array. More info. (#β1054)
- import {execaCommand} from 'execa';
+ import {execa, parseCommandString} from 'execa';
const commandString = 'npm run task';
- await execaCommand(commandString);
+ const commandArray = parseCommandString(commandString); // ['npm', 'run', 'task']
+ await execa`${commandArray}`;
// Or alternatively:
const [file, ...commandArguments] = commandArray;
await execa(file, commandArguments);
Features
- Add
gracefulCancel
option andgetCancelSignal()
method to terminate a subprocess gracefully.error.isGracefullyCanceled
was also added. (#β1109) - Add
error.isForcefullyTerminated
. It istrue
when the subprocess was terminated by theforceKillAfterDelay
option. (#β1111) - New methods to simplify exchanging messages between the current process and the subprocess. More info. (#β1059, #β1061, #β1076, #β1077, #β1079, #β1082, #β1083, #β1086, #β1087, #β1088, #β1089, #β1090, #β1091, #β1092, #β1094, #β1095, #β1098, #β1104, #β1107)
- The current process sends messages with
subprocess.sendMessage(message)
and receives them withsubprocess.getOneMessage()
.subprocess.getEachMessage()
listens to multiple messages. - The subprocess uses
sendMessage(message)
,getOneMessage()
andgetEachMessage()
instead. Those are the same methods, but imported directly from the'execa'
module.
- The current process sends messages with
- The
ipcInput
option sends an IPC message from the current process to the subprocess as it starts. This enables passing almost any input type to a Node.js subprocess. (#β1068) - The
result.ipcOutput
array contains all the IPC messages sent by the subprocess to the current process. This enables returning almost any output type from a Node.js subprocess. (#β1067, #β1071, #β1075) - The error message now contains every IPC message sent by the subprocess. (#β1067)
- The
verbose: 'full'
option now logs every IPC message sent by the subprocess, for debugging. More info here and there. (#β1063)
Types
- Add
ExecaMethod
,ExecaNodeMethod
andExecaScriptMethod
,ExecaSyncMethod
andExecaScriptSyncMethod
types. (#β1066) - Export the
Message
type, for IPC. (#β1059) - Fix type of
forceKillAfterDelay: true
option. (#β1116)
Bug fixes
- Fix passing a
{file}
to both thestdin
and thestdout
orstderr
options. (#β1058) - Fix multiple minor problems with the
cancelSignal
option. (#β1108) - Fix accidental publishing of Vim backup files. (#β1074)
- Fix
engines.node
field inpackage.json
. Supported Node.js version is^18.19.0
or>=20.5.0
. (by @βiiroj) (#β1101)
v9.1.0
Features (types)
- Export
TemplateExpression
type. (#β1049)
v9.0.2
Bug fixes (types)
- Do not require using
--lib dom
for TypeScript users (#β1043, #β1044) - Fix type of the
reject
option (#β1046)
v9.0.1
Bug fixes (types)
- Fix types not being importable (#β1033)
3bdab60
- Fix complexity bug with types (#β1037)
6cc519b
- Fix complexity bug with types (#β1035)
fee011d
v9.0.0
This major release brings many important features including:
- Split the output into lines, or progressively iterate over them.
- Transform or filter the input/output using simple functions.
- Print the output to the terminal while still retrieving it programmatically.
- Redirect the input/output from/to a file.
- Advanced piping between multiple subprocesses.
- Improved verbose mode, for debugging.
- More detailed errors, including when terminating subprocesses.
- Enhanced template string syntax.
- Global/shared options.
- Web streams and Transform streams support.
- Convert the subprocess to a stream.
- New documentation with many examples.
Please check the release post for a high-level overview! For the full list of breaking changes, features and bug fixes, please read below.
Thanks @βyounggglcy, @βkoshic, @βam0o0 and @βcodesmith-emmy for your help!
One of the maintainers @βehmicky is looking for a remote full-time position. Specialized in Node.js back-ends and CLIs, he led Netlify Build, Plugins and Configuration for 2.5 years. Feel free to contact him on his website or on LinkedIn!
Breaking changes
-
Minimal supported Node.js version is now
18.19.0
. (834e372
) -
When the
encoding
option is'buffer'
, the output (result.stdout
,result.stderr
,result.all
) is now anUint8Array
instead of aBuffer
. For more information, see this blog post. (by @βyounggglcy) (#β586)
const {stdout} = await execa('node', ['file.js'], {encoding: 'buffer'});
console.log(stdout); // This is now an Uint8Array
- await execa('node', ['file.js'], {encoding: null});
+ await execa('node', ['file.js'], {encoding: 'buffer'});
- await execa('node', ['file.js'], {encoding: 'utf-8'});
+ await execa('node', ['file.js'], {encoding: 'utf8'});
- await execa('node', ['file.js'], {encoding: 'UTF8'});
+ await execa('node', ['file.js'], {encoding: 'utf8'});
- await execa('node', ['file.js'], {encoding: 'utf-16le'});
+ await execa('node', ['file.js'], {encoding: 'utf16le'});
- await execa('node', ['file.js'], {encoding: 'ucs2'});
+ await execa('node', ['file.js'], {encoding: 'utf16le'});
- await execa('node', ['file.js'], {encoding: 'ucs-2'});
+ await execa('node', ['file.js'], {encoding: 'utf16le'});
- await execa('node', ['file.js'], {encoding: 'binary'});
+ await execa('node', ['file.js'], {encoding: 'latin1'});
- Passing a file path to
subprocess.pipeStdout()
,subprocess.pipeStderr()
andsubprocess.pipeAll()
has been removed. Instead, a{file: './path'}
object should be passed to thestdout
orstderr
option. (#β752)
- await execa('node', ['file.js']).pipeStdout('output.txt');
+ await execa('node', ['file.js'], {stdout: {file: 'output.txt'}});
- await execa('node', ['file.js']).pipeStderr('output.txt');
+ await execa('node', ['file.js'], {stderr: {file: 'output.txt'}});
- await execa('node', ['file.js']).pipeAll('output.txt');
+ await execa('node', ['file.js'], {
+ stdout: {file: 'output.txt'},
+ stderr: {file: 'output.txt'},
+});
- Passing a writable stream to
subprocess.pipeStdout()
,subprocess.pipeStderr()
andsubprocess.pipeAll()
has been removed. Instead, the stream should be passed to thestdout
orstderr
option. If the stream does not have a file descriptor,['pipe', stream]
should be passed instead. (#β752)
- await execa('node', ['file.js']).pipeStdout(stream);
+ await execa('node', ['file.js'], {stdout: ['pipe', stream]});
- await execa('node', ['file.js']).pipeStderr(stream);
+ await execa('node', ['file.js'], {stderr: ['pipe', stream]});
- await execa('node', ['file.js']).pipeAll(stream);
+ await execa('node', ['file.js'], {
+ stdout: ['pipe', stream],
+ stderr: ['pipe', stream],
+});
- The
subprocess.pipeStdout()
,subprocess.pipeStderr()
andsubprocess.pipeAll()
methods have been renamed tosubprocess.pipe()
. The command and its arguments can be passed tosubprocess.pipe()
directly, without callingexeca()
a second time. Thefrom
piping option can specify'stdout'
(the default value),'stderr'
or'all'
. (#β757)
- await execa('node', ['file.js']).pipeStdout(execa('node', ['other.js']));
+ await execa('node', ['file.js']).pipe('node', ['other.js']);
- await execa('node', ['file.js']).pipeStderr(execa('node', ['other.js']));
+ await execa('node', ['file.js']).pipe('node', ['other.js'], {from: 'stderr'});
- await execa('node', ['file.js']).pipeAll(execa('node', ['other.js']));
+ await execa('node', ['file.js']).pipe('node', ['other.js'], {from: 'all'});
- Renamed the
signal
option tocancelSignal
. (#β880)
- await execa('node', ['file.js'], {signal: abortController.signal});
+ await execa('node', ['file.js'], {cancelSignal: abortController.signal});
- Renamed
error.killed
toerror.isTerminated
. (#β625)
try {
await execa('node', ['file.js']);
} catch (error) {
- if (error.killed) {
+ if (error.isTerminated) {
// ...
}
}
-
subprocess.cancel()
has been removed. Please use eithersubprocess.kill()
or thecancelSignal
option instead. (#β711)
- subprocess.cancel();
+ subprocess.kill();
- Renamed the
forceKillAfterTimeout
option toforceKillAfterDelay
. Also, it is now passed toexeca()
instead ofsubprocess.kill()
. (#β714, #β723)
- const subprocess = execa('node', ['file.js']);
- subprocess.kill('SIGTERM', {forceKillAfterTimeout: 1000});
+ const subprocess = execa('node', ['file.js'], {forceKillAfterDelay: 1000});
+ subprocess.kill('SIGTERM');
- The
verbose
option is now a string enum instead of a boolean.false
has been renamed to'none'
andtrue
has been renamed to'short'
. (#β884)
- await execa('node', ['file.js'], {verbose: false});
+ await execa('node', ['file.js'], {verbose: 'none'});
- await execa('node', ['file.js'], {verbose: true});
+ await execa('node', ['file.js'], {verbose: 'short'});
- The
execPath
option has been renamed tonodePath
. It is now a noop unless thenode
option istrue
. Also, it now works even if thepreferLocal
option isfalse
. (#β812, #β815)
- await execa('node', ['file.js'], {execPath: './path/to/node'});
+ await execa('node', ['file.js'], {nodePath: './path/to/node'});
- The default value for the
serialization
option is now'advanced'
instead of'json'
. In particular, when callingsubprocess.send(object)
with an object that contains functions or symbols, those were previously silently removed. Now this will throw an exception. (#β905)
- subprocess.send({example: true, getExample() {}});
+ subprocess.send({example: true});
- If
subprocess.stdout
,subprocess.stderr
orsubprocess.all
is manually piped, the.pipe()
call must now happen as soon assubprocess
is created. Otherwise, the output at the beginning of the subprocess might be missing. (#β658, #β747)
const subprocess = execa('node', ['file.js']);
- setTimeout(() => {
subprocess.stdout.pipe(process.stdout);
- }, 0);
- Signals passed to
subprocess.kill()
and to thekillSignal
option cannot be lowercase anymore. (#β1025)
- const subprocess = execa('node', ['file.js'], {killSignal: 'sigterm'});
+ const subprocess = execa('node', ['file.js'], {killSignal: 'SIGTERM'});
- subprocess.kill('sigterm');
+ subprocess.kill('SIGTERM');
Features
Execution
- Use the template string syntax with any method (including
execa()
), as opposed to only$
. Conversely,$
can now use the regular array syntax. (#β933) - A command's template string can span multiple lines. (#β843)
-
Share options between multiple calls, or set global options, by using
execa(options)
. (#β933, #β965) - Pass a file URL (as opposed to a file path string) to
execa()
,execaNode()
, theinputFile
option, thenodePath
option or theshell
option. (#β630, #β631, #β632, #β635)
Text lines
-
Split the output into text lines by using the
lines
option. (#β741, #β929, #β931, #β948, #β951, #β957) - Subprocess is now an async iterable, iterating over the output lines while the subprocess is running. (#β923)
Piping multiple subprocesses
- Simpler syntax: pass the command directly to
subprocess.pipe()
without callingexeca()
. A template string can also be used. (#β840, #β859, #β864) - Wait for both subprocesses to complete. Error handling has been improved too. (#β757, #β778, #β834, #β854)
- Retrieve the result of each subprocess (not only the last one) by using
result.pipedFrom
anderror.pipedFrom
. (#β834) - Pipe 1 or many subprocesses to 1 or many subprocesses. (#β834)
- Pipe subprocesses using other file descriptors than
stdin
/stdout
/stderr
by using thefrom
andto
piping options. (#β757, #β834, #β903, #β920) -
Cancel piping subprocesses by using the
unpipeSignal
piping option. (#β834, #β852)
Input/output
- Pass an array with multiple values to the
stdin
,stdout
andstderr
options. For example,stdout: ['inherit', 'pipe']
prints the output to the terminal while still returning it asresult.stdout
. (#β643, #β765, #β941, #β954) - Redirect the input/output from/to a file by passing a
{file: './path'}
object or a file URL to thestdin
,stdout
orstderr
option. (#β610, #β614, #β621, #β671, #β1004) -
Transform or filter the input/output by passing a generator function to the
stdin
,stdout
orstderr
option. (#β693, #β697, #β698, #β699, #β709, #β736, #β737, #β739, #β740, #β746, #β748, #β755, #β756, #β780, #β783, #β867, #β915, #β916, #β917, #β919, #β924, #β926, #β945, #β969) - Provide some binary input by passing an
Uint8Array
to theinput
orstdin
option. (834e372
, #β670, #β1029) - Provide some progressive input by passing a sync/async iterable to the
stdin
option. (#β604, #β944) - Provide multiple inputs by combining the
stdin
,input
andinputFile
options. (#β666) - Return other file descriptors than
result.stdout
andresult.stderr
by usingresult.stdio
. (#β676) -
Specify different values for
stdout
andstderr
with the following options:verbose
,lines
,stripFinalNewline
,maxBuffer
,buffer
. (#β966, #β970, #β971, #β972, #β973, #β974)
Streams
- Redirect the input/output from/to a web stream by passing a
ReadableStream
orWritableStream
to thestdin
,stdout
orstderr
option. (#β615, #β619, #β645) -
Transform or filter the input/output by passing a
Duplex
, Node.jsTransform
or webTransformStream
to thestdin
,stdout
orstderr
option. (#β937, #β938) -
Convert the subprocess to a stream by using
subprocess.readable()
,subprocess.writable()
orsubprocess.duplex()
. (#β912, #β922, #β958)
Verbose mode
- Print the subprocess' completion, duration and errors with the
verbose: 'short'
orverbose: 'full'
option. (#β887, #β890) - Print the subprocess' output with the
verbose: 'full'
option. (#β884, #β950, #β962, #β990) - Prettier formatting and colors with the
verbose
option. (#β883, #β893, #β894)
Debugging
- Retrieve the subprocess' duration by using
result.durationMs
anderror.durationMs
. (#β896) - Retrieve the subprocess' current directory by using
result.cwd
. Previously onlyerror.cwd
was available. Also,result.cwd
anderror.cwd
are now normalized to absolute file paths. (#β803) - Printing
result.escapedCommand
in a terminal is now safe. (#β875)
Errors
- The
ExecaError
andExecaSyncError
classes are now exported. (#β911) - Find the subprocess failure's root cause by using
error.cause
. (#β911) - Know whether the subprocess failed due to the
maxBuffer
option by usingerror.isMaxBuffer
. (#β963) - Improved
error.message
:error.stdout
anderror.stderr
are now interleaved if theall
option istrue
. Additional file descriptors are now printed too. Also, the formatting has been improved. (#β676, #β705, #β991, #β992) -
Control characters in
error.message
are now escaped, so they don't result in visual bugs when printed in a terminal. (#β879) - Improved stack trace when an
error
event is emitted onsubprocess.stdout
orsubprocess.stderr
. (#β814)
Termination
- Specify an error message or stack trace when terminating a subprocess by passing an error instance to
subprocess.kill()
. (#β811, #β836, #β1023) - The
forceKillAfterDelay
andkillSignal
options now apply to terminations due not only tosubprocess.kill()
but also to thecancelSignal
,timeout
,maxBuffer
andcleanup
options. (#β714, #β728)
Node.js files
- Use the
nodePath
andnodeOptions
options with any method, as opposed to onlyexecaNode()
, by passing thenode: true
option. (#β804, #β812, #β815) - When using
execaNode()
or thenode: true
option, the current Node.js version is now inherited deeply. If the subprocess spawns other subprocesses, they will all use the same Node.js version. (#β812, #β815, #β1011)
Synchronous execution
- Use the
all
andbuffer: false
options withexecaSync()
, as opposed to onlyexeca()
. (#β953, #β956) - Added the
$.s
alias for$.sync
. (#β594)
Inter-process communication
- Use the
ipc: true
option, as opposed to the more verbosestdio: ['pipe', 'pipe', 'pipe', 'ipc']
option. (#β794)
Input validation
- Improved the validation of the
input
,timeout
,cwd
,detached
,cancelSignal
andencoding
options. (#β668, #β715, #β803, #β928, #β940) - Improved the validation of the arguments passed to
execa()
and the other exported methods. (#β838, #β873, #β899) - Improved the validation of signals passed to
subprocess.kill()
and to thekillSignal
option. (#β1025)
Bug fixes
- Fixed passing
undefined
values as options. This now uses the option's default value. (#β712) - Fixed the process crashing when the
inputFile
option points to a missing file. (#β609) - Fixed the process crashing when the
buffer
option isfalse
andsubprocess.stdout
errors. (#β729) - Fixed the process crashing when passing
'overlapped'
to thestdout
orstderr
option withexecaSync()
. (#β949) - Fixed the process crashing when multiple
'error'
events are emitted on the subprocess. (#β790) - Fixed the
reject: false
option not being used when the subprocess fails to spawn. (#β734) - Fixed some inaccuracies with
error.isTerminated
. (#β625, #β719)- It is now
true
when the subprocess fails due to thetimeout
option. - It is now
true
when callingprocess.kill(subprocess.pid)
, except on Windows. - It is now
false
when using non-terminating signals such assubprocess.kill(0)
.
- It is now
- Fixed missing
error.signal
anderror.signalDescription
when the subprocess is terminated by thecancelSignal
option. (#β724) - Fixed a situation where the error returned by an
execa()
call might be modified by anotherexeca()
call. (#β796, #β806, #β911) - Fixed the
verbose
option printing the command in the wrong order. (#β600) - Fixed using both the
maxBuffer
andencoding
options. For example, when usingencoding: 'hex'
,maxBuffer
will now be measured in hexadecimal characters. Also,error.stdout
,error.stderr
anderror.all
were previously not applying themaxBuffer
option. (#β652, #β696) - Fixed the
maxBuffer
option not truncatingresult.stdout
andresult.stderr
when usingexecaSync()
. (#β960) - Fixed empty output when using the
buffer: true
option (its default value) and iterating oversubprocess.stdout
orsubprocess.stderr
. (#β908) - Fixed
subprocess.all
stream incorrectly being in object mode. (#β717) - Ensured
subprocess.stdout
andsubprocess.stderr
are properly flushed when the subprocess fails. (#β647) - Fixed a race condition leading to random behavior with the
timeout
option. (#β727)
Types (breaking changes)
- Renamed
CommonOptions
type toOptions
(forexeca()
) andSyncOptions
(forexecaSync()
). (#β678, #β682)
import type {Options} from 'execa';
- const options: CommonOptions = {timeout: 1000};
+ const options: Options = {timeout: 1000};
- Renamed
NodeOptions
type toOptions
. (#β804)
import type {Options} from 'execa';
- const options: NodeOptions = {nodeOptions: ['--no-warnings']};
+ const options: Options = {nodeOptions: ['--no-warnings']};
- Renamed
KillOptions
type toOptions
. (#β714)
import type {Options} from 'execa';
- const options: KillOptions = {forceKillAfterTimeout: 1000};
+ const options: Options = {forceKillAfterDelay: 1000};
- Removed generic parameters from the
Options
andSyncOptions
types. (#β681)
import type {Options} from 'execa';
- const options: Options<'utf8'> = {encoding: 'utf8'};
+ const options: Options = {encoding: 'utf8'};
- Renamed
ExecaChildProcess
type toResultPromise
. This is the type ofexeca()
's return value, which is both aPromise<Result>
and aSubprocess
. (#β897, #β1007, #β1009)
import type {ResultPromise, Result} from 'execa';
- const promiseOrSubprocess: ExecaChildProcess = execa('node', ['file.js']);
+ const promiseOrSubprocess: ResultPromise = execa('node', ['file.js']);
const result: Result = await promiseOrSubprocess;
promiseOrSubprocess.kill();
- Renamed
ExecaChildPromise
type toSubprocess
. This is the type of the subprocess instance. (#β897, #β1007, #β1009)
import type {Subprocess} from 'execa';
- const subprocess: ExecaChildPromise = execa('node', ['file.js']);
+ const subprocess: Subprocess = execa('node', ['file.js']);
subprocess.kill();
- Renamed
ExecaReturnBase
,ExecaReturnValue
andExecaSyncReturnValue
type toResult
(forexeca()
) andSyncResult
(forexecaSync()
). (#β897, #β1009)
import type {Result, SyncResult} from 'execa';
- const result: ExecaReturnBase = await execa('node', ['file.js']);
+ const result: Result = await execa('node', ['file.js']);
- const result: ExecaReturnValue = await execa('node', ['file.js']);
+ const result: Result = await execa('node', ['file.js']);
- const result: ExecaSyncReturnValue = execaSync('node', ['file.js']);
+ const result: SyncResult = execaSync('node', ['file.js']);
- Renamed the type of the
stdin
option fromStdioOption
toStdinOption
(forexeca()
) andStdinSyncOption
(forexecaSync()
). (#β942, #β1008, #β1012)
import {execa, type StdinOption} from 'execa';
- const stdin: StdioOption = 'inherit';
+ const stdin: StdinOption = 'inherit';
await execa('node', ['file.js'], {stdin});
- Renamed the type of the
stdout
andstderr
options fromStdioOption
toStdoutStderrOption
(forexeca()
) andStdoutStderrSyncOption
(forexecaSync()
). (#β942, #β1008, #β1012)
import {execa, type StdoutStderrOption} from 'execa';
- const stdout: StdioOption = 'inherit';
+ const stdout: StdoutStderrOption = 'inherit';
- const stderr: StdioOption = 'inherit';
+ const stderr: StdoutStderrOption = 'inherit';
await execa('node', ['file.js'], {stdout, stderr});
- Renamed the type of the
stdio
option fromStdioOption[]
toOptions['stdio']
(forexeca()
) andSyncOptions['stdio']
(forexecaSync()
). (#β942, #β1008)
import {execa, type Options} from 'execa';
- const stdio: readonly StdioOption[] = ['inherit', 'pipe', 'pipe'] as const;
+ const stdio: Options['stdio'] = ['inherit', 'pipe', 'pipe'] as const;
await execa('node', ['file.js'], {stdio});
- The optional generic parameter passed to the
Result
,SyncResult
,ExecaError
,ExecaSyncError
,ResultPromise
andSubprocess
types is now anOptions
type. (#β681)
import type {Result} from 'execa';
- const result: ExecaReturnValue<Buffer> = await execa('node', ['file.js'], {encoding: 'buffer'});
+ const result: Result<{encoding: 'buffer'}> = await execa('node', ['file.js'], {encoding: 'buffer'});
// Or even better, since it is inferred:
+ const result: Result = await execa('node', ['file.js'], {encoding: 'buffer'});
Types (improvements)
- Stricter types for the
stdin
,stdout
,stderr
andstdio
options. (#β634, #β943, #β952) - Stricter types for
result.stdout
,result.stderr
,result.all
,subprocess.stdout
,subprocess.stderr
andsubprocess.all
. (#β681, #β684, #β687, #β689, #β833) - Stricter types for the synchronous methods like
execaSync()
. (#β678, #β939) - Stricter types for the
reject
option. (#β688) - Stricter types for
error.signal
and thekillSignal
option. (#β1025) - Fixed the type of
error.exitCode
, since that field is sometimesundefined
. (#β680) - Refactored and improved the types. (by @βkoshic) (#β583)
Documentation
- Added user guides to let you explore each feature with many examples. (#β989, #β996, #β1015, #β1022, #β1026)
- Improved the documentation and fixed inaccuracies. (#β626, #β637, #β640, #β641, #β644, #β669, #β680, #β710, #β759, #β800, #β801, #β802, #β860, #β870, #β876, #β888, #β907, #β921, #β935, [#β967](https://togithub.com/sindresorhus/execa/issues/
Configuration
π Schedule: Branch creation - "on sunday before 6:00am" in timezone 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.
- [ ] If you want to rebase/retry this PR, check this box
This PR was generated by Mend Renovate. View the repository job log.