Skip to content

Commit ab2a9ed

Browse files
authored
Fix type of result when using the reject: false option (#1046)
1 parent 11bbd9d commit ab2a9ed

10 files changed

Lines changed: 25 additions & 14 deletions

File tree

test-d/methods/command.test-d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ expectType<Result<{}>>(await execaCommand`unicorns ${false.toString()}`);
5555
expectError(await execaCommand`unicorns ${false}`);
5656

5757
expectError(await execaCommand`unicorns ${await execaCommand`echo foo`}`);
58+
expectError(await execaCommand`unicorns ${await execaCommand({reject: false})`echo foo`}`);
5859
expectError(await execaCommand`unicorns ${execaCommand`echo foo`}`);
5960
expectError(await execaCommand`unicorns ${[await execaCommand`echo foo`, 'bar']}`);
6061
expectError(await execaCommand`unicorns ${[execaCommand`echo foo`, 'bar']}`);

test-d/methods/main-async.test-d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ expectType<Result<{}>>(await execa`unicorns ${false.toString()}`);
5151
expectError(await execa`unicorns ${false}`);
5252

5353
expectType<Result<{}>>(await execa`unicorns ${await execa`echo foo`}`);
54+
expectType<Result<{}>>(await execa`unicorns ${await execa({reject: false})`echo foo`}`);
5455
expectError(await execa`unicorns ${execa`echo foo`}`);
5556
expectType<Result<{}>>(await execa`unicorns ${[await execa`echo foo`, 'bar']}`);
5657
expectError(await execa`unicorns ${[execa`echo foo`, 'bar']}`);

test-d/methods/main-sync.test-d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,5 @@ expectType<SyncResult<{}>>(execaSync`unicorns ${false.toString()}`);
5151
expectError(execaSync`unicorns ${false}`);
5252

5353
expectType<SyncResult<{}>>(execaSync`unicorns ${execaSync`echo foo`}`);
54+
expectType<SyncResult<{}>>(execaSync`unicorns ${execaSync({reject: false})`echo foo`}`);
5455
expectType<SyncResult<{}>>(execaSync`unicorns ${[execaSync`echo foo`, 'bar']}`);

test-d/methods/node.test-d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ expectType<Result<{}>>(await execaNode`unicorns ${false.toString()}`);
5151
expectError(await execaNode`unicorns ${false}`);
5252

5353
expectType<Result<{}>>(await execaNode`unicorns ${await execaNode`echo foo`}`);
54+
expectType<Result<{}>>(await execaNode`unicorns ${await execaNode({reject: false})`echo foo`}`);
5455
expectError(await execaNode`unicorns ${execaNode`echo foo`}`);
5556
expectType<Result<{}>>(await execaNode`unicorns ${[await execaNode`echo foo`, 'bar']}`);
5657
expectError(await execaNode`unicorns ${[execaNode`echo foo`, 'bar']}`);

test-d/methods/script-s.test-d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,5 @@ expectType<SyncResult<{}>>($.s`unicorns ${false.toString()}`);
6161
expectError($.s`unicorns ${false}`);
6262

6363
expectType<SyncResult<{}>>($.s`unicorns ${$.s`echo foo`}`);
64+
expectType<SyncResult<{}>>($.s`unicorns ${$.s({reject: false})`echo foo`}`);
6465
expectType<SyncResult<{}>>($.s`unicorns ${[$.s`echo foo`, 'bar']}`);

test-d/methods/script-sync.test-d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,5 @@ expectType<SyncResult<{}>>($.sync`unicorns ${false.toString()}`);
6161
expectError($.sync`unicorns ${false}`);
6262

6363
expectType<SyncResult<{}>>($.sync`unicorns ${$.sync`echo foo`}`);
64+
expectType<SyncResult<{}>>($.sync`unicorns ${$.sync({reject: false})`echo foo`}`);
6465
expectType<SyncResult<{}>>($.sync`unicorns ${[$.sync`echo foo`, 'bar']}`);

test-d/methods/script.test-d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ expectType<Result<{}>>(await $`unicorns ${false.toString()}`);
5151
expectError(await $`unicorns ${false}`);
5252

5353
expectType<Result<{}>>(await $`unicorns ${await $`echo foo`}`);
54+
expectType<Result<{}>>(await $`unicorns ${await $({reject: false})`echo foo`}`);
5455
expectError(await $`unicorns ${$`echo foo`}`);
5556
expectType<Result<{}>>(await $`unicorns ${[await $`echo foo`, 'bar']}`);
5657
expectError(await $`unicorns ${[$`echo foo`, 'bar']}`);

test-d/return/result-reject.test-d.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
import {expectType, expectError} from 'tsd';
2-
import {execa, execaSync} from '../../index.js';
1+
import {expectType, expectError, expectAssignable} from 'tsd';
2+
import {
3+
type Result,
4+
type SyncResult,
5+
execa,
6+
execaSync,
7+
} from '../../index.js';
38

49
const rejectsResult = await execa('unicorns');
10+
expectAssignable<Result>(rejectsResult);
511
expectError(rejectsResult.stack?.toString());
612
expectError(rejectsResult.message?.toString());
713
expectError(rejectsResult.shortMessage?.toString());
@@ -10,6 +16,7 @@ expectError(rejectsResult.code?.toString());
1016
expectError(rejectsResult.cause?.valueOf());
1117

1218
const noRejectsResult = await execa('unicorns', {reject: false});
19+
expectAssignable<Result>(noRejectsResult);
1320
expectType<string | undefined>(noRejectsResult.stack);
1421
expectType<string | undefined>(noRejectsResult.message);
1522
expectType<string | undefined>(noRejectsResult.shortMessage);
@@ -18,6 +25,7 @@ expectType<string | undefined>(noRejectsResult.code);
1825
expectType<unknown>(noRejectsResult.cause);
1926

2027
const rejectsSyncResult = execaSync('unicorns');
28+
expectAssignable<SyncResult>(rejectsSyncResult);
2129
expectError(rejectsSyncResult.stack?.toString());
2230
expectError(rejectsSyncResult.message?.toString());
2331
expectError(rejectsSyncResult.shortMessage?.toString());
@@ -26,6 +34,7 @@ expectError(rejectsSyncResult.code?.toString());
2634
expectError(rejectsSyncResult.cause?.valueOf());
2735

2836
const noRejectsSyncResult = execaSync('unicorns', {reject: false});
37+
expectAssignable<SyncResult>(noRejectsSyncResult);
2938
expectType<string | undefined>(noRejectsSyncResult.stack);
3039
expectType<string | undefined>(noRejectsSyncResult.message);
3140
expectType<string | undefined>(noRejectsSyncResult.shortMessage);

types/methods/template.d.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import type {CommonOptions} from '../arguments/options.js';
2-
import type {CommonResultInstance} from '../return/result.js';
1+
import type {Result, SyncResult} from '../return/result.js';
32

43
// Values allowed inside `...${...}...` template syntax
54
type TemplateExpressionItem =
65
| string
76
| number
8-
| CommonResultInstance<boolean, CommonOptions>;
7+
| Result
8+
| SyncResult;
99

1010
export type TemplateExpression = TemplateExpressionItem | readonly TemplateExpressionItem[];
1111

types/return/result.d.ts

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -161,19 +161,14 @@ export declare abstract class CommonResult<
161161
stack?: Error['stack'];
162162
}
163163

164-
export type CommonResultInstance<
165-
IsSync extends boolean,
166-
OptionsType extends CommonOptions,
167-
> = InstanceType<typeof CommonResult<IsSync, OptionsType>>;
168-
169164
type SuccessResult<
170165
IsSync extends boolean,
171166
OptionsType extends CommonOptions,
172-
> = CommonResultInstance<IsSync, OptionsType> & OmitErrorIfReject<OptionsType['reject']>;
167+
> = InstanceType<typeof CommonResult<IsSync, OptionsType>> & OmitErrorIfReject<OptionsType['reject']>;
173168

174-
type OmitErrorIfReject<RejectOption extends CommonOptions['reject']> = RejectOption extends false
175-
? {}
176-
: {[ErrorProperty in ErrorProperties]: never};
169+
type OmitErrorIfReject<RejectOption extends CommonOptions['reject']> = {
170+
[ErrorProperty in ErrorProperties]: RejectOption extends false ? unknown : never
171+
};
177172

178173
/**
179174
Result of a subprocess successful execution.

0 commit comments

Comments
 (0)