Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Methods type #1066

Merged
merged 1 commit into from
Jun 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 13 additions & 5 deletions docs/typescript.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@

## Available types

The following types can be imported: [`ResultPromise`](api.md#return-value), [`Subprocess`](api.md#subprocess), [`Result`](api.md#result), [`ExecaError`](api.md#execaerror), [`Options`](api.md#options-1), [`StdinOption`](api.md#optionsstdin), [`StdoutStderrOption`](api.md#optionsstdout), [`TemplateExpression`](api.md#execacommand) and [`Message`](api.md#subprocesssendmessagemessage-sendmessageoptions).
The following types can be imported: [`ResultPromise`](api.md#return-value), [`Subprocess`](api.md#subprocess), [`Result`](api.md#result), [`ExecaError`](api.md#execaerror), [`Options`](api.md#options-1), [`StdinOption`](api.md#optionsstdin), [`StdoutStderrOption`](api.md#optionsstdout), [`TemplateExpression`](api.md#execacommand), [`Message`](api.md#subprocesssendmessagemessage-sendmessageoptions), [`ExecaMethod`](api.md#execaoptions), [`ExecaNodeMethod`](api.md#execanodeoptions) and [`ExecaScriptMethod`](api.md#options).

```ts
import {
execa,
execa as execa_,
ExecaError,
type ResultPromise,
type Result,
Expand All @@ -21,8 +21,11 @@ import {
type StdoutStderrOption,
type TemplateExpression,
type Message,
type ExecaMethod,
} from 'execa';

const execa: ExecaMethod = execa_({preferLocal: true});

const options: Options = {
stdin: 'inherit' satisfies StdinOption,
stdout: 'pipe' satisfies StdoutStderrOption,
Expand All @@ -47,19 +50,22 @@ try {

## Synchronous execution

Their [synchronous](#synchronous-execution) counterparts are [`SyncResult`](api.md#result), [`ExecaSyncError`](api.md#execasyncerror), [`SyncOptions`](api.md#options-1), [`StdinSyncOption`](api.md#optionsstdin), [`StdoutStderrSyncOption`](api.md#optionsstdout) and [`TemplateExpression`](api.md#execacommand).
Their [synchronous](#synchronous-execution) counterparts are [`SyncResult`](api.md#result), [`ExecaSyncError`](api.md#execasyncerror), [`SyncOptions`](api.md#options-1), [`StdinSyncOption`](api.md#optionsstdin), [`StdoutStderrSyncOption`](api.md#optionsstdout), [`TemplateExpression`](api.md#execacommand), [`ExecaSyncMethod`](api.md#execasyncoptions) and [`ExecaScriptSyncMethod`](api.md#syncoptions).

```ts
import {
execaSync,
execaSync as execaSync_,
ExecaSyncError,
type SyncResult,
type SyncOptions,
type StdinSyncOption,
type StdoutStderrSyncOption,
type TemplateExpression,
type ExecaSyncMethod,
} from 'execa';

const execaSync: ExecaSyncMethod = execaSync_({preferLocal: true});

const options: SyncOptions = {
stdin: 'inherit' satisfies StdinSyncOption,
stdout: 'pipe' satisfies StdoutStderrSyncOption,
Expand All @@ -84,11 +90,13 @@ The above examples demonstrate those types. However, types are automatically inf

```ts
import {
execa,
execa as execa_,
ExecaError,
type Result,
} from 'execa';

const execa = execa_({preferLocal: true});

const printResultStdout = (result: Result) => {
console.log('Stdout', result.stdout);
};
Expand Down
8 changes: 4 additions & 4 deletions index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ export type {Result, SyncResult} from './types/return/result.js';
export type {ResultPromise, Subprocess} from './types/subprocess/subprocess.js';
export {ExecaError, ExecaSyncError} from './types/return/final-error.js';

export {execa} from './types/methods/main-async.js';
export {execaSync} from './types/methods/main-sync.js';
export {execa, type ExecaMethod} from './types/methods/main-async.js';
export {execaSync, type ExecaSyncMethod} from './types/methods/main-sync.js';
export {execaCommand, execaCommandSync, parseCommandString} from './types/methods/command.js';
export {$} from './types/methods/script.js';
export {execaNode} from './types/methods/node.js';
export {$, type ExecaScriptMethod, type ExecaScriptSyncMethod} from './types/methods/script.js';
export {execaNode, type ExecaNodeMethod} from './types/methods/node.js';

export {
sendMessage,
Expand Down
63 changes: 63 additions & 0 deletions test-d/methods/list.test-d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import {expectAssignable} from 'tsd';
import {
type ExecaMethod,
type ExecaSyncMethod,
type ExecaNodeMethod,
type ExecaScriptMethod,
type ExecaScriptSyncMethod,
execa,
execaSync,
execaNode,
$,
} from '../../index.js';

const options = {preferLocal: true} as const;
const secondOptions = {node: true} as const;

expectAssignable<ExecaMethod>(execa);
expectAssignable<ExecaMethod>(execa({}));
expectAssignable<ExecaMethod>(execa({})({}));
expectAssignable<ExecaMethod>(execa(options));
expectAssignable<ExecaMethod>(execa(options)(secondOptions));
expectAssignable<ExecaMethod>(execa(options)({}));
expectAssignable<ExecaMethod>(execa({})(options));

expectAssignable<ExecaSyncMethod>(execaSync);
expectAssignable<ExecaSyncMethod>(execaSync({}));
expectAssignable<ExecaSyncMethod>(execaSync({})({}));
expectAssignable<ExecaSyncMethod>(execaSync(options));
expectAssignable<ExecaSyncMethod>(execaSync(options)(secondOptions));
expectAssignable<ExecaSyncMethod>(execaSync(options)({}));
expectAssignable<ExecaSyncMethod>(execaSync({})(options));

expectAssignable<ExecaNodeMethod>(execaNode);
expectAssignable<ExecaNodeMethod>(execaNode({}));
expectAssignable<ExecaNodeMethod>(execaNode({})({}));
expectAssignable<ExecaNodeMethod>(execaNode(options));
expectAssignable<ExecaNodeMethod>(execaNode(options)(secondOptions));
expectAssignable<ExecaNodeMethod>(execaNode(options)({}));
expectAssignable<ExecaNodeMethod>(execaNode({})(options));

expectAssignable<ExecaScriptMethod>($);
expectAssignable<ExecaScriptMethod>($({}));
expectAssignable<ExecaScriptMethod>($({})({}));
expectAssignable<ExecaScriptMethod>($(options));
expectAssignable<ExecaScriptMethod>($(options)(secondOptions));
expectAssignable<ExecaScriptMethod>($(options)({}));
expectAssignable<ExecaScriptMethod>($({})(options));

expectAssignable<ExecaScriptSyncMethod>($.sync);
expectAssignable<ExecaScriptSyncMethod>($.sync({}));
expectAssignable<ExecaScriptSyncMethod>($.sync({})({}));
expectAssignable<ExecaScriptSyncMethod>($.sync(options));
expectAssignable<ExecaScriptSyncMethod>($.sync(options)(secondOptions));
expectAssignable<ExecaScriptSyncMethod>($.sync(options)({}));
expectAssignable<ExecaScriptSyncMethod>($.sync({})(options));

expectAssignable<ExecaScriptSyncMethod>($.s);
expectAssignable<ExecaScriptSyncMethod>($.s({}));
expectAssignable<ExecaScriptSyncMethod>($.s({})({}));
expectAssignable<ExecaScriptSyncMethod>($.s(options));
expectAssignable<ExecaScriptSyncMethod>($.s(options)(secondOptions));
expectAssignable<ExecaScriptSyncMethod>($.s(options)({}));
expectAssignable<ExecaScriptSyncMethod>($.s({})(options));
2 changes: 1 addition & 1 deletion types/methods/main-async.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ export declare const execa: ExecaMethod<{}>;
/**
`execa()` method either exported by Execa, or bound using `execa(options)`.
*/
type ExecaMethod<OptionsType extends Options> =
export type ExecaMethod<OptionsType extends Options = Options> =
& ExecaBind<OptionsType>
& ExecaTemplate<OptionsType>
& ExecaArrayLong<OptionsType>
Expand Down
2 changes: 1 addition & 1 deletion types/methods/main-sync.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export declare const execaSync: ExecaSyncMethod<{}>;

// For the moment, we purposely do not export `ExecaSyncMethod` and `ExecaScriptSyncMethod`.
// This is because synchronous invocation is discouraged.
type ExecaSyncMethod<OptionsType extends SyncOptions> =
export type ExecaSyncMethod<OptionsType extends SyncOptions = SyncOptions> =
& ExecaSyncBind<OptionsType>
& ExecaSyncTemplate<OptionsType>
& ExecaSyncArrayLong<OptionsType>
Expand Down
2 changes: 1 addition & 1 deletion types/methods/node.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export declare const execaNode: ExecaNodeMethod<{}>;
/**
`execaNode()` method either exported by Execa, or bound using `execaNode(options)`.
*/
type ExecaNodeMethod<OptionsType extends Options> =
export type ExecaNodeMethod<OptionsType extends Options = Options> =
& ExecaNodeBind<OptionsType>
& ExecaNodeTemplate<OptionsType>
& ExecaNodeArrayLong<OptionsType>
Expand Down
4 changes: 2 additions & 2 deletions types/methods/script.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export const $: ExecaScriptMethod<{}>;
/**
`$()` method either exported by Execa, or bound using `$(options)`.
*/
type ExecaScriptMethod<OptionsType extends CommonOptions> =
export type ExecaScriptMethod<OptionsType extends CommonOptions = CommonOptions> =
& ExecaScriptBind<OptionsType>
& ExecaScriptTemplate<OptionsType>
& ExecaScriptArrayLong<OptionsType>
Expand Down Expand Up @@ -88,7 +88,7 @@ type ExecaScriptArrayShort<OptionsType extends CommonOptions> =
/**
`$.sync()` method either exported by Execa, or bound using `$.sync(options)`.
*/
type ExecaScriptSyncMethod<OptionsType extends CommonOptions> =
export type ExecaScriptSyncMethod<OptionsType extends CommonOptions = CommonOptions> =
& ExecaScriptSyncBind<OptionsType>
& ExecaScriptSyncTemplate<OptionsType>
& ExecaScriptSyncArrayLong<OptionsType>
Expand Down