🔡 If you wish to disable git hash updates, add ":disableDigestUpdates" to the extends array in your config.
Release Notes
eslint/eslint (eslint)
### [`v9.9.1`](https://redirect.github.com/eslint/eslint/compare/v9.9.0...8781e6f063e56438dc22346504ff637df3f84daf)
[Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.9.0...v9.9.1)
### [`v9.9.0`](https://redirect.github.com/eslint/eslint/releases/tag/v9.9.0)
[Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.8.0...v9.9.0)
#### Features
- [`41d0206`](https://redirect.github.com/eslint/eslint/commit/41d02066935b987d2e3b13a08680cc74d7067986) feat: Add support for TS config files ([#18134](https://redirect.github.com/eslint/eslint/issues/18134)) (Arya Emami)
- [`3a4eaf9`](https://redirect.github.com/eslint/eslint/commit/3a4eaf921543b1cd5d1df4ea9dec02fab396af2a) feat: add suggestion to `require-await` to remove `async` keyword ([#18716](https://redirect.github.com/eslint/eslint/issues/18716)) (Dave)
#### Documentation
- [`9fe068c`](https://redirect.github.com/eslint/eslint/commit/9fe068c60db466277a785434496a8f90a9090bed) docs: how to author plugins with configs that extend other configs ([#18753](https://redirect.github.com/eslint/eslint/issues/18753)) (Alec Gibson)
- [`48117b2`](https://redirect.github.com/eslint/eslint/commit/48117b27e98639ffe7e78a230bfad9a93039fb7f) docs: add version support page in the side navbar ([#18738](https://redirect.github.com/eslint/eslint/issues/18738)) (Amaresh S M)
- [`fec2951`](https://redirect.github.com/eslint/eslint/commit/fec2951d58c704c57bea7e89ffde119e4dc621e3) docs: add version support page to the dropdown ([#18730](https://redirect.github.com/eslint/eslint/issues/18730)) (Amaresh S M)
- [`38a0661`](https://redirect.github.com/eslint/eslint/commit/38a0661872dd6f1db2f53501895c58e8cf4e8064) docs: Fix typo ([#18735](https://redirect.github.com/eslint/eslint/issues/18735)) (Zaina Al Habash)
- [`3c32a9e`](https://redirect.github.com/eslint/eslint/commit/3c32a9e23c270d83bd8b2649e78aabb76992928e) docs: Update yarn command for creating ESLint config ([#18739](https://redirect.github.com/eslint/eslint/issues/18739)) (Temitope Ogunleye)
- [`f9ac978`](https://redirect.github.com/eslint/eslint/commit/f9ac978de629c9a702febcf478a743c5ab11fcf6) docs: Update README (GitHub Actions Bot)
#### Chores
- [`461b2c3`](https://redirect.github.com/eslint/eslint/commit/461b2c35786dc5fd5e146f370bdcafd32938386f) chore: upgrade to `@eslint/js@9.9.0` ([#18765](https://redirect.github.com/eslint/eslint/issues/18765)) (Francesco Trotta)
- [`59dba1b`](https://redirect.github.com/eslint/eslint/commit/59dba1b3404391f5d968be578f0205569d5d41b2) chore: package.json update for [@eslint/js](https://redirect.github.com/eslint/js) release (Jenkins)
- [`fea8563`](https://redirect.github.com/eslint/eslint/commit/fea8563d3372a663aa7a1a676290c34cfb8452ba) chore: update dependency [@eslint/core](https://redirect.github.com/eslint/core) to ^0.3.0 ([#18724](https://redirect.github.com/eslint/eslint/issues/18724)) (renovate\[bot])
- [`aac191e`](https://redirect.github.com/eslint/eslint/commit/aac191e6701495666c264f71fc440207ea19251f) chore: update dependency [@eslint/json](https://redirect.github.com/eslint/json) to ^0.3.0 ([#18760](https://redirect.github.com/eslint/eslint/issues/18760)) (renovate\[bot])
- [`b97fa05`](https://redirect.github.com/eslint/eslint/commit/b97fa051375d1a4592faf251c783691d0b0b9ab9) chore: update wdio dependencies for more stable tests ([#18759](https://redirect.github.com/eslint/eslint/issues/18759)) (Christian Bromann)
### [`v9.8.0`](https://redirect.github.com/eslint/eslint/compare/v9.7.0...63881dc11299aba1d0960747c199a4cf48d6b9c8)
[Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.7.0...v9.8.0)
### [`v9.7.0`](https://redirect.github.com/eslint/eslint/releases/tag/v9.7.0)
[Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.6.0...v9.7.0)
#### Features
- [`7bd9839`](https://redirect.github.com/eslint/eslint/commit/7bd98398f112da020eddcda2c26cf4cc563af004) feat: add support for es2025 duplicate named capturing groups ([#18630](https://redirect.github.com/eslint/eslint/issues/18630)) (Yosuke Ota)
- [`1381394`](https://redirect.github.com/eslint/eslint/commit/1381394a75b5902ce588455765a3919e2f138a7a) feat: add `regex` option in `no-restricted-imports` ([#18622](https://redirect.github.com/eslint/eslint/issues/18622)) (Nitin Kumar)
#### Bug Fixes
- [`14e9f81`](https://redirect.github.com/eslint/eslint/commit/14e9f81ccdb51d2b915b68f442d48ced0a691646) fix: destructuring in catch clause in `no-unused-vars` ([#18636](https://redirect.github.com/eslint/eslint/issues/18636)) (Francesco Trotta)
#### Documentation
- [`9f416db`](https://redirect.github.com/eslint/eslint/commit/9f416db680ad01716a769296085bf3eb93f76424) docs: Add Powered by Algolia label to the search. ([#18633](https://redirect.github.com/eslint/eslint/issues/18633)) (Amaresh S M)
- [`c8d26cb`](https://redirect.github.com/eslint/eslint/commit/c8d26cb4a2f9d89bfc1914167d3e9f1d3314ffe7) docs: Open JS Foundation -> OpenJS Foundation ([#18649](https://redirect.github.com/eslint/eslint/issues/18649)) (Milos Djermanovic)
- [`6e79ac7`](https://redirect.github.com/eslint/eslint/commit/6e79ac76f44b34c24a3e92c20713fbafe1dcbae2) docs: `loadESLint` does not support option `cwd` ([#18641](https://redirect.github.com/eslint/eslint/issues/18641)) (Francesco Trotta)
#### Chores
- [`793b718`](https://redirect.github.com/eslint/eslint/commit/793b7180119e7e440d685defb2ee01597574ef1e) chore: upgrade [@eslint/js](https://redirect.github.com/eslint/js)[@9](https://redirect.github.com/9).7.0 ([#18680](https://redirect.github.com/eslint/eslint/issues/18680)) (Francesco Trotta)
- [`7ed6f9a`](https://redirect.github.com/eslint/eslint/commit/7ed6f9a4db702bbad941422f456451a8dba7a450) chore: package.json update for [@eslint/js](https://redirect.github.com/eslint/js) release (Jenkins)
- [`7bcda76`](https://redirect.github.com/eslint/eslint/commit/7bcda760369c44d0f1131fccaaf1ccfed5af85f1) refactor: Add type references ([#18652](https://redirect.github.com/eslint/eslint/issues/18652)) (Nicholas C. Zakas)
- [`51bf57c`](https://redirect.github.com/eslint/eslint/commit/51bf57c493a65baeee3a935f2d0e52e27271fb48) chore: add tech sponsors through actions ([#18624](https://redirect.github.com/eslint/eslint/issues/18624)) (Strek)
- [`6320732`](https://redirect.github.com/eslint/eslint/commit/6320732c3e2a52a220552e348108c53c60f9ef7a) refactor: don't use `parent` property in `NodeEventGenerator` ([#18653](https://redirect.github.com/eslint/eslint/issues/18653)) (Milos Djermanovic)
- [`9e6d640`](https://redirect.github.com/eslint/eslint/commit/9e6d6405c3ee774c2e716a3453ede9696ced1be7) refactor: move "Parsing error" prefix adding to Linter ([#18650](https://redirect.github.com/eslint/eslint/issues/18650)) (Milos Djermanovic)
### [`v9.6.0`](https://redirect.github.com/eslint/eslint/compare/v9.5.0...473d1bb7c3dfcf629ac048ca811f4b5eef04a692)
[Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.5.0...v9.6.0)
### [`v9.5.0`](https://redirect.github.com/eslint/eslint/compare/v9.4.0...535235701fb029db6f656bd4e58acdfdeb8c02de)
[Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.4.0...v9.5.0)
### [`v9.4.0`](https://redirect.github.com/eslint/eslint/compare/v9.3.0...a5f7e589eca05a8a30bd2532380c304759cc8225)
[Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.3.0...v9.4.0)
### [`v9.3.0`](https://redirect.github.com/eslint/eslint/compare/v9.2.0...41a871cf43874e2f27ad08554c7900daf0e94b06)
[Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.2.0...v9.3.0)
### [`v9.2.0`](https://redirect.github.com/eslint/eslint/compare/v9.1.1...271e7ab1adc45a7b2f66cfea55a54e6048d9749a)
[Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.1.1...v9.2.0)
### [`v9.1.1`](https://redirect.github.com/eslint/eslint/compare/v9.1.0...b4d2512809a1b28466ad1ce5af9d01c181b9bf9e)
[Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.1.0...v9.1.1)
### [`v9.1.0`](https://redirect.github.com/eslint/eslint/compare/v9.0.0...b78d831e244171c939279b03be519b5c13836fce)
[Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.0.0...v9.1.0)
### [`v9.0.0`](https://redirect.github.com/eslint/eslint/compare/v8.57.0...e0cbc50179adac1670f4e0bd9093387a51f4f42a)
[Compare Source](https://redirect.github.com/eslint/eslint/compare/v8.57.0...v9.0.0)
sindresorhus/execa (execa)
### [`v9.3.1`](https://redirect.github.com/sindresorhus/execa/compare/v9.3.0...0a51f7cbef53e7290a3604e585e1b2e61da37367)
[Compare Source](https://redirect.github.com/sindresorhus/execa/compare/v9.3.0...v9.3.1)
### [`v9.3.0`](https://redirect.github.com/sindresorhus/execa/releases/tag/v9.3.0)
[Compare Source](https://redirect.github.com/sindresorhus/execa/compare/v9.2.0...v9.3.0)
#### Features
- The [`verbose`](docs/api.md#optionsverbose) option can now be [a function](docs/api.md#verbose-function) to [customize logging](docs/debugging.md#custom-logging). ([#1130](https://redirect.github.com/sindresorhus/execa/issues/1130))
### [`v9.2.0`](https://redirect.github.com/sindresorhus/execa/releases/tag/v9.2.0)
[Compare Source](https://redirect.github.com/sindresorhus/execa/compare/v9.1.0...v9.2.0)
This release includes a [new set of methods](docs/ipc.md) to exchange messages between the current process and a Node.js subprocess, also known as "IPC". This allows [passing](docs/input.md#any-input-type) and [returning](docs/output.md#any-output-type) almost any message type to/from a Node.js subprocess. Also, [debugging](docs/ipc.md#debugging) IPC is now much easier.
Moreover, a new [`gracefulCancel`](docs/api.md#optionsgracefulcancel) option has also been added to [terminate a subprocess gracefully](docs/termination.md#graceful-termination).
For a deeper dive-in, please check and share the [release post](https://medium.com/@ehmicky/ipc-made-easy-with-execa-9-2-939c6a358731)!
Thanks [@iiroj](https://redirect.github.com/iiroj) for your contribution, [@SimonSiefke](https://redirect.github.com/SimonSiefke) and [@adymorz](https://redirect.github.com/adymorz) for reporting the bugs fixed in this release, and [@karlhorky](https://redirect.github.com/karlhorky) for improving the documentation!
#### Deprecations
- Passing `'ipc'` to the [`stdio`](docs/api.md#optionsstdio) option has been deprecated. It will be removed in the next major release. Instead, the [`ipc: true`](docs/api.md#optionsipc) option should be used. ([#1056](https://redirect.github.com/sindresorhus/execa/issues/1056))
```diff
- await execa('npm', ['run', 'build'], {stdio: ['pipe', 'pipe', 'pipe', 'ipc']});
+ await execa('npm', ['run', 'build'], {ipc: true});
```
- The [`execaCommand()`](https://redirect.github.com/sindresorhus/execa/blob/v9.1.0/docs/api.md#execacommandcommand-options) method has been deprecated. It will be removed in the next major release. If most cases, the [template string syntax](docs/execution.md#template-string-syntax) should be used instead.
```diff
- 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)](https://redirect.github.com/sindresorhus/execa/blob/main/docs/api.md#parsecommandstringcommand) can split that string into an array. [More info.](docs/escaping.md) ([#1054](https://redirect.github.com/sindresorhus/execa/issues/1054))
```diff
- 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`](docs/api.md#optionsgracefulcancel) option and [`getCancelSignal()`](docs/api.md#getcancelsignal) method to [terminate a subprocess gracefully](docs/termination.md#graceful-termination). [`error.isGracefullyCanceled`](docs/api.md#errorisgracefullycanceled) was also added. ([#1109](https://redirect.github.com/sindresorhus/execa/issues/1109))
- Add [`error.isForcefullyTerminated`](docs/api.md#errorisforcefullyterminated). It is `true` when the subprocess was terminated by the [`forceKillAfterDelay`](docs/api.md#optionsforcekillafterdelay) option. ([#1111](https://redirect.github.com/sindresorhus/execa/issues/1111))
- New methods to simplify exchanging messages between the current process and the subprocess. [More info.](docs/ipc.md) ([#1059](https://redirect.github.com/sindresorhus/execa/issues/1059), [#1061](https://redirect.github.com/sindresorhus/execa/issues/1061), [#1076](https://redirect.github.com/sindresorhus/execa/issues/1076), [#1077](https://redirect.github.com/sindresorhus/execa/issues/1077), [#1079](https://redirect.github.com/sindresorhus/execa/issues/1079), [#1082](https://redirect.github.com/sindresorhus/execa/issues/1082), [#1083](https://redirect.github.com/sindresorhus/execa/issues/1083), [#1086](https://redirect.github.com/sindresorhus/execa/issues/1086), [#1087](https://redirect.github.com/sindresorhus/execa/issues/1087), [#1088](https://redirect.github.com/sindresorhus/execa/issues/1088), [#1089](https://redirect.github.com/sindresorhus/execa/issues/1089), [#1090](https://redirect.github.com/sindresorhus/execa/issues/1090), [#1091](https://redirect.github.com/sindresorhus/execa/issues/1091), [#1092](https://redirect.github.com/sindresorhus/execa/issues/1092), [#1094](https://redirect.github.com/sindresorhus/execa/issues/1094), [#1095](https://redirect.github.com/sindresorhus/execa/issues/1095), [#1098](https://redirect.github.com/sindresorhus/execa/issues/1098), [#1104](https://redirect.github.com/sindresorhus/execa/issues/1104), [#1107](https://redirect.github.com/sindresorhus/execa/issues/1107))
- The current process sends messages with [`subprocess.sendMessage(message)`](docs/api.md#subprocesssendmessagemessage-sendmessageoptions) and receives them with [`subprocess.getOneMessage()`](docs/api.md#subprocessgetonemessagegetonemessageoptions). [`subprocess.getEachMessage()`](docs/api.md#subprocessgeteachmessagegeteachmessageoptions) listens to multiple messages.
- The subprocess uses [`sendMessage(message)`](docs/api.md#sendmessagemessage-sendmessageoptions), [`getOneMessage()`](docs/api.md#getonemessagegetonemessageoptions) and [`getEachMessage()`](docs/api.md#geteachmessagegeteachmessageoptions) instead. Those are the same methods, but imported directly from the `'execa'` module.
- The [`ipcInput`](docs/ipc.md#send-an-initial-message) option sends an IPC message from the current process to the subprocess as it starts. This enables [passing almost any input type](docs/input.md#any-input-type) to a Node.js subprocess. ([#1068](https://redirect.github.com/sindresorhus/execa/issues/1068))
- The [`result.ipcOutput`](docs/ipc.md#retrieve-all-messages) array contains all the IPC messages sent by the subprocess to the current process. This enables [returning almost any output type](docs/output.md#any-output-type) from a Node.js subprocess. ([#1067](https://redirect.github.com/sindresorhus/execa/issues/1067), [#1071](https://redirect.github.com/sindresorhus/execa/issues/1071), [#1075](https://redirect.github.com/sindresorhus/execa/issues/1075))
- The [error message](docs/errors.md#error-message) now [contains every IPC message](docs/ipc.md#debugging) sent by the subprocess. ([#1067](https://redirect.github.com/sindresorhus/execa/issues/1067))
- The [`verbose: 'full'`](docs/api.md#optionsverbose) option now logs every IPC message sent by the subprocess, for debugging. More info [here](docs/ipc.md#debugging) and [there](docs/output.md#stdoutstderr-specific-options). ([#1063](https://redirect.github.com/sindresorhus/execa/issues/1063))
#### Types
- Add [`ExecaMethod`](docs/typescript.md#available-types), [`ExecaNodeMethod`](docs/typescript.md#available-types) and [`ExecaScriptMethod`](docs/typescript.md#available-types), [`ExecaSyncMethod`](docs/typescript.md#synchronous-execution) and [`ExecaScriptSyncMethod`](docs/typescript.md#synchronous-execution) types. ([#1066](https://redirect.github.com/sindresorhus/execa/issues/1066))
- Export the `Message` type, for [IPC](docs/ipc.md). ([#1059](https://redirect.github.com/sindresorhus/execa/issues/1059))
- Fix type of `forceKillAfterDelay: true` option. ([#1116](https://redirect.github.com/sindresorhus/execa/issues/1116))
#### Bug fixes
- Fix passing a [`{file}`](docs/output.md#file-output) to both the [`stdin`](docs/api.md#optionsstdin) and the [`stdout`](docs/api.md#optionsstdout) or [`stderr`](docs/api.md#optionsstderr) options. ([#1058](https://redirect.github.com/sindresorhus/execa/issues/1058))
- Fix multiple minor problems with the [`cancelSignal`](docs/termination.md#canceling) option. ([#1108](https://redirect.github.com/sindresorhus/execa/issues/1108))
- Fix accidental publishing of Vim backup files. ([#1074](https://redirect.github.com/sindresorhus/execa/issues/1074))
- Fix `engines.node` field in [`package.json`](package.json). Supported Node.js version is `^18.19.0` or `>=20.5.0`. (by [@iiroj](https://redirect.github.com/iiroj)) ([#1101](https://redirect.github.com/sindresorhus/execa/issues/1101))
### [`v9.1.0`](https://redirect.github.com/sindresorhus/execa/releases/tag/v9.1.0)
[Compare Source](https://redirect.github.com/sindresorhus/execa/compare/v9.0.2...v9.1.0)
#### Features (types)
- Export [`TemplateExpression`](docs/typescript.md#available-types) type. ([#1049](https://redirect.github.com/sindresorhus/execa/issues/1049))
### [`v9.0.2`](https://redirect.github.com/sindresorhus/execa/releases/tag/v9.0.2)
[Compare Source](https://redirect.github.com/sindresorhus/execa/compare/v9.0.1...v9.0.2)
#### Bug fixes (types)
- Do not require using `--lib dom` for TypeScript users ([#1043](https://redirect.github.com/sindresorhus/execa/issues/1043), [#1044](https://redirect.github.com/sindresorhus/execa/issues/1044))
- Fix type of the `reject` option ([#1046](https://redirect.github.com/sindresorhus/execa/issues/1046))
### [`v9.0.1`](https://redirect.github.com/sindresorhus/execa/releases/tag/v9.0.1)
[Compare Source](https://redirect.github.com/sindresorhus/execa/compare/v9.0.0...v9.0.1)
#### Bug fixes (types)
- Fix types not being importable ([#1033](https://redirect.github.com/sindresorhus/execa/issues/1033)) [`3bdab60`](https://redirect.github.com/sindresorhus/execa/commit/3bdab60)
- Fix complexity bug with types ([#1037](https://redirect.github.com/sindresorhus/execa/issues/1037)) [`6cc519b`](https://redirect.github.com/sindresorhus/execa/commit/6cc519b)
- Fix complexity bug with types ([#1035](https://redirect.github.com/sindresorhus/execa/issues/1035)) [`fee011d`](https://redirect.github.com/sindresorhus/execa/commit/fee011d)
### [`v9.0.0`](https://redirect.github.com/sindresorhus/execa/releases/tag/v9.0.0)
[Compare Source](https://redirect.github.com/sindresorhus/execa/compare/v8.0.1...v9.0.0)
This major release brings many important features including:
- [Split the output](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#3a26) into lines, or [progressively iterate](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#3a26) over them.
- [Transform or filter](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#cbd6) the input/output using [simple functions](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#399a).
- Print the output [to the terminal](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#693f) while still retrieving it programmatically.
- Redirect the input/output [from/to a file](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#693f).
- [Advanced piping](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#ec17) between multiple subprocesses.
- Improved [verbose mode](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#2913), for debugging.
- More [detailed errors](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#40d7), including when [terminating subprocesses](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#668c).
- Enhanced [template string syntax](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#725b).
- [Global/shared options](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#bcbf).
- [Web streams](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#5731) and Transform streams support.
- [Convert the subprocess](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#47b9) to a stream.
- [New documentation](https://redirect.github.com/sindresorhus/execa#documentation) with many examples.
Please check the [release post](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f) for a high-level overview! For the full list of breaking changes, features and bug fixes, please read below.
Thanks [@younggglcy](https://redirect.github.com/younggglcy), [@koshic](https://redirect.github.com/koshic), [@am0o0](https://redirect.github.com/am0o0) and [@codesmith-emmy](https://redirect.github.com/codesmith-emmy) for your help!
***
One of the maintainers [@ehmicky](https://redirect.github.com/ehmicky) is looking for a remote full-time position. Specialized in Node.js back-ends and CLIs, he led Netlify [Build](https://www.netlify.com/platform/core/build/), [Plugins](https://www.netlify.com/integrations/) and Configuration for 2.5 years. Feel free to contact him on [his website](https://www.mickael-hebert.com) or on [LinkedIn](https://www.linkedin.com/in/mickaelhebert/)!
***
#### Breaking changes
- Minimal supported Node.js version is now `18.19.0`. ([`834e372`](https://redirect.github.com/sindresorhus/execa/commit/834e3726))
- When the [`encoding` option](docs/api.md#optionsencoding) is `'buffer'`, the output ([`result.stdout`](docs/api.md#resultstdout), [`result.stderr`](docs/api.md#resultstderr), [`result.all`](docs/api.md#resultall)) is now an [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) instead of a [`Buffer`](https://nodejs.org/api/buffer.html#class-buffer). For more information, see [this blog post](https://sindresorhus.com/blog/goodbye-nodejs-buffer). (by [@younggglcy](https://redirect.github.com/younggglcy)) ([#586](https://redirect.github.com/sindresorhus/execa/issues/586))
```js
const {stdout} = await execa('node', ['file.js'], {encoding: 'buffer'});
console.log(stdout); // This is now an Uint8Array
```
- Renamed some of the allowed values for the [`encoding`](docs/api.md#optionsencoding) option. ([#586](https://redirect.github.com/sindresorhus/execa/issues/586), [#928](https://redirect.github.com/sindresorhus/execa/issues/928))
```diff
- 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()` and `subprocess.pipeAll()` has been removed. Instead, a [`{file: './path'}` object](docs/output.md#file-output) should be passed to the [`stdout`](docs/api.md#optionsstdout) or [`stderr`](docs/api.md#optionsstderr) option. ([#752](https://redirect.github.com/sindresorhus/execa/issues/752))
```diff
- 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](https://nodejs.org/api/stream.html#class-streamwritable) to `subprocess.pipeStdout()`, `subprocess.pipeStderr()` and `subprocess.pipeAll()` has been removed. Instead, the stream should be passed to the [`stdout`](docs/api.md#optionsstdout) or [`stderr`](docs/api.md#optionsstderr) option. If the stream [does not have a file descriptor](docs/streams.md#file-descriptors), [`['pipe', stream]`](docs/output.md#multiple-targets) should be passed instead. ([#752](https://redirect.github.com/sindresorhus/execa/issues/752))
```diff
- 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()` and `subprocess.pipeAll()` methods have been renamed to [`subprocess.pipe()`](docs/api.md#subprocesspipefile-arguments-options). The command and its arguments can be passed to `subprocess.pipe()` directly, without calling `execa()` a second time. The [`from`](docs/api.md#pipeoptionsfrom) piping option can specify `'stdout'` (the default value), `'stderr'` or `'all'`. ([#757](https://redirect.github.com/sindresorhus/execa/issues/757))
```diff
- 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 to [`cancelSignal`](docs/api.md#optionscancelsignal). ([#880](https://redirect.github.com/sindresorhus/execa/issues/880))
```diff
- await execa('node', ['file.js'], {signal: abortController.signal});
+ await execa('node', ['file.js'], {cancelSignal: abortController.signal});
```
- Renamed `error.killed` to [`error.isTerminated`](docs/api.md#erroristerminated). ([#625](https://redirect.github.com/sindresorhus/execa/issues/625))
```diff
try {
await execa('node', ['file.js']);
} catch (error) {
- if (error.killed) {
+ if (error.isTerminated) {
// ...
}
}
```
- `subprocess.cancel()` has been removed. Please use either [`subprocess.kill()`](docs/api.md#subprocesskillsignal-error) or the [`cancelSignal`](docs/api.md#optionscancelsignal) option instead. ([#711](https://redirect.github.com/sindresorhus/execa/issues/711))
```diff
- subprocess.cancel();
+ subprocess.kill();
```
- Renamed the `forceKillAfterTimeout` option to [`forceKillAfterDelay`](docs/api.md#optionsforcekillafterdelay). Also, it is now passed to [`execa()`](docs/api.md#execafile-arguments-options) instead of [`subprocess.kill()`](docs/api.md#subprocesskillsignal-error). ([#714](https://redirect.github.com/sindresorhus/execa/issues/714), [#723](https://redirect.github.com/sindresorhus/execa/issues/723))
```diff
- const subprocess = execa('node', ['file.js']);
- subprocess.kill('SIGTERM', {forceKillAfterTimeout: 1000});
+ const subprocess = execa('node', ['file.js'], {forceKillAfterDelay: 1000});
+ subprocess.kill('SIGTERM');
```
- The [`verbose`](docs/api.md#optionsverbose) option is now a string enum instead of a boolean. `false` has been renamed to `'none'` and `true` has been renamed to [`'short'`](docs/debugging.md#short-mode). ([#884](https://redirect.github.com/sindresorhus/execa/issues/884))
```diff
- 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 to [`nodePath`](docs/api.md#optionsnodepath). It is now a noop unless the [`node`](docs/api.md#optionsnode) option is `true`. Also, it now works even if the [`preferLocal`](docs/api.md#optionspreferlocal) option is `false`. ([#812](https://redirect.github.com/sindresorhus/execa/issues/812), [#815](https://redirect.github.com/sindresorhus/execa/issues/815))
```diff
- await execa('node', ['file.js'], {execPath: './path/to/node'});
+ await execa('node', ['file.js'], {nodePath: './path/to/node'});
```
- The [default value](docs/ipc.md#message-type) for the [`serialization`](docs/api.md#optionsserialization) option is now [`'advanced'`](https://nodejs.org/api/child_process.html#advanced-serialization) instead of `'json'`. In particular, when calling [`subprocess.send(object)`](docs/api.md#subprocesssendmessage) with an object that contains functions or symbols, those were previously silently removed. Now this will throw an exception. ([#905](https://redirect.github.com/sindresorhus/execa/issues/905))
```diff
- subprocess.send({example: true, getExample() {}});
+ subprocess.send({example: true});
```
- If [`subprocess.stdout`](docs/api.md#subprocessstdout), [`subprocess.stderr`](docs/api.md#subprocessstderr) or [`subprocess.all`](docs/api.md#subprocessall) is manually piped, the [`.pipe()`](https://nodejs.org/api/stream.html#readablepipedestination-options) call must now happen as soon as `subprocess` is created. Otherwise, the output at the beginning of the subprocess might be missing. ([#658](https://redirect.github.com/sindresorhus/execa/issues/658), [#747](https://redirect.github.com/sindresorhus/execa/issues/747))
```diff
const subprocess = execa('node', ['file.js']);
- setTimeout(() => {
subprocess.stdout.pipe(process.stdout);
- }, 0);
```
- Signals passed to [`subprocess.kill()`](docs/api.md#subprocesskillsignal-error) and to the [`killSignal`](docs/api.md#optionskillsignal) option cannot be lowercase anymore. ([#1025](https://redirect.github.com/sindresorhus/execa/issues/1025))
```diff
- 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](docs/execution.md#template-string-syntax) with any method (including [`execa()`](docs/api.md#execacommand)), as opposed to only [`$`](docs/api.md#file-arguments-options). Conversely, `$` can now use the [regular array syntax](docs/scripts.md#template-string-syntax). ([#933](https://redirect.github.com/sindresorhus/execa/issues/933))
- A command's template string can span [multiple lines](docs/execution.md#multiple-lines). ([#843](https://redirect.github.com/sindresorhus/execa/issues/843))
- [Share options](docs/execution.md#globalshared-options) between multiple calls, or set global options, by using [`execa(options)`](docs/api#execaoptions). ([#933](https://redirect.github.com/sindresorhus/execa/issues/933), [#965](https://redirect.github.com/sindresorhus/execa/issues/965))
- Pass a file URL (as opposed to a file path string) to [`execa()`](docs/api.md#execafile-arguments-options), [`execaNode()`](docs/api.md#execanodescriptpath-arguments-options), the [`inputFile`](docs/api.md#optionsinputfile) option, the [`nodePath`](docs/api.md#optionsnodepath) option or the [`shell`](docs/api.md#optionsshell) option. ([#630](https://redirect.github.com/sindresorhus/execa/issues/630), [#631](https://redirect.github.com/sindresorhus/execa/issues/631), [#632](https://redirect.github.com/sindresorhus/execa/issues/632), [#635](https://redirect.github.com/sindresorhus/execa/issues/635))
##### Text lines
- [Split the output](docs/lines.md#simple-splitting) into text lines by using the [`lines`](docs/api.md#optionslines) option. ([#741](https://redirect.github.com/sindresorhus/execa/issues/741), [#929](https://redirect.github.com/sindresorhus/execa/issues/929), [#931](https://redirect.github.com/sindresorhus/execa/issues/931), [#948](https://redirect.github.com/sindresorhus/execa/issues/948), [#951](https://redirect.github.com/sindresorhus/execa/issues/951), [#957](https://redirect.github.com/sindresorhus/execa/issues/957))
- Subprocess is now an [async iterable](docs/api.md#subprocesssymbolasynciterator), [iterating over the output](docs/lines.md#progressive-splitting) lines while the subprocess is running. ([#923](https://redirect.github.com/sindresorhus/execa/issues/923))
##### Piping multiple subprocesses
- Simpler syntax: pass the [command directly](docs/pipe.md#array-syntax) to [`subprocess.pipe()`](docs/api.md#subprocesspipefile-arguments-options) without calling [`execa()`](docs/api.md#execafile-arguments-options). A [template string](docs/pipe.md#template-string-syntax) can also be used. ([#840](https://redirect.github.com/sindresorhus/execa/issues/840), [#859](https://redirect.github.com/sindresorhus/execa/issues/859), [#864](https://redirect.github.com/sindresorhus/execa/issues/864))
- [Wait for both subprocesses](docs/pipe.md#result) to complete. [Error handling](docs/pipe.md#errors) has been improved too. ([#757](https://redirect.github.com/sindresorhus/execa/issues/757), [#778](https://redirect.github.com/sindresorhus/execa/issues/778), [#834](https://redirect.github.com/sindresorhus/execa/issues/834), [#854](https://redirect.github.com/sindresorhus/execa/issues/854))
- Retrieve the [result](docs/pipe.md#result) of each subprocess (not only the last one) by using [`result.pipedFrom`](docs/api.md#resultpipedfrom) and [`error.pipedFrom`](docs/api.md#resultpipedfrom). ([#834](https://redirect.github.com/sindresorhus/execa/issues/834))
- Pipe 1 or [many subprocesses](docs/pipe.md#multiple-sources-1-destination) to 1 or [many subprocesses](docs/pipe.md#1-source-multiple-destinations). ([#834](https://redirect.github.com/sindresorhus/execa/issues/834))
- Pipe subprocesses using [other file descriptors](docs/pipe.md#source-file-descriptor) than `stdin`/`stdout`/`stderr` by using the [`from`](docs/api.md#pipeoptionsfrom) and [`to`](docs/api.md#pipeoptionsto) piping options. ([#757](https://redirect.github.com/sindresorhus/execa/issues/757), [#834](https://redirect.github.com/sindresorhus/execa/issues/834), [#903](https://redirect.github.com/sindresorhus/execa/issues/903), [#920](https://redirect.github.com/sindresorhus/execa/issues/920))
- [Cancel piping](docs/pipe.md#unpipe) subprocesses by using the [`unpipeSignal`](docs/api.md#pipeoptionsunpipesignal) piping option. ([#834](https://redirect.github.com/sindresorhus/execa/issues/834), [#852](https://redirect.github.com/sindresorhus/execa/issues/852))
##### Input/output
- Pass an array with [multiple values](docs/output.md#multiple-targets) to the [`stdin`](docs/api.md#optionsstdin), [`stdout`](docs/api.md#optionsstdout) and [`stderr`](docs/api.md#optionsstderr) options. For example, [`stdout: ['inherit', 'pipe']`](docs/output.md#multiple-targets) prints the output [to the terminal](docs/output.md#terminal-output) while still [returning it](docs/output.md#stdout-and-stderr) as [`result.stdout`](docs/api.md#resultstdout). ([#643](https://redirect.github.com/sindresorhus/execa/issues/643), [#765](https://redirect.github.com/sindresorhus/execa/issues/765), [#941](https://redirect.github.com/sindresorhus/execa/issues/941), [#954](https://redirect.github.com/sindresorhus/execa/issues/954))
- Redirect the [input](docs/input.md#file-input)/[output](docs/output.md#file-output) from/to a file by passing a `{file: './path'}` object or a file URL to the [`stdin`](docs/api.md#optionsstdin), [`stdout`](docs/api.md#optionsstdout) or [`stderr`](docs/api.md#optionsstderr) option. ([#610](https://redirect.github.com/sindresorhus/execa/issues/610), [#614](https://redirect.github.com/sindresorhus/execa/issues/614), [#621](https://redirect.github.com/sindresorhus/execa/issues/621), [#671](https://redirect.github.com/sindresorhus/execa/issues/671), [#1004](https://redirect.github.com/sindresorhus/execa/issues/1004))
- [Transform](docs/transform.md) or [filter](docs/transform.md#filtering) the input/output by passing a generator function to the [`stdin`](docs/api.md#optionsstdin), [`stdout`](docs/api.md#optionsstdout) or [`stderr`](docs/api.md#optionsstderr) option. ([#693](https://redirect.github.com/sindresorhus/execa/issues/693), [#697](https://redirect.github.com/sindresorhus/execa/issues/697), [#698](https://redirect.github.com/sindresorhus/execa/issues/698), [#699](https://redirect.github.com/sindresorhus/execa/issues/699), [#709](https://redirect.github.com/sindresorhus/execa/issues/709), [#736](https://redirect.github.com/sindresorhus/execa/issues/736), [#737](https://redirect.github.com/sindresorhus/execa/issues/737), [#739](https://redirect.github.com/sindresorhus/execa/issues/739), [#740](https://redirect.github.com/sindresorhus/execa/issues/740), [#746](https://redirect.github.com/sindresorhus/execa/issues/746), [#748](https://redirect.github.com/sindresorhus/execa/issues/748), [#755](https://redirect.github.com/sindresorhus/execa/issues/755), [#756](https://redirect.github.com/sindresorhus/execa/issues/756), [#780](https://redirect.github.com/sindresorhus/execa/issues/780), [#783](https://redirect.github.com/sindresorhus/execa/issues/783), [#867](https://redirect.github.com/sindresorhus/execa/issues/867), [#915](https://redirect.github.com/sindresorhus/execa/issues/915), [#916](https://redirect.github.com/sindresorhus/execa/issues/916), [#917](https://redirect.github.com/sindresorhus/execa/issues/917), [#919](https://redirect.github.com/sindresorhus/execa/issues/919), [#924](https://redirect.github.com/sindresorhus/execa/issues/924), [#926](https://redirect.github.com/sindresorhus/execa/issues/926), [#945](https://redirect.github.com/sindresorhus/execa/issues/945), [#969](https://redirect.github.com/sindresorhus/execa/issues/969))
- Provide some [binary input](docs/binary.md#binary-input) by passing an [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) to the [`input`](docs/api.md#optionsinput) or [`stdin`](docs/api.md#optionsstdin) option. ([`834e372`](https://redirect.github.com/sindresorhus/execa/commit/834e3726), [#670](https://redirect.github.com/sindresorhus/execa/issues/670), [#1029](https://redirect.github.com/sindresorhus/execa/issues/1029))
- Provide some [progressive input](docs/streams.md#iterables-as-input) by passing a sync/async [iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#the_async_iterator_and_async_iterable_protocols) to the [`stdin`](docs/api.md#optionsstdin) option. ([#604](https://redirect.github.com/sindresorhus/execa/issues/604), [#944](https://redirect.github.com/sindresorhus/execa/issues/944))
- Provide [multiple inputs](docs/output.md#multiple-targets) by combining the [`stdin`](docs/api.md#optionsstdin), [`input`](docs/api.md#optionsinput) and [`inputFile`](docs/api.md#optionsinputfile) options. ([#666](https://redirect.github.com/sindresorhus/execa/issues/666))
- Return [other file descriptors](docs/output.md#additional-file-descriptors) than [`result.stdout`](docs/api.md#resultstdout) and [`result.stderr`](docs/api.md#resultstderr) by using [`result.stdio`](docs/api.md#resultstdio). ([#676](https://redirect.github.com/sindresorhus/execa/issues/676))
- [Specify different values](docs/output.md#stdoutstderr-specific-options) for [`stdout`](docs/api.md#optionsstdout) and [`stderr`](docs/api.md#optionsstderr) with the following options: [`verbose`](docs/api.md#optionsverbose), [`lines`](docs/api.md#optionslines), [`stripFinalNewline`](docs/api.md#optionsstripfinalnewline), [`maxBuffer`](docs/api.md#optionsmaxbuffer), [`buffer`](docs/api.md#optionsbuffer). ([#966](https://redirect.github.com/sindresorhus/execa/issues/966), [#970](https://redirect.github.com/sindresorhus/execa/issues/970), [#971](https://redirect.github.com/sindresorhus/execa/issues/971), [#972](https://redirect.github.com/sindresorhus/execa/issues/972), [#973](https://redirect.github.com/sindresorhus/execa/issues/973), [#974](https://redirect.github.com/sindresorhus/execa/issues/974))
##### Streams
- Redirect the input/output from/to a [web stream](docs/streams.md#web-streams) by passing a [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) or [`WritableStream`](https://developer.mozilla.org/en-US/docs/Web/API/WritableStream) to the [`stdin`](docs/api.md#optionsstdin), [`stdout`](docs/api.md#optionsstdout) or [`stderr`](docs/api.md#optionsstderr) option. ([#615](https://redirect.github.com/sindresorhus/execa/issues/615), [#619](https://redirect.github.com/sindresorhus/execa/issues/619), [#645](https://redirect.github.com/sindresorhus/execa/issues/645))
- [Transform or filter](docs/transform.md#duplextransform-streams) the input/output by passing a [`Duplex`](https://nodejs.org/api/stream.html#class-streamduplex), Node.js [`Transform`](https://nodejs.org/api/stream.html#class-streamtransform) or web [`TransformStream`](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream) to the [`stdin`](docs/api.md#optionsstdin), [`stdout`](docs/api.md#optionsstdout) or [`stderr`](docs/api.md#optionsstderr) option. ([#937](https://redirect.github.com/sindresorhus/execa/issues/937), [#938](https://redirect.github.com/sindresorhus/execa/issues/938))
- [Convert the subprocess](docs/streams.md#converting-a-subprocess-to-a-stream) to a stream by using [`subprocess.readable()`](docs/api.md#subprocessreadablereadableoptions), [`subprocess.writable()`](docs/api.md#subprocesswritablewritableoptions) or [`subprocess.duplex()`](docs/api.md#subprocessduplexduplexoptions). ([#912](https://redirect.github.com/sindresorhus/execa/issues/912), [#922](https://redirect.github.com/sindresorhus/execa/issues/922), [#958](https://redirect.github.com/sindresorhus/execa/issues/958))
##### Verbose mode
- Print the subprocess' [completion, duration and errors](docs/debugging.md#short-mode) with the [`verbose: 'short'`](docs/api.md#optionsverbose) or `verbose: 'full'` option. ([#887](https://redirect.github.com/sindresorhus/execa/issues/887), [#890](https://redirect.github.com/sindresorhus/execa/issues/890))
- Print the subprocess' [output](docs/debugging.md#full-mode) with the [`verbose: 'full'`](docs/api.md#optionsverbose) option. ([#884](https://redirect.github.com/sindresorhus/execa/issues/884), [#950](https://redirect.github.com/sindresorhus/execa/issues/950), [#962](https://redirect.github.com/sindresorhus/execa/issues/962), [#990](https://redirect.github.com/sindresorhus/execa/issues/990))
- Prettier formatting and [colors](docs/debugging.md#colors) with the [`verbose`](docs/api.md#optionsverbose) option. ([#883](https://redirect.github.com/sindresorhus/execa/issues/883), [#893](https://redirect.github.com/sindresorhus/execa/issues/893), [#894](https://redirect.github.com/sindresorhus/execa/issues/894))
##### Debugging
- Retrieve the subprocess' [duration](docs/debugging.md#duration) by using [`result.durationMs`](docs/api.md#resultdurationms) and [`error.durationMs`](docs/api.md#resultdurationms). ([#896](https://redirect.github.com/sindresorhus/execa/issues/896))
- Retrieve the subprocess' [current directory](docs/environment.md#current-directory) by using [`result.cwd`](docs/api.md#resultcwd). Previously only [`error.cwd`](docs/api.md#execaerror) was available. Also, `result.cwd` and `error.cwd` are now normalized to absolute file paths. ([#803](https://redirect.github.com/sindresorhus/execa/issues/803))
- Printing [`result.escapedCommand`](docs/api.md#resultescapedcommand) in a terminal [is now safe](docs/debugging.md#command). ([#875](https://redirect.github.com/sindresorhus/execa/issues/875))
##### Errors
- The [`ExecaError`](docs/api.md#execaerror) and [`ExecaSyncError`](docs/api.md#execasyncerror) classes [are now exported](docs/errors.md#subprocess-failure). ([#911](https://redirect.github.com/sindresorhus/execa/issues/911))
- Find the subprocess failure's [root cause](docs/termination.md#error-message-and-stack-trace) by using [`error.cause`](docs/api.md#errorcause). ([#911](https://redirect.github.com/sindresorhus/execa/issues/911))
- Know whether [the subprocess failed](docs/errors.md#failure-reason) due to the [`maxBuffer`](docs/api.md#optionsmaxbuffer) option by using [`error.isMaxBuffer`](docs/api.md#errorismaxbuffer). ([#963](https://redirect.github.com/sindresorhus/execa/issues/963))
- Improved [`error.message`](docs/api.md#errormessage): [`error.stdout`](docs/api.md#resultstdout) and [`error.stderr`](docs/api.md#resultstderr) are now [interleaved](docs/output.md#interleaved-output) if the [`all`](docs/api.md#optionsall) option is `true`. [Additional file descriptors](docs/output.md#additional-file-descriptors) are now printed too. Also, the [formatting](docs/errors.md#error-message) has been improved. ([#676](https://redirect.github.com/sindresorhus/execa/issues/676), [#705](https://redirect.github.com/sindresorhus/execa/issues/705), [#991](https://redirect.github.com/sindresorhus/execa/issues/991), [#992](https://redirect.github.com/sindresorhus/execa/issues/992))
- [Control characters](https://en.wikipedia.org/wiki/Control_character) in [`error.message`](docs/api.md#errormessage) are now escaped, so they don't result in visual bugs when printed in a terminal. ([#879](https://redirect.github.com/sindresorhus/execa/issues/879))
- Improved stack trace when an [`error`](https://nodejs.org/api/stream.html#event-error\_1) event is emitted on [`subprocess.stdout`](docs/api.md#subprocessstdout) or [`subprocess.stderr`](docs/api.md#subprocessstderr). ([#814](https://redirect.github.com/sindresorhus/execa/issues/814))
##### Termination
- Specify an [error message or stack trace](docs/termination.md#error-message-and-stack-trace) when terminating a subprocess by passing an error instance to [`subprocess.kill()`](docs/api.md#subprocesskillerror). ([#811](https://redirect.github.com/sindresorhus/execa/issues/811), [#836](https://redirect.github.com/sindresorhus/execa/issues/836), [#1023](https://redirect.github.com/sindresorhus/execa/issues/1023))
- The [`forceKillAfterDelay`](docs/api.md#optionsforcekillafterdelay) and [`killSignal`](docs/api.md#optionskillsignal) options [now apply to terminations](docs/termination.md#default-signal) due not only to [`subprocess.kill()`](docs/api.md#subprocesskillsignal-error) but [also to](docs/termination.md#forceful-termination) the [`cancelSignal`](docs/api.md#optionscancelsignal), [`timeout`](docs/api.md#optionstimeout), [`maxBuffer`](docs/api.md#optionsmaxbuffer) and [`cleanup`](docs/api.md#optionscleanup) options. ([#714](https://redirect.github.com/sindresorhus/execa/issues/714), [#728](https://redirect.github.com/sindresorhus/execa/issues/728))
##### Node.js files
- Use the [`nodePath`](docs/api.md#optionsnodepath) and [`nodeOptions`](docs/api.md#optionsnodeoptions) options with [any method](docs/api.md#methods), as opposed to only [`execaNode()`](docs/api.md#execanodescriptpath-arguments-options), by passing the [`node: true`](docs/api.md#optionsnode) option. ([#804](https://redirect.github.com/sindresorhus/execa/issues/804), [#812](https://redirect.github.com/sindresorhus/execa/issues/812), [#815](https://redirect.github.com/sindresorhus/execa/issues/815))
- When using [`execaNode()`](docs/api.md#execanodescriptpath-arguments-options) or the [`node: true`](docs/api.md#optionsnode) option, the [current Node.js version](docs/node.md#nodejs-version) is now inherited deeply. If the subprocess spawns other subprocesses, they will all use the [same Node.js version](docs/api.md#optionsnodepath). ([#812](https://redirect.github.com/sindresorhus/execa/issues/812), [#815](https://redirect.github.com/sindresorhus/execa/issues/815), [#1011](https://redirect.github.com/sindresorhus/execa/issues/1011))
##### Synchronous execution
- Use the [`all`](docs/api.md#optionsall) and [`buffer: false`](docs/api.md#optionsbuffer) options with [`execaSync()`](docs/api.md#execasyncfile-arguments-options), as opposed to only [`execa()`](docs/api.md#execafile-arguments-options). ([#953](https://redirect.github.com/sindresorhus/execa/issues/953), [#956](https://redirect.github.com/sindresorhus/execa/issues/956))
- Added the [`$.s`](docs/api.md#file-arguments-options) alias for [`$.sync`](docs/api.md#file-arguments-options). ([#594](https://redirect.github.com/sindresorhus/execa/issues/594))
##### Inter-process communication
- Use the [`ipc: true`](docs/api.md#optionsipc) option, as [opposed to the more verbose](docs/ipc.md#exchanging-messages) [`stdio: ['pipe', 'pipe', 'pipe', 'ipc']`](docs/api.md#optionsstdio) option. ([#794](https://redirect.github.com/sindresorhus/execa/issues/794))
##### Input validation
- Improved the validation of the [`input`](docs/api.md#optionsinput), [`timeout`](docs/api.md#optionstimeout), [`cwd`](docs/api.md#optionscwd), [`detached`](docs/api.md#optionsdetached), [`cancelSignal`](docs/api.md#optionscancelsignal) and [`encoding`](docs/api.md#optionsencoding) options. ([#668](https://redirect.github.com/sindresorhus/execa/issues/668), [#715](https://redirect.github.com/sindresorhus/execa/issues/715), [#803](https://redirect.github.com/sindresorhus/execa/issues/803), [#928](https://redirect.github.com/sindresorhus/execa/issues/928), [#940](https://redirect.github.com/sindresorhus/execa/issues/940))
- Improved the validation of the arguments passed to [`execa()`](docs/api.md#execafile-arguments-options) and the [other exported methods](docs/api.md#methods). ([#838](https://redirect.github.com/sindresorhus/execa/issues/838), [#873](https://redirect.github.com/sindresorhus/execa/issues/873), [#899](https://redirect.github.com/sindresorhus/execa/issues/899))
- Improved the validation of signals passed to [`subprocess.kill()
Configuration
📅 Schedule: Branch creation - "every weekend" (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Enabled.
â™» Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
[ ] If you want to rebase/retry this PR, check this box
This PR contains the following updates:
^8.56.12
->^9.0.0
^12.20.55
->^22.0.0
3.0.3
->3.0.4
95fcbd9
->02526f8
^8.57.0
->^9.0.0
^7.2.0
->^9.0.0
1.0.3
->2.0.0
3.2.2
->3.3.3
a783db6
->65d7f2d
69d91a4
->d732dbc
🔡 If you wish to disable git hash updates, add
":disableDigestUpdates"
to the extends array in your config.Release Notes
eslint/eslint (eslint)
### [`v9.9.1`](https://redirect.github.com/eslint/eslint/compare/v9.9.0...8781e6f063e56438dc22346504ff637df3f84daf) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.9.0...v9.9.1) ### [`v9.9.0`](https://redirect.github.com/eslint/eslint/releases/tag/v9.9.0) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.8.0...v9.9.0) #### Features - [`41d0206`](https://redirect.github.com/eslint/eslint/commit/41d02066935b987d2e3b13a08680cc74d7067986) feat: Add support for TS config files ([#18134](https://redirect.github.com/eslint/eslint/issues/18134)) (Arya Emami) - [`3a4eaf9`](https://redirect.github.com/eslint/eslint/commit/3a4eaf921543b1cd5d1df4ea9dec02fab396af2a) feat: add suggestion to `require-await` to remove `async` keyword ([#18716](https://redirect.github.com/eslint/eslint/issues/18716)) (Dave) #### Documentation - [`9fe068c`](https://redirect.github.com/eslint/eslint/commit/9fe068c60db466277a785434496a8f90a9090bed) docs: how to author plugins with configs that extend other configs ([#18753](https://redirect.github.com/eslint/eslint/issues/18753)) (Alec Gibson) - [`48117b2`](https://redirect.github.com/eslint/eslint/commit/48117b27e98639ffe7e78a230bfad9a93039fb7f) docs: add version support page in the side navbar ([#18738](https://redirect.github.com/eslint/eslint/issues/18738)) (Amaresh S M) - [`fec2951`](https://redirect.github.com/eslint/eslint/commit/fec2951d58c704c57bea7e89ffde119e4dc621e3) docs: add version support page to the dropdown ([#18730](https://redirect.github.com/eslint/eslint/issues/18730)) (Amaresh S M) - [`38a0661`](https://redirect.github.com/eslint/eslint/commit/38a0661872dd6f1db2f53501895c58e8cf4e8064) docs: Fix typo ([#18735](https://redirect.github.com/eslint/eslint/issues/18735)) (Zaina Al Habash) - [`3c32a9e`](https://redirect.github.com/eslint/eslint/commit/3c32a9e23c270d83bd8b2649e78aabb76992928e) docs: Update yarn command for creating ESLint config ([#18739](https://redirect.github.com/eslint/eslint/issues/18739)) (Temitope Ogunleye) - [`f9ac978`](https://redirect.github.com/eslint/eslint/commit/f9ac978de629c9a702febcf478a743c5ab11fcf6) docs: Update README (GitHub Actions Bot) #### Chores - [`461b2c3`](https://redirect.github.com/eslint/eslint/commit/461b2c35786dc5fd5e146f370bdcafd32938386f) chore: upgrade to `@eslint/js@9.9.0` ([#18765](https://redirect.github.com/eslint/eslint/issues/18765)) (Francesco Trotta) - [`59dba1b`](https://redirect.github.com/eslint/eslint/commit/59dba1b3404391f5d968be578f0205569d5d41b2) chore: package.json update for [@eslint/js](https://redirect.github.com/eslint/js) release (Jenkins) - [`fea8563`](https://redirect.github.com/eslint/eslint/commit/fea8563d3372a663aa7a1a676290c34cfb8452ba) chore: update dependency [@eslint/core](https://redirect.github.com/eslint/core) to ^0.3.0 ([#18724](https://redirect.github.com/eslint/eslint/issues/18724)) (renovate\[bot]) - [`aac191e`](https://redirect.github.com/eslint/eslint/commit/aac191e6701495666c264f71fc440207ea19251f) chore: update dependency [@eslint/json](https://redirect.github.com/eslint/json) to ^0.3.0 ([#18760](https://redirect.github.com/eslint/eslint/issues/18760)) (renovate\[bot]) - [`b97fa05`](https://redirect.github.com/eslint/eslint/commit/b97fa051375d1a4592faf251c783691d0b0b9ab9) chore: update wdio dependencies for more stable tests ([#18759](https://redirect.github.com/eslint/eslint/issues/18759)) (Christian Bromann) ### [`v9.8.0`](https://redirect.github.com/eslint/eslint/compare/v9.7.0...63881dc11299aba1d0960747c199a4cf48d6b9c8) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.7.0...v9.8.0) ### [`v9.7.0`](https://redirect.github.com/eslint/eslint/releases/tag/v9.7.0) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.6.0...v9.7.0) #### Features - [`7bd9839`](https://redirect.github.com/eslint/eslint/commit/7bd98398f112da020eddcda2c26cf4cc563af004) feat: add support for es2025 duplicate named capturing groups ([#18630](https://redirect.github.com/eslint/eslint/issues/18630)) (Yosuke Ota) - [`1381394`](https://redirect.github.com/eslint/eslint/commit/1381394a75b5902ce588455765a3919e2f138a7a) feat: add `regex` option in `no-restricted-imports` ([#18622](https://redirect.github.com/eslint/eslint/issues/18622)) (Nitin Kumar) #### Bug Fixes - [`14e9f81`](https://redirect.github.com/eslint/eslint/commit/14e9f81ccdb51d2b915b68f442d48ced0a691646) fix: destructuring in catch clause in `no-unused-vars` ([#18636](https://redirect.github.com/eslint/eslint/issues/18636)) (Francesco Trotta) #### Documentation - [`9f416db`](https://redirect.github.com/eslint/eslint/commit/9f416db680ad01716a769296085bf3eb93f76424) docs: Add Powered by Algolia label to the search. ([#18633](https://redirect.github.com/eslint/eslint/issues/18633)) (Amaresh S M) - [`c8d26cb`](https://redirect.github.com/eslint/eslint/commit/c8d26cb4a2f9d89bfc1914167d3e9f1d3314ffe7) docs: Open JS Foundation -> OpenJS Foundation ([#18649](https://redirect.github.com/eslint/eslint/issues/18649)) (Milos Djermanovic) - [`6e79ac7`](https://redirect.github.com/eslint/eslint/commit/6e79ac76f44b34c24a3e92c20713fbafe1dcbae2) docs: `loadESLint` does not support option `cwd` ([#18641](https://redirect.github.com/eslint/eslint/issues/18641)) (Francesco Trotta) #### Chores - [`793b718`](https://redirect.github.com/eslint/eslint/commit/793b7180119e7e440d685defb2ee01597574ef1e) chore: upgrade [@eslint/js](https://redirect.github.com/eslint/js)[@9](https://redirect.github.com/9).7.0 ([#18680](https://redirect.github.com/eslint/eslint/issues/18680)) (Francesco Trotta) - [`7ed6f9a`](https://redirect.github.com/eslint/eslint/commit/7ed6f9a4db702bbad941422f456451a8dba7a450) chore: package.json update for [@eslint/js](https://redirect.github.com/eslint/js) release (Jenkins) - [`7bcda76`](https://redirect.github.com/eslint/eslint/commit/7bcda760369c44d0f1131fccaaf1ccfed5af85f1) refactor: Add type references ([#18652](https://redirect.github.com/eslint/eslint/issues/18652)) (Nicholas C. Zakas) - [`51bf57c`](https://redirect.github.com/eslint/eslint/commit/51bf57c493a65baeee3a935f2d0e52e27271fb48) chore: add tech sponsors through actions ([#18624](https://redirect.github.com/eslint/eslint/issues/18624)) (Strek) - [`6320732`](https://redirect.github.com/eslint/eslint/commit/6320732c3e2a52a220552e348108c53c60f9ef7a) refactor: don't use `parent` property in `NodeEventGenerator` ([#18653](https://redirect.github.com/eslint/eslint/issues/18653)) (Milos Djermanovic) - [`9e6d640`](https://redirect.github.com/eslint/eslint/commit/9e6d6405c3ee774c2e716a3453ede9696ced1be7) refactor: move "Parsing error" prefix adding to Linter ([#18650](https://redirect.github.com/eslint/eslint/issues/18650)) (Milos Djermanovic) ### [`v9.6.0`](https://redirect.github.com/eslint/eslint/compare/v9.5.0...473d1bb7c3dfcf629ac048ca811f4b5eef04a692) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.5.0...v9.6.0) ### [`v9.5.0`](https://redirect.github.com/eslint/eslint/compare/v9.4.0...535235701fb029db6f656bd4e58acdfdeb8c02de) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.4.0...v9.5.0) ### [`v9.4.0`](https://redirect.github.com/eslint/eslint/compare/v9.3.0...a5f7e589eca05a8a30bd2532380c304759cc8225) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.3.0...v9.4.0) ### [`v9.3.0`](https://redirect.github.com/eslint/eslint/compare/v9.2.0...41a871cf43874e2f27ad08554c7900daf0e94b06) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.2.0...v9.3.0) ### [`v9.2.0`](https://redirect.github.com/eslint/eslint/compare/v9.1.1...271e7ab1adc45a7b2f66cfea55a54e6048d9749a) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.1.1...v9.2.0) ### [`v9.1.1`](https://redirect.github.com/eslint/eslint/compare/v9.1.0...b4d2512809a1b28466ad1ce5af9d01c181b9bf9e) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.1.0...v9.1.1) ### [`v9.1.0`](https://redirect.github.com/eslint/eslint/compare/v9.0.0...b78d831e244171c939279b03be519b5c13836fce) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.0.0...v9.1.0) ### [`v9.0.0`](https://redirect.github.com/eslint/eslint/compare/v8.57.0...e0cbc50179adac1670f4e0bd9093387a51f4f42a) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v8.57.0...v9.0.0)sindresorhus/execa (execa)
### [`v9.3.1`](https://redirect.github.com/sindresorhus/execa/compare/v9.3.0...0a51f7cbef53e7290a3604e585e1b2e61da37367) [Compare Source](https://redirect.github.com/sindresorhus/execa/compare/v9.3.0...v9.3.1) ### [`v9.3.0`](https://redirect.github.com/sindresorhus/execa/releases/tag/v9.3.0) [Compare Source](https://redirect.github.com/sindresorhus/execa/compare/v9.2.0...v9.3.0) #### Features - The [`verbose`](docs/api.md#optionsverbose) option can now be [a function](docs/api.md#verbose-function) to [customize logging](docs/debugging.md#custom-logging). ([#1130](https://redirect.github.com/sindresorhus/execa/issues/1130)) ### [`v9.2.0`](https://redirect.github.com/sindresorhus/execa/releases/tag/v9.2.0) [Compare Source](https://redirect.github.com/sindresorhus/execa/compare/v9.1.0...v9.2.0) This release includes a [new set of methods](docs/ipc.md) to exchange messages between the current process and a Node.js subprocess, also known as "IPC". This allows [passing](docs/input.md#any-input-type) and [returning](docs/output.md#any-output-type) almost any message type to/from a Node.js subprocess. Also, [debugging](docs/ipc.md#debugging) IPC is now much easier. Moreover, a new [`gracefulCancel`](docs/api.md#optionsgracefulcancel) option has also been added to [terminate a subprocess gracefully](docs/termination.md#graceful-termination). For a deeper dive-in, please check and share the [release post](https://medium.com/@ehmicky/ipc-made-easy-with-execa-9-2-939c6a358731)! Thanks [@iiroj](https://redirect.github.com/iiroj) for your contribution, [@SimonSiefke](https://redirect.github.com/SimonSiefke) and [@adymorz](https://redirect.github.com/adymorz) for reporting the bugs fixed in this release, and [@karlhorky](https://redirect.github.com/karlhorky) for improving the documentation! #### Deprecations - Passing `'ipc'` to the [`stdio`](docs/api.md#optionsstdio) option has been deprecated. It will be removed in the next major release. Instead, the [`ipc: true`](docs/api.md#optionsipc) option should be used. ([#1056](https://redirect.github.com/sindresorhus/execa/issues/1056)) ```diff - await execa('npm', ['run', 'build'], {stdio: ['pipe', 'pipe', 'pipe', 'ipc']}); + await execa('npm', ['run', 'build'], {ipc: true}); ``` - The [`execaCommand()`](https://redirect.github.com/sindresorhus/execa/blob/v9.1.0/docs/api.md#execacommandcommand-options) method has been deprecated. It will be removed in the next major release. If most cases, the [template string syntax](docs/execution.md#template-string-syntax) should be used instead. ```diff - 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)](https://redirect.github.com/sindresorhus/execa/blob/main/docs/api.md#parsecommandstringcommand) can split that string into an array. [More info.](docs/escaping.md) ([#1054](https://redirect.github.com/sindresorhus/execa/issues/1054)) ```diff - 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`](docs/api.md#optionsgracefulcancel) option and [`getCancelSignal()`](docs/api.md#getcancelsignal) method to [terminate a subprocess gracefully](docs/termination.md#graceful-termination). [`error.isGracefullyCanceled`](docs/api.md#errorisgracefullycanceled) was also added. ([#1109](https://redirect.github.com/sindresorhus/execa/issues/1109)) - Add [`error.isForcefullyTerminated`](docs/api.md#errorisforcefullyterminated). It is `true` when the subprocess was terminated by the [`forceKillAfterDelay`](docs/api.md#optionsforcekillafterdelay) option. ([#1111](https://redirect.github.com/sindresorhus/execa/issues/1111)) - New methods to simplify exchanging messages between the current process and the subprocess. [More info.](docs/ipc.md) ([#1059](https://redirect.github.com/sindresorhus/execa/issues/1059), [#1061](https://redirect.github.com/sindresorhus/execa/issues/1061), [#1076](https://redirect.github.com/sindresorhus/execa/issues/1076), [#1077](https://redirect.github.com/sindresorhus/execa/issues/1077), [#1079](https://redirect.github.com/sindresorhus/execa/issues/1079), [#1082](https://redirect.github.com/sindresorhus/execa/issues/1082), [#1083](https://redirect.github.com/sindresorhus/execa/issues/1083), [#1086](https://redirect.github.com/sindresorhus/execa/issues/1086), [#1087](https://redirect.github.com/sindresorhus/execa/issues/1087), [#1088](https://redirect.github.com/sindresorhus/execa/issues/1088), [#1089](https://redirect.github.com/sindresorhus/execa/issues/1089), [#1090](https://redirect.github.com/sindresorhus/execa/issues/1090), [#1091](https://redirect.github.com/sindresorhus/execa/issues/1091), [#1092](https://redirect.github.com/sindresorhus/execa/issues/1092), [#1094](https://redirect.github.com/sindresorhus/execa/issues/1094), [#1095](https://redirect.github.com/sindresorhus/execa/issues/1095), [#1098](https://redirect.github.com/sindresorhus/execa/issues/1098), [#1104](https://redirect.github.com/sindresorhus/execa/issues/1104), [#1107](https://redirect.github.com/sindresorhus/execa/issues/1107)) - The current process sends messages with [`subprocess.sendMessage(message)`](docs/api.md#subprocesssendmessagemessage-sendmessageoptions) and receives them with [`subprocess.getOneMessage()`](docs/api.md#subprocessgetonemessagegetonemessageoptions). [`subprocess.getEachMessage()`](docs/api.md#subprocessgeteachmessagegeteachmessageoptions) listens to multiple messages. - The subprocess uses [`sendMessage(message)`](docs/api.md#sendmessagemessage-sendmessageoptions), [`getOneMessage()`](docs/api.md#getonemessagegetonemessageoptions) and [`getEachMessage()`](docs/api.md#geteachmessagegeteachmessageoptions) instead. Those are the same methods, but imported directly from the `'execa'` module. - The [`ipcInput`](docs/ipc.md#send-an-initial-message) option sends an IPC message from the current process to the subprocess as it starts. This enables [passing almost any input type](docs/input.md#any-input-type) to a Node.js subprocess. ([#1068](https://redirect.github.com/sindresorhus/execa/issues/1068)) - The [`result.ipcOutput`](docs/ipc.md#retrieve-all-messages) array contains all the IPC messages sent by the subprocess to the current process. This enables [returning almost any output type](docs/output.md#any-output-type) from a Node.js subprocess. ([#1067](https://redirect.github.com/sindresorhus/execa/issues/1067), [#1071](https://redirect.github.com/sindresorhus/execa/issues/1071), [#1075](https://redirect.github.com/sindresorhus/execa/issues/1075)) - The [error message](docs/errors.md#error-message) now [contains every IPC message](docs/ipc.md#debugging) sent by the subprocess. ([#1067](https://redirect.github.com/sindresorhus/execa/issues/1067)) - The [`verbose: 'full'`](docs/api.md#optionsverbose) option now logs every IPC message sent by the subprocess, for debugging. More info [here](docs/ipc.md#debugging) and [there](docs/output.md#stdoutstderr-specific-options). ([#1063](https://redirect.github.com/sindresorhus/execa/issues/1063)) #### Types - Add [`ExecaMethod`](docs/typescript.md#available-types), [`ExecaNodeMethod`](docs/typescript.md#available-types) and [`ExecaScriptMethod`](docs/typescript.md#available-types), [`ExecaSyncMethod`](docs/typescript.md#synchronous-execution) and [`ExecaScriptSyncMethod`](docs/typescript.md#synchronous-execution) types. ([#1066](https://redirect.github.com/sindresorhus/execa/issues/1066)) - Export the `Message` type, for [IPC](docs/ipc.md). ([#1059](https://redirect.github.com/sindresorhus/execa/issues/1059)) - Fix type of `forceKillAfterDelay: true` option. ([#1116](https://redirect.github.com/sindresorhus/execa/issues/1116)) #### Bug fixes - Fix passing a [`{file}`](docs/output.md#file-output) to both the [`stdin`](docs/api.md#optionsstdin) and the [`stdout`](docs/api.md#optionsstdout) or [`stderr`](docs/api.md#optionsstderr) options. ([#1058](https://redirect.github.com/sindresorhus/execa/issues/1058)) - Fix multiple minor problems with the [`cancelSignal`](docs/termination.md#canceling) option. ([#1108](https://redirect.github.com/sindresorhus/execa/issues/1108)) - Fix accidental publishing of Vim backup files. ([#1074](https://redirect.github.com/sindresorhus/execa/issues/1074)) - Fix `engines.node` field in [`package.json`](package.json). Supported Node.js version is `^18.19.0` or `>=20.5.0`. (by [@iiroj](https://redirect.github.com/iiroj)) ([#1101](https://redirect.github.com/sindresorhus/execa/issues/1101)) ### [`v9.1.0`](https://redirect.github.com/sindresorhus/execa/releases/tag/v9.1.0) [Compare Source](https://redirect.github.com/sindresorhus/execa/compare/v9.0.2...v9.1.0) #### Features (types) - Export [`TemplateExpression`](docs/typescript.md#available-types) type. ([#1049](https://redirect.github.com/sindresorhus/execa/issues/1049)) ### [`v9.0.2`](https://redirect.github.com/sindresorhus/execa/releases/tag/v9.0.2) [Compare Source](https://redirect.github.com/sindresorhus/execa/compare/v9.0.1...v9.0.2) #### Bug fixes (types) - Do not require using `--lib dom` for TypeScript users ([#1043](https://redirect.github.com/sindresorhus/execa/issues/1043), [#1044](https://redirect.github.com/sindresorhus/execa/issues/1044)) - Fix type of the `reject` option ([#1046](https://redirect.github.com/sindresorhus/execa/issues/1046)) ### [`v9.0.1`](https://redirect.github.com/sindresorhus/execa/releases/tag/v9.0.1) [Compare Source](https://redirect.github.com/sindresorhus/execa/compare/v9.0.0...v9.0.1) #### Bug fixes (types) - Fix types not being importable ([#1033](https://redirect.github.com/sindresorhus/execa/issues/1033)) [`3bdab60`](https://redirect.github.com/sindresorhus/execa/commit/3bdab60) - Fix complexity bug with types ([#1037](https://redirect.github.com/sindresorhus/execa/issues/1037)) [`6cc519b`](https://redirect.github.com/sindresorhus/execa/commit/6cc519b) - Fix complexity bug with types ([#1035](https://redirect.github.com/sindresorhus/execa/issues/1035)) [`fee011d`](https://redirect.github.com/sindresorhus/execa/commit/fee011d) ### [`v9.0.0`](https://redirect.github.com/sindresorhus/execa/releases/tag/v9.0.0) [Compare Source](https://redirect.github.com/sindresorhus/execa/compare/v8.0.1...v9.0.0) This major release brings many important features including: - [Split the output](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#3a26) into lines, or [progressively iterate](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#3a26) over them. - [Transform or filter](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#cbd6) the input/output using [simple functions](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#399a). - Print the output [to the terminal](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#693f) while still retrieving it programmatically. - Redirect the input/output [from/to a file](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#693f). - [Advanced piping](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#ec17) between multiple subprocesses. - Improved [verbose mode](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#2913), for debugging. - More [detailed errors](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#40d7), including when [terminating subprocesses](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#668c). - Enhanced [template string syntax](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#725b). - [Global/shared options](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#bcbf). - [Web streams](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#5731) and Transform streams support. - [Convert the subprocess](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f#47b9) to a stream. - [New documentation](https://redirect.github.com/sindresorhus/execa#documentation) with many examples. Please check the [release post](https://medium.com/@ehmicky/execa-9-release-d0d5daaa097f) for a high-level overview! For the full list of breaking changes, features and bug fixes, please read below. Thanks [@younggglcy](https://redirect.github.com/younggglcy), [@koshic](https://redirect.github.com/koshic), [@am0o0](https://redirect.github.com/am0o0) and [@codesmith-emmy](https://redirect.github.com/codesmith-emmy) for your help! *** One of the maintainers [@ehmicky](https://redirect.github.com/ehmicky) is looking for a remote full-time position. Specialized in Node.js back-ends and CLIs, he led Netlify [Build](https://www.netlify.com/platform/core/build/), [Plugins](https://www.netlify.com/integrations/) and Configuration for 2.5 years. Feel free to contact him on [his website](https://www.mickael-hebert.com) or on [LinkedIn](https://www.linkedin.com/in/mickaelhebert/)! *** #### Breaking changes - Minimal supported Node.js version is now `18.19.0`. ([`834e372`](https://redirect.github.com/sindresorhus/execa/commit/834e3726)) - When the [`encoding` option](docs/api.md#optionsencoding) is `'buffer'`, the output ([`result.stdout`](docs/api.md#resultstdout), [`result.stderr`](docs/api.md#resultstderr), [`result.all`](docs/api.md#resultall)) is now an [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) instead of a [`Buffer`](https://nodejs.org/api/buffer.html#class-buffer). For more information, see [this blog post](https://sindresorhus.com/blog/goodbye-nodejs-buffer). (by [@younggglcy](https://redirect.github.com/younggglcy)) ([#586](https://redirect.github.com/sindresorhus/execa/issues/586)) ```js const {stdout} = await execa('node', ['file.js'], {encoding: 'buffer'}); console.log(stdout); // This is now an Uint8Array ``` - Renamed some of the allowed values for the [`encoding`](docs/api.md#optionsencoding) option. ([#586](https://redirect.github.com/sindresorhus/execa/issues/586), [#928](https://redirect.github.com/sindresorhus/execa/issues/928)) ```diff - 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()` and `subprocess.pipeAll()` has been removed. Instead, a [`{file: './path'}` object](docs/output.md#file-output) should be passed to the [`stdout`](docs/api.md#optionsstdout) or [`stderr`](docs/api.md#optionsstderr) option. ([#752](https://redirect.github.com/sindresorhus/execa/issues/752)) ```diff - 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](https://nodejs.org/api/stream.html#class-streamwritable) to `subprocess.pipeStdout()`, `subprocess.pipeStderr()` and `subprocess.pipeAll()` has been removed. Instead, the stream should be passed to the [`stdout`](docs/api.md#optionsstdout) or [`stderr`](docs/api.md#optionsstderr) option. If the stream [does not have a file descriptor](docs/streams.md#file-descriptors), [`['pipe', stream]`](docs/output.md#multiple-targets) should be passed instead. ([#752](https://redirect.github.com/sindresorhus/execa/issues/752)) ```diff - 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()` and `subprocess.pipeAll()` methods have been renamed to [`subprocess.pipe()`](docs/api.md#subprocesspipefile-arguments-options). The command and its arguments can be passed to `subprocess.pipe()` directly, without calling `execa()` a second time. The [`from`](docs/api.md#pipeoptionsfrom) piping option can specify `'stdout'` (the default value), `'stderr'` or `'all'`. ([#757](https://redirect.github.com/sindresorhus/execa/issues/757)) ```diff - 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 to [`cancelSignal`](docs/api.md#optionscancelsignal). ([#880](https://redirect.github.com/sindresorhus/execa/issues/880)) ```diff - await execa('node', ['file.js'], {signal: abortController.signal}); + await execa('node', ['file.js'], {cancelSignal: abortController.signal}); ``` - Renamed `error.killed` to [`error.isTerminated`](docs/api.md#erroristerminated). ([#625](https://redirect.github.com/sindresorhus/execa/issues/625)) ```diff try { await execa('node', ['file.js']); } catch (error) { - if (error.killed) { + if (error.isTerminated) { // ... } } ``` - `subprocess.cancel()` has been removed. Please use either [`subprocess.kill()`](docs/api.md#subprocesskillsignal-error) or the [`cancelSignal`](docs/api.md#optionscancelsignal) option instead. ([#711](https://redirect.github.com/sindresorhus/execa/issues/711)) ```diff - subprocess.cancel(); + subprocess.kill(); ``` - Renamed the `forceKillAfterTimeout` option to [`forceKillAfterDelay`](docs/api.md#optionsforcekillafterdelay). Also, it is now passed to [`execa()`](docs/api.md#execafile-arguments-options) instead of [`subprocess.kill()`](docs/api.md#subprocesskillsignal-error). ([#714](https://redirect.github.com/sindresorhus/execa/issues/714), [#723](https://redirect.github.com/sindresorhus/execa/issues/723)) ```diff - const subprocess = execa('node', ['file.js']); - subprocess.kill('SIGTERM', {forceKillAfterTimeout: 1000}); + const subprocess = execa('node', ['file.js'], {forceKillAfterDelay: 1000}); + subprocess.kill('SIGTERM'); ``` - The [`verbose`](docs/api.md#optionsverbose) option is now a string enum instead of a boolean. `false` has been renamed to `'none'` and `true` has been renamed to [`'short'`](docs/debugging.md#short-mode). ([#884](https://redirect.github.com/sindresorhus/execa/issues/884)) ```diff - 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 to [`nodePath`](docs/api.md#optionsnodepath). It is now a noop unless the [`node`](docs/api.md#optionsnode) option is `true`. Also, it now works even if the [`preferLocal`](docs/api.md#optionspreferlocal) option is `false`. ([#812](https://redirect.github.com/sindresorhus/execa/issues/812), [#815](https://redirect.github.com/sindresorhus/execa/issues/815)) ```diff - await execa('node', ['file.js'], {execPath: './path/to/node'}); + await execa('node', ['file.js'], {nodePath: './path/to/node'}); ``` - The [default value](docs/ipc.md#message-type) for the [`serialization`](docs/api.md#optionsserialization) option is now [`'advanced'`](https://nodejs.org/api/child_process.html#advanced-serialization) instead of `'json'`. In particular, when calling [`subprocess.send(object)`](docs/api.md#subprocesssendmessage) with an object that contains functions or symbols, those were previously silently removed. Now this will throw an exception. ([#905](https://redirect.github.com/sindresorhus/execa/issues/905)) ```diff - subprocess.send({example: true, getExample() {}}); + subprocess.send({example: true}); ``` - If [`subprocess.stdout`](docs/api.md#subprocessstdout), [`subprocess.stderr`](docs/api.md#subprocessstderr) or [`subprocess.all`](docs/api.md#subprocessall) is manually piped, the [`.pipe()`](https://nodejs.org/api/stream.html#readablepipedestination-options) call must now happen as soon as `subprocess` is created. Otherwise, the output at the beginning of the subprocess might be missing. ([#658](https://redirect.github.com/sindresorhus/execa/issues/658), [#747](https://redirect.github.com/sindresorhus/execa/issues/747)) ```diff const subprocess = execa('node', ['file.js']); - setTimeout(() => { subprocess.stdout.pipe(process.stdout); - }, 0); ``` - Signals passed to [`subprocess.kill()`](docs/api.md#subprocesskillsignal-error) and to the [`killSignal`](docs/api.md#optionskillsignal) option cannot be lowercase anymore. ([#1025](https://redirect.github.com/sindresorhus/execa/issues/1025)) ```diff - 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](docs/execution.md#template-string-syntax) with any method (including [`execa()`](docs/api.md#execacommand)), as opposed to only [`$`](docs/api.md#file-arguments-options). Conversely, `$` can now use the [regular array syntax](docs/scripts.md#template-string-syntax). ([#933](https://redirect.github.com/sindresorhus/execa/issues/933)) - A command's template string can span [multiple lines](docs/execution.md#multiple-lines). ([#843](https://redirect.github.com/sindresorhus/execa/issues/843)) - [Share options](docs/execution.md#globalshared-options) between multiple calls, or set global options, by using [`execa(options)`](docs/api#execaoptions). ([#933](https://redirect.github.com/sindresorhus/execa/issues/933), [#965](https://redirect.github.com/sindresorhus/execa/issues/965)) - Pass a file URL (as opposed to a file path string) to [`execa()`](docs/api.md#execafile-arguments-options), [`execaNode()`](docs/api.md#execanodescriptpath-arguments-options), the [`inputFile`](docs/api.md#optionsinputfile) option, the [`nodePath`](docs/api.md#optionsnodepath) option or the [`shell`](docs/api.md#optionsshell) option. ([#630](https://redirect.github.com/sindresorhus/execa/issues/630), [#631](https://redirect.github.com/sindresorhus/execa/issues/631), [#632](https://redirect.github.com/sindresorhus/execa/issues/632), [#635](https://redirect.github.com/sindresorhus/execa/issues/635)) ##### Text lines - [Split the output](docs/lines.md#simple-splitting) into text lines by using the [`lines`](docs/api.md#optionslines) option. ([#741](https://redirect.github.com/sindresorhus/execa/issues/741), [#929](https://redirect.github.com/sindresorhus/execa/issues/929), [#931](https://redirect.github.com/sindresorhus/execa/issues/931), [#948](https://redirect.github.com/sindresorhus/execa/issues/948), [#951](https://redirect.github.com/sindresorhus/execa/issues/951), [#957](https://redirect.github.com/sindresorhus/execa/issues/957)) - Subprocess is now an [async iterable](docs/api.md#subprocesssymbolasynciterator), [iterating over the output](docs/lines.md#progressive-splitting) lines while the subprocess is running. ([#923](https://redirect.github.com/sindresorhus/execa/issues/923)) ##### Piping multiple subprocesses - Simpler syntax: pass the [command directly](docs/pipe.md#array-syntax) to [`subprocess.pipe()`](docs/api.md#subprocesspipefile-arguments-options) without calling [`execa()`](docs/api.md#execafile-arguments-options). A [template string](docs/pipe.md#template-string-syntax) can also be used. ([#840](https://redirect.github.com/sindresorhus/execa/issues/840), [#859](https://redirect.github.com/sindresorhus/execa/issues/859), [#864](https://redirect.github.com/sindresorhus/execa/issues/864)) - [Wait for both subprocesses](docs/pipe.md#result) to complete. [Error handling](docs/pipe.md#errors) has been improved too. ([#757](https://redirect.github.com/sindresorhus/execa/issues/757), [#778](https://redirect.github.com/sindresorhus/execa/issues/778), [#834](https://redirect.github.com/sindresorhus/execa/issues/834), [#854](https://redirect.github.com/sindresorhus/execa/issues/854)) - Retrieve the [result](docs/pipe.md#result) of each subprocess (not only the last one) by using [`result.pipedFrom`](docs/api.md#resultpipedfrom) and [`error.pipedFrom`](docs/api.md#resultpipedfrom). ([#834](https://redirect.github.com/sindresorhus/execa/issues/834)) - Pipe 1 or [many subprocesses](docs/pipe.md#multiple-sources-1-destination) to 1 or [many subprocesses](docs/pipe.md#1-source-multiple-destinations). ([#834](https://redirect.github.com/sindresorhus/execa/issues/834)) - Pipe subprocesses using [other file descriptors](docs/pipe.md#source-file-descriptor) than `stdin`/`stdout`/`stderr` by using the [`from`](docs/api.md#pipeoptionsfrom) and [`to`](docs/api.md#pipeoptionsto) piping options. ([#757](https://redirect.github.com/sindresorhus/execa/issues/757), [#834](https://redirect.github.com/sindresorhus/execa/issues/834), [#903](https://redirect.github.com/sindresorhus/execa/issues/903), [#920](https://redirect.github.com/sindresorhus/execa/issues/920)) - [Cancel piping](docs/pipe.md#unpipe) subprocesses by using the [`unpipeSignal`](docs/api.md#pipeoptionsunpipesignal) piping option. ([#834](https://redirect.github.com/sindresorhus/execa/issues/834), [#852](https://redirect.github.com/sindresorhus/execa/issues/852)) ##### Input/output - Pass an array with [multiple values](docs/output.md#multiple-targets) to the [`stdin`](docs/api.md#optionsstdin), [`stdout`](docs/api.md#optionsstdout) and [`stderr`](docs/api.md#optionsstderr) options. For example, [`stdout: ['inherit', 'pipe']`](docs/output.md#multiple-targets) prints the output [to the terminal](docs/output.md#terminal-output) while still [returning it](docs/output.md#stdout-and-stderr) as [`result.stdout`](docs/api.md#resultstdout). ([#643](https://redirect.github.com/sindresorhus/execa/issues/643), [#765](https://redirect.github.com/sindresorhus/execa/issues/765), [#941](https://redirect.github.com/sindresorhus/execa/issues/941), [#954](https://redirect.github.com/sindresorhus/execa/issues/954)) - Redirect the [input](docs/input.md#file-input)/[output](docs/output.md#file-output) from/to a file by passing a `{file: './path'}` object or a file URL to the [`stdin`](docs/api.md#optionsstdin), [`stdout`](docs/api.md#optionsstdout) or [`stderr`](docs/api.md#optionsstderr) option. ([#610](https://redirect.github.com/sindresorhus/execa/issues/610), [#614](https://redirect.github.com/sindresorhus/execa/issues/614), [#621](https://redirect.github.com/sindresorhus/execa/issues/621), [#671](https://redirect.github.com/sindresorhus/execa/issues/671), [#1004](https://redirect.github.com/sindresorhus/execa/issues/1004)) - [Transform](docs/transform.md) or [filter](docs/transform.md#filtering) the input/output by passing a generator function to the [`stdin`](docs/api.md#optionsstdin), [`stdout`](docs/api.md#optionsstdout) or [`stderr`](docs/api.md#optionsstderr) option. ([#693](https://redirect.github.com/sindresorhus/execa/issues/693), [#697](https://redirect.github.com/sindresorhus/execa/issues/697), [#698](https://redirect.github.com/sindresorhus/execa/issues/698), [#699](https://redirect.github.com/sindresorhus/execa/issues/699), [#709](https://redirect.github.com/sindresorhus/execa/issues/709), [#736](https://redirect.github.com/sindresorhus/execa/issues/736), [#737](https://redirect.github.com/sindresorhus/execa/issues/737), [#739](https://redirect.github.com/sindresorhus/execa/issues/739), [#740](https://redirect.github.com/sindresorhus/execa/issues/740), [#746](https://redirect.github.com/sindresorhus/execa/issues/746), [#748](https://redirect.github.com/sindresorhus/execa/issues/748), [#755](https://redirect.github.com/sindresorhus/execa/issues/755), [#756](https://redirect.github.com/sindresorhus/execa/issues/756), [#780](https://redirect.github.com/sindresorhus/execa/issues/780), [#783](https://redirect.github.com/sindresorhus/execa/issues/783), [#867](https://redirect.github.com/sindresorhus/execa/issues/867), [#915](https://redirect.github.com/sindresorhus/execa/issues/915), [#916](https://redirect.github.com/sindresorhus/execa/issues/916), [#917](https://redirect.github.com/sindresorhus/execa/issues/917), [#919](https://redirect.github.com/sindresorhus/execa/issues/919), [#924](https://redirect.github.com/sindresorhus/execa/issues/924), [#926](https://redirect.github.com/sindresorhus/execa/issues/926), [#945](https://redirect.github.com/sindresorhus/execa/issues/945), [#969](https://redirect.github.com/sindresorhus/execa/issues/969)) - Provide some [binary input](docs/binary.md#binary-input) by passing an [`Uint8Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array) to the [`input`](docs/api.md#optionsinput) or [`stdin`](docs/api.md#optionsstdin) option. ([`834e372`](https://redirect.github.com/sindresorhus/execa/commit/834e3726), [#670](https://redirect.github.com/sindresorhus/execa/issues/670), [#1029](https://redirect.github.com/sindresorhus/execa/issues/1029)) - Provide some [progressive input](docs/streams.md#iterables-as-input) by passing a sync/async [iterable](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#the_async_iterator_and_async_iterable_protocols) to the [`stdin`](docs/api.md#optionsstdin) option. ([#604](https://redirect.github.com/sindresorhus/execa/issues/604), [#944](https://redirect.github.com/sindresorhus/execa/issues/944)) - Provide [multiple inputs](docs/output.md#multiple-targets) by combining the [`stdin`](docs/api.md#optionsstdin), [`input`](docs/api.md#optionsinput) and [`inputFile`](docs/api.md#optionsinputfile) options. ([#666](https://redirect.github.com/sindresorhus/execa/issues/666)) - Return [other file descriptors](docs/output.md#additional-file-descriptors) than [`result.stdout`](docs/api.md#resultstdout) and [`result.stderr`](docs/api.md#resultstderr) by using [`result.stdio`](docs/api.md#resultstdio). ([#676](https://redirect.github.com/sindresorhus/execa/issues/676)) - [Specify different values](docs/output.md#stdoutstderr-specific-options) for [`stdout`](docs/api.md#optionsstdout) and [`stderr`](docs/api.md#optionsstderr) with the following options: [`verbose`](docs/api.md#optionsverbose), [`lines`](docs/api.md#optionslines), [`stripFinalNewline`](docs/api.md#optionsstripfinalnewline), [`maxBuffer`](docs/api.md#optionsmaxbuffer), [`buffer`](docs/api.md#optionsbuffer). ([#966](https://redirect.github.com/sindresorhus/execa/issues/966), [#970](https://redirect.github.com/sindresorhus/execa/issues/970), [#971](https://redirect.github.com/sindresorhus/execa/issues/971), [#972](https://redirect.github.com/sindresorhus/execa/issues/972), [#973](https://redirect.github.com/sindresorhus/execa/issues/973), [#974](https://redirect.github.com/sindresorhus/execa/issues/974)) ##### Streams - Redirect the input/output from/to a [web stream](docs/streams.md#web-streams) by passing a [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream) or [`WritableStream`](https://developer.mozilla.org/en-US/docs/Web/API/WritableStream) to the [`stdin`](docs/api.md#optionsstdin), [`stdout`](docs/api.md#optionsstdout) or [`stderr`](docs/api.md#optionsstderr) option. ([#615](https://redirect.github.com/sindresorhus/execa/issues/615), [#619](https://redirect.github.com/sindresorhus/execa/issues/619), [#645](https://redirect.github.com/sindresorhus/execa/issues/645)) - [Transform or filter](docs/transform.md#duplextransform-streams) the input/output by passing a [`Duplex`](https://nodejs.org/api/stream.html#class-streamduplex), Node.js [`Transform`](https://nodejs.org/api/stream.html#class-streamtransform) or web [`TransformStream`](https://developer.mozilla.org/en-US/docs/Web/API/TransformStream) to the [`stdin`](docs/api.md#optionsstdin), [`stdout`](docs/api.md#optionsstdout) or [`stderr`](docs/api.md#optionsstderr) option. ([#937](https://redirect.github.com/sindresorhus/execa/issues/937), [#938](https://redirect.github.com/sindresorhus/execa/issues/938)) - [Convert the subprocess](docs/streams.md#converting-a-subprocess-to-a-stream) to a stream by using [`subprocess.readable()`](docs/api.md#subprocessreadablereadableoptions), [`subprocess.writable()`](docs/api.md#subprocesswritablewritableoptions) or [`subprocess.duplex()`](docs/api.md#subprocessduplexduplexoptions). ([#912](https://redirect.github.com/sindresorhus/execa/issues/912), [#922](https://redirect.github.com/sindresorhus/execa/issues/922), [#958](https://redirect.github.com/sindresorhus/execa/issues/958)) ##### Verbose mode - Print the subprocess' [completion, duration and errors](docs/debugging.md#short-mode) with the [`verbose: 'short'`](docs/api.md#optionsverbose) or `verbose: 'full'` option. ([#887](https://redirect.github.com/sindresorhus/execa/issues/887), [#890](https://redirect.github.com/sindresorhus/execa/issues/890)) - Print the subprocess' [output](docs/debugging.md#full-mode) with the [`verbose: 'full'`](docs/api.md#optionsverbose) option. ([#884](https://redirect.github.com/sindresorhus/execa/issues/884), [#950](https://redirect.github.com/sindresorhus/execa/issues/950), [#962](https://redirect.github.com/sindresorhus/execa/issues/962), [#990](https://redirect.github.com/sindresorhus/execa/issues/990)) - Prettier formatting and [colors](docs/debugging.md#colors) with the [`verbose`](docs/api.md#optionsverbose) option. ([#883](https://redirect.github.com/sindresorhus/execa/issues/883), [#893](https://redirect.github.com/sindresorhus/execa/issues/893), [#894](https://redirect.github.com/sindresorhus/execa/issues/894)) ##### Debugging - Retrieve the subprocess' [duration](docs/debugging.md#duration) by using [`result.durationMs`](docs/api.md#resultdurationms) and [`error.durationMs`](docs/api.md#resultdurationms). ([#896](https://redirect.github.com/sindresorhus/execa/issues/896)) - Retrieve the subprocess' [current directory](docs/environment.md#current-directory) by using [`result.cwd`](docs/api.md#resultcwd). Previously only [`error.cwd`](docs/api.md#execaerror) was available. Also, `result.cwd` and `error.cwd` are now normalized to absolute file paths. ([#803](https://redirect.github.com/sindresorhus/execa/issues/803)) - Printing [`result.escapedCommand`](docs/api.md#resultescapedcommand) in a terminal [is now safe](docs/debugging.md#command). ([#875](https://redirect.github.com/sindresorhus/execa/issues/875)) ##### Errors - The [`ExecaError`](docs/api.md#execaerror) and [`ExecaSyncError`](docs/api.md#execasyncerror) classes [are now exported](docs/errors.md#subprocess-failure). ([#911](https://redirect.github.com/sindresorhus/execa/issues/911)) - Find the subprocess failure's [root cause](docs/termination.md#error-message-and-stack-trace) by using [`error.cause`](docs/api.md#errorcause). ([#911](https://redirect.github.com/sindresorhus/execa/issues/911)) - Know whether [the subprocess failed](docs/errors.md#failure-reason) due to the [`maxBuffer`](docs/api.md#optionsmaxbuffer) option by using [`error.isMaxBuffer`](docs/api.md#errorismaxbuffer). ([#963](https://redirect.github.com/sindresorhus/execa/issues/963)) - Improved [`error.message`](docs/api.md#errormessage): [`error.stdout`](docs/api.md#resultstdout) and [`error.stderr`](docs/api.md#resultstderr) are now [interleaved](docs/output.md#interleaved-output) if the [`all`](docs/api.md#optionsall) option is `true`. [Additional file descriptors](docs/output.md#additional-file-descriptors) are now printed too. Also, the [formatting](docs/errors.md#error-message) has been improved. ([#676](https://redirect.github.com/sindresorhus/execa/issues/676), [#705](https://redirect.github.com/sindresorhus/execa/issues/705), [#991](https://redirect.github.com/sindresorhus/execa/issues/991), [#992](https://redirect.github.com/sindresorhus/execa/issues/992)) - [Control characters](https://en.wikipedia.org/wiki/Control_character) in [`error.message`](docs/api.md#errormessage) are now escaped, so they don't result in visual bugs when printed in a terminal. ([#879](https://redirect.github.com/sindresorhus/execa/issues/879)) - Improved stack trace when an [`error`](https://nodejs.org/api/stream.html#event-error\_1) event is emitted on [`subprocess.stdout`](docs/api.md#subprocessstdout) or [`subprocess.stderr`](docs/api.md#subprocessstderr). ([#814](https://redirect.github.com/sindresorhus/execa/issues/814)) ##### Termination - Specify an [error message or stack trace](docs/termination.md#error-message-and-stack-trace) when terminating a subprocess by passing an error instance to [`subprocess.kill()`](docs/api.md#subprocesskillerror). ([#811](https://redirect.github.com/sindresorhus/execa/issues/811), [#836](https://redirect.github.com/sindresorhus/execa/issues/836), [#1023](https://redirect.github.com/sindresorhus/execa/issues/1023)) - The [`forceKillAfterDelay`](docs/api.md#optionsforcekillafterdelay) and [`killSignal`](docs/api.md#optionskillsignal) options [now apply to terminations](docs/termination.md#default-signal) due not only to [`subprocess.kill()`](docs/api.md#subprocesskillsignal-error) but [also to](docs/termination.md#forceful-termination) the [`cancelSignal`](docs/api.md#optionscancelsignal), [`timeout`](docs/api.md#optionstimeout), [`maxBuffer`](docs/api.md#optionsmaxbuffer) and [`cleanup`](docs/api.md#optionscleanup) options. ([#714](https://redirect.github.com/sindresorhus/execa/issues/714), [#728](https://redirect.github.com/sindresorhus/execa/issues/728)) ##### Node.js files - Use the [`nodePath`](docs/api.md#optionsnodepath) and [`nodeOptions`](docs/api.md#optionsnodeoptions) options with [any method](docs/api.md#methods), as opposed to only [`execaNode()`](docs/api.md#execanodescriptpath-arguments-options), by passing the [`node: true`](docs/api.md#optionsnode) option. ([#804](https://redirect.github.com/sindresorhus/execa/issues/804), [#812](https://redirect.github.com/sindresorhus/execa/issues/812), [#815](https://redirect.github.com/sindresorhus/execa/issues/815)) - When using [`execaNode()`](docs/api.md#execanodescriptpath-arguments-options) or the [`node: true`](docs/api.md#optionsnode) option, the [current Node.js version](docs/node.md#nodejs-version) is now inherited deeply. If the subprocess spawns other subprocesses, they will all use the [same Node.js version](docs/api.md#optionsnodepath). ([#812](https://redirect.github.com/sindresorhus/execa/issues/812), [#815](https://redirect.github.com/sindresorhus/execa/issues/815), [#1011](https://redirect.github.com/sindresorhus/execa/issues/1011)) ##### Synchronous execution - Use the [`all`](docs/api.md#optionsall) and [`buffer: false`](docs/api.md#optionsbuffer) options with [`execaSync()`](docs/api.md#execasyncfile-arguments-options), as opposed to only [`execa()`](docs/api.md#execafile-arguments-options). ([#953](https://redirect.github.com/sindresorhus/execa/issues/953), [#956](https://redirect.github.com/sindresorhus/execa/issues/956)) - Added the [`$.s`](docs/api.md#file-arguments-options) alias for [`$.sync`](docs/api.md#file-arguments-options). ([#594](https://redirect.github.com/sindresorhus/execa/issues/594)) ##### Inter-process communication - Use the [`ipc: true`](docs/api.md#optionsipc) option, as [opposed to the more verbose](docs/ipc.md#exchanging-messages) [`stdio: ['pipe', 'pipe', 'pipe', 'ipc']`](docs/api.md#optionsstdio) option. ([#794](https://redirect.github.com/sindresorhus/execa/issues/794)) ##### Input validation - Improved the validation of the [`input`](docs/api.md#optionsinput), [`timeout`](docs/api.md#optionstimeout), [`cwd`](docs/api.md#optionscwd), [`detached`](docs/api.md#optionsdetached), [`cancelSignal`](docs/api.md#optionscancelsignal) and [`encoding`](docs/api.md#optionsencoding) options. ([#668](https://redirect.github.com/sindresorhus/execa/issues/668), [#715](https://redirect.github.com/sindresorhus/execa/issues/715), [#803](https://redirect.github.com/sindresorhus/execa/issues/803), [#928](https://redirect.github.com/sindresorhus/execa/issues/928), [#940](https://redirect.github.com/sindresorhus/execa/issues/940)) - Improved the validation of the arguments passed to [`execa()`](docs/api.md#execafile-arguments-options) and the [other exported methods](docs/api.md#methods). ([#838](https://redirect.github.com/sindresorhus/execa/issues/838), [#873](https://redirect.github.com/sindresorhus/execa/issues/873), [#899](https://redirect.github.com/sindresorhus/execa/issues/899)) - Improved the validation of signals passed to [`subprocess.kill()Configuration
📅 Schedule: Branch creation - "every weekend" (UTC), Automerge - At any time (no schedule defined).
🚦 Automerge: Enabled.
â™» Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR was generated by Mend Renovate. View the repository job log.