Skip to content

Commit 2d84752

Browse files
authored
Export TemplateExpression type (#1049)
1 parent b8c131c commit 2d84752

4 files changed

Lines changed: 32 additions & 6 deletions

File tree

docs/typescript.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
## Available types
1010

11-
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), [`StdinOption`](api.md#optionsstdin) and [`StdoutStderrOption`](api.md#optionsstdout).
11+
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), [`StdinOption`](api.md#optionsstdin), [`StdoutStderrOption`](api.md#optionsstdout) and [`TemplateExpression`](api.md#execacommand).
1212

1313
```ts
1414
import {
@@ -19,6 +19,7 @@ import {
1919
type Options,
2020
type StdinOption,
2121
type StdoutStderrOption,
22+
type TemplateExpression,
2223
} from 'execa';
2324

2425
const options: Options = {
@@ -27,9 +28,10 @@ const options: Options = {
2728
stderr: 'pipe' satisfies StdoutStderrOption,
2829
timeout: 1000,
2930
};
31+
const task: TemplateExpression = 'build';
3032

3133
try {
32-
const subprocess: ResultPromise = execa(options)`npm run build`;
34+
const subprocess: ResultPromise = execa(options)`npm run ${task}`;
3335
const result: Result = await subprocess;
3436
console.log(result.stdout);
3537
} catch (error) {
@@ -41,7 +43,7 @@ try {
4143

4244
## Synchronous execution
4345

44-
Their [synchronous](#synchronous-execution) counterparts are [`SyncResult`](api.md#result), [`ExecaSyncError`](api.md#execasyncerror), [`SyncOptions`](api.md#options), [`StdinSyncOption`](api.md#optionsstdin) and [`StdoutStderrSyncOption`](api.md#optionsstdout).
46+
Their [synchronous](#synchronous-execution) counterparts are [`SyncResult`](api.md#result), [`ExecaSyncError`](api.md#execasyncerror), [`SyncOptions`](api.md#options), [`StdinSyncOption`](api.md#optionsstdin), [`StdoutStderrSyncOption`](api.md#optionsstdout) and [`TemplateExpression`](api.md#execacommand).
4547

4648
```ts
4749
import {
@@ -51,6 +53,7 @@ import {
5153
type SyncOptions,
5254
type StdinSyncOption,
5355
type StdoutStderrSyncOption,
56+
type TemplateExpression,
5457
} from 'execa';
5558

5659
const options: SyncOptions = {
@@ -59,9 +62,10 @@ const options: SyncOptions = {
5962
stderr: 'pipe' satisfies StdoutStderrSyncOption,
6063
timeout: 1000,
6164
};
65+
const task: TemplateExpression = 'build';
6266

6367
try {
64-
const result: SyncResult = execaSync(options)`npm run build`;
68+
const result: SyncResult = execaSync(options)`npm run ${task}`;
6569
console.log(result.stdout);
6670
} catch (error) {
6771
if (error instanceof ExecaSyncError) {
@@ -91,9 +95,10 @@ const options = {
9195
stderr: 'pipe',
9296
timeout: 1000,
9397
} as const;
98+
const task = 'build';
9499

95100
try {
96-
const subprocess = execa(options)`npm run build`;
101+
const subprocess = execa(options)`npm run ${task}`;
97102
const result = await subprocess;
98103
printResultStdout(result);
99104
} catch (error) {

index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export type {Options, SyncOptions} from './types/arguments/options.js';
88
export type {Result, SyncResult} from './types/return/result.js';
99
export type {ResultPromise, Subprocess} from './types/subprocess/subprocess.js';
1010
export {ExecaError, ExecaSyncError} from './types/return/final-error.js';
11+
export type {TemplateExpression} from './types/methods/template.js';
1112
export {execa} from './types/methods/main-async.js';
1213
export {execaSync} from './types/methods/main-sync.js';
1314
export {execaCommand, execaCommandSync} from './types/methods/command.js';

test-d/methods/template.test-d.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import {expectAssignable, expectNotAssignable} from 'tsd';
2+
import {execa, type TemplateExpression} from '../../index.js';
3+
4+
const stringArray = ['foo', 'bar'] as const;
5+
const numberArray = [1, 2] as const;
6+
7+
expectAssignable<TemplateExpression>('unicorns');
8+
expectAssignable<TemplateExpression>(1);
9+
expectAssignable<TemplateExpression>(stringArray);
10+
expectAssignable<TemplateExpression>(numberArray);
11+
expectAssignable<TemplateExpression>(false.toString());
12+
expectNotAssignable<TemplateExpression>(false);
13+
14+
expectAssignable<TemplateExpression>(await execa`echo foo`);
15+
expectAssignable<TemplateExpression>(await execa({reject: false})`echo foo`);
16+
expectNotAssignable<TemplateExpression>(execa`echo foo`);
17+
expectAssignable<TemplateExpression>([await execa`echo foo`, 'bar']);
18+
expectNotAssignable<TemplateExpression>([execa`echo foo`, 'bar']);

types/methods/template.d.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import type {Result, SyncResult} from '../return/result.js';
22

3-
// Values allowed inside `...${...}...` template syntax
43
type TemplateExpressionItem =
54
| string
65
| number
76
| Result
87
| SyncResult;
98

9+
/**
10+
Value allowed inside `${...}` when using the template string syntax.
11+
*/
1012
export type TemplateExpression = TemplateExpressionItem | readonly TemplateExpressionItem[];
1113

1214
// `...${...}...` template syntax

0 commit comments

Comments
 (0)