Skip to content

Commit

Permalink
Fix types of execaSync()
Browse files Browse the repository at this point in the history
  • Loading branch information
ehmicky committed Mar 24, 2024
1 parent 6ca44fb commit 42bf3cd
Show file tree
Hide file tree
Showing 2 changed files with 139 additions and 111 deletions.
89 changes: 58 additions & 31 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,14 @@ type NoStreamStdioOption =
| Writable
| [NoStreamStdioOption];

type BaseStdioOption =
type BaseStdioOption<
IsSync extends boolean = boolean,
IsSyncArray extends boolean = boolean,
> =
| 'pipe'
| 'overlapped'
| 'ignore'
| 'inherit';
| undefined
| IfAsync<IsSyncArray, 'ignore' | 'inherit'>
| IfAsync<IsSync, 'overlapped'>;

// @todo Use `string`, `Uint8Array` or `unknown` for both the argument and the return type, based on whether `encoding: 'buffer'` and `objectMode: true` are used.
// See https://github.com/sindresorhus/execa/issues/694
Expand All @@ -37,49 +40,73 @@ type DuplexTransform = {
objectMode?: boolean;
};

type CommonStdioOption<IsSync extends boolean = boolean> =
| BaseStdioOption
| 'ipc'
type CommonStdioOption<
IsSync extends boolean = boolean,
IsSyncArray extends boolean = boolean,
> =
| BaseStdioOption<IsSync, IsSyncArray>
| IfAsync<IsSyncArray,
| number
| undefined
| URL
| {file: string}
| {file: string}>
| IfAsync<IsSync,
| 'ipc'
| GeneratorTransform
| GeneratorTransformFull
| DuplexTransform>;

type InputStdioOption<IsSync extends boolean = boolean> =
type InputStdioOption<
IsSync extends boolean = boolean,
IsSyncArray extends boolean = boolean,
> =
| IfAsync<IsSyncArray,
| Uint8Array
| Readable
| Readable>
| IfAsync<IsSync,
| Iterable<unknown>
| AsyncIterable<unknown>
| ReadableStream>;

type OutputStdioOption<IsSync extends boolean = boolean> =
| Writable
type OutputStdioOption<
IsSync extends boolean = boolean,
IsSyncArray extends boolean = boolean,
> =
| IfAsync<IsSyncArray, Writable>
| IfAsync<IsSync, WritableStream>;

type StdinSingleOption<IsSync extends boolean = boolean> =
| CommonStdioOption<IsSync>
| InputStdioOption<IsSync>;
type StdinSingleOption<
IsSync extends boolean = boolean,
IsSyncArray extends boolean = boolean,
> =
| CommonStdioOption<IsSync, IsSyncArray>
| InputStdioOption<IsSync, IsSyncArray>;

export type StdinOption<IsSync extends boolean = boolean> =
| StdinSingleOption<IsSync>
| Array<StdinSingleOption<IsSync>>;
type StdoutStderrSingleOption<IsSync extends boolean = boolean> =
| CommonStdioOption<IsSync>
| OutputStdioOption<IsSync>;
| StdinSingleOption<IsSync, false>
| Array<StdinSingleOption<IsSync, IsSync>>;

type StdoutStderrSingleOption<
IsSync extends boolean = boolean,
IsSyncArray extends boolean = boolean,
> =
| CommonStdioOption<IsSync, IsSyncArray>
| OutputStdioOption<IsSync, IsSyncArray>;

export type StdoutStderrOption<IsSync extends boolean = boolean> =
| StdoutStderrSingleOption<IsSync>
| Array<StdoutStderrSingleOption<IsSync>>;
type StdioSingleOption<IsSync extends boolean = boolean> =
| CommonStdioOption<IsSync>
| InputStdioOption<IsSync>
| OutputStdioOption<IsSync>;
| StdoutStderrSingleOption<IsSync, false>
| Array<StdoutStderrSingleOption<IsSync, IsSync>>;

type StdioSingleOption<
IsSync extends boolean = boolean,
IsSyncArray extends boolean = boolean,
> =
| CommonStdioOption<IsSync, IsSyncArray>
| InputStdioOption<IsSync, IsSyncArray>
| OutputStdioOption<IsSync, IsSyncArray>;

export type StdioOption<IsSync extends boolean = boolean> =
| StdioSingleOption<IsSync>
| Array<StdioSingleOption<IsSync>>;
| StdioSingleOption<IsSync, false>
| Array<StdioSingleOption<IsSync, IsSync>>;

type StdioOptionsArray<IsSync extends boolean = boolean> = readonly [
StdinOption<IsSync>,
Expand All @@ -88,7 +115,7 @@ type StdioOptionsArray<IsSync extends boolean = boolean> = readonly [
...Array<StdioOption<IsSync>>,
];

type StdioOptions<IsSync extends boolean = boolean> = BaseStdioOption | StdioOptionsArray<IsSync>;
type StdioOptions<IsSync extends boolean = boolean> = BaseStdioOption<IsSync> | StdioOptionsArray<IsSync>;

type DefaultEncodingOption = 'utf8';
type TextEncodingOption =
Expand Down Expand Up @@ -554,7 +581,7 @@ type CommonOptions<IsSync extends boolean = boolean> = {
@default 5000
*/
forceKillAfterDelay?: number | false;
forceKillAfterDelay?: IfAsync<IsSync, number | false>;

/**
If `true`, no quoting or escaping of arguments is done on Windows. Ignored on other platforms. This is set to `true` automatically when the `shell` option is `true`.
Expand Down

0 comments on commit 42bf3cd

Please sign in to comment.