Skip to content

Commit f66599b

Browse files
committed
fix(types): allow exported types to specify custom ExecutionContext
1 parent 19aeea0 commit f66599b

File tree

2 files changed

+78
-45
lines changed

2 files changed

+78
-45
lines changed

types/module.ts

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import type { Arguments, EffectorProgram, ExecutionContext } from 'types/program
99
* subtype of this interface.
1010
*/
1111
export type Configuration<
12-
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>
12+
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>,
13+
CustomExecutionContext extends ExecutionContext = ExecutionContext
1314
> = {
1415
/**
1516
* An array of `command` aliases [as
@@ -52,18 +53,18 @@ export type Configuration<
5253
| { [key: string]: _Options }
5354
| ((
5455
blackFlag: Omit<
55-
EffectorProgram<CustomCliArguments>,
56+
EffectorProgram<CustomCliArguments, CustomExecutionContext>,
5657
| 'parseAsync'
5758
| 'fail'
5859
| 'command'
5960
| 'command_deferred'
6061
| 'command_finalize_deferred'
6162
>,
6263
helpOrVersionSet: boolean,
63-
argv?: Arguments<CustomCliArguments>
64+
argv?: Arguments<CustomCliArguments, CustomExecutionContext>
6465
) =>
6566
| void
66-
| EffectorProgram<CustomCliArguments>
67+
| EffectorProgram<CustomCliArguments, CustomExecutionContext>
6768
| { [key: string]: _Options }
6869
| _Program);
6970
/**
@@ -100,7 +101,9 @@ export type Configuration<
100101
*
101102
* @default undefined
102103
*/
103-
handler: (argv: Arguments<CustomCliArguments>) => Promisable<void>;
104+
handler: (
105+
argv: Arguments<CustomCliArguments, CustomExecutionContext>
106+
) => Promisable<void>;
104107
/**
105108
* The name of the command. Any spaces will be replaced with hyphens.
106109
* Including a character that yargs does not consider valid for a
@@ -133,47 +136,51 @@ export type Configuration<
133136
* files that will eventually get imported via auto-discovery.
134137
*/
135138
export type RootConfiguration<
136-
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>
137-
> = Partial<ParentConfiguration<CustomCliArguments>>;
139+
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>,
140+
CustomExecutionContext extends ExecutionContext = ExecutionContext
141+
> = Partial<ParentConfiguration<CustomCliArguments, CustomExecutionContext>>;
138142

139143
/**
140144
* A partial extension to the {@link Configuration} interface for non-root
141145
* parent configurations. This type was designed for use in external ESM/CJS
142146
* module files that will eventually get imported via auto-discovery.
143147
*/
144148
export type ParentConfiguration<
145-
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>
146-
> = Partial<Configuration<CustomCliArguments>>;
149+
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>,
150+
CustomExecutionContext extends ExecutionContext = ExecutionContext
151+
> = Partial<Configuration<CustomCliArguments, CustomExecutionContext>>;
147152

148153
/**
149154
* A partial extension to the {@link Configuration} interface for child
150155
* configurations. This type was designed for use in external ESM/CJS module
151156
* files that will eventually get imported via auto-discovery.
152157
*/
153158
export type ChildConfiguration<
154-
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>
155-
> = Partial<Configuration<CustomCliArguments>>;
159+
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>,
160+
CustomExecutionContext extends ExecutionContext = ExecutionContext
161+
> = Partial<Configuration<CustomCliArguments, CustomExecutionContext>>;
156162

157163
/**
158164
* Represents a Configuration object imported from a CJS/ESM module external to
159165
* the CLI framework (e.g. importing an auto-discovered config module from a
160166
* file).
161167
*/
162168
export type ImportedConfigurationModule<
163-
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>
169+
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>,
170+
CustomExecutionContext extends ExecutionContext = ExecutionContext
164171
> = (
165172
| ((
166173
context: ExecutionContext
167174
) => Promisable<
168175
Partial<
169-
| RootConfiguration<CustomCliArguments>
170-
| ParentConfiguration<CustomCliArguments>
171-
| ChildConfiguration<CustomCliArguments>
176+
| RootConfiguration<CustomCliArguments, CustomExecutionContext>
177+
| ParentConfiguration<CustomCliArguments, CustomExecutionContext>
178+
| ChildConfiguration<CustomCliArguments, CustomExecutionContext>
172179
>
173180
>)
174181
| Partial<
175-
| RootConfiguration<CustomCliArguments>
176-
| ParentConfiguration<CustomCliArguments>
177-
| ChildConfiguration<CustomCliArguments>
182+
| RootConfiguration<CustomCliArguments, CustomExecutionContext>
183+
| ParentConfiguration<CustomCliArguments, CustomExecutionContext>
184+
| ChildConfiguration<CustomCliArguments, CustomExecutionContext>
178185
>
179-
) & { default?: ImportedConfigurationModule<CustomCliArguments> };
186+
) & { default?: ImportedConfigurationModule<CustomCliArguments, CustomExecutionContext> };

types/program.ts

Lines changed: 52 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ import type { runProgram } from 'universe/util';
1616
* `unknown` for unrecognized arguments.
1717
*/
1818
export type Arguments<
19-
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>
20-
> = _Arguments<FrameworkArguments & CustomCliArguments>;
19+
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>,
20+
CustomExecutionContext extends ExecutionContext = ExecutionContext
21+
> = _Arguments<FrameworkArguments<CustomExecutionContext> & CustomCliArguments>;
2122

2223
/**
2324
* Represents an empty or "null" `Arguments` object devoid of useful data.
@@ -26,10 +27,12 @@ export type Arguments<
2627
* various `Arguments`-returning functions when an exceptional event prevents
2728
* yargs from returning a real `Arguments` parse result.
2829
*/
29-
export type NullArguments = {
30+
export type NullArguments<
31+
CustomExecutionContext extends ExecutionContext = ExecutionContext
32+
> = {
3033
$0: '<NullArguments: no parse result available due to exception>';
3134
_: [];
32-
} & FrameworkArguments;
35+
} & FrameworkArguments<CustomExecutionContext>;
3336

3437
/**
3538
* Represents a pre-configured yargs instance ready for argument parsing and
@@ -39,9 +42,10 @@ export type NullArguments = {
3942
* by yargs but with several differences and should be preferred.
4043
*/
4144
export type Program<
42-
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>
45+
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>,
46+
CustomExecutionContext extends ExecutionContext = ExecutionContext
4347
> = Omit<
44-
_Program<FrameworkArguments & CustomCliArguments>,
48+
_Program<FrameworkArguments<CustomExecutionContext> & CustomCliArguments>,
4549
| 'command'
4650
| 'onFinishCommand'
4751
| 'showHelpOnFail'
@@ -64,15 +68,18 @@ export type Program<
6468
command: {
6569
(
6670
command: string[],
67-
description: Configuration<CustomCliArguments>['description'],
71+
description: Configuration<
72+
CustomCliArguments,
73+
CustomExecutionContext
74+
>['description'],
6875
builder:
6976
| ((yargs: _Program, helpOrVersionSet: boolean) => _Program)
7077
| Record<string, never>,
71-
handler: Configuration<CustomCliArguments>['handler'],
78+
handler: Configuration<CustomCliArguments, CustomExecutionContext>['handler'],
7279
// ? configureArguments already handles this use case, so...
7380
middlewares: [],
74-
deprecated: Configuration<CustomCliArguments>['deprecated']
75-
): Program<CustomCliArguments>;
81+
deprecated: Configuration<CustomCliArguments, CustomExecutionContext>['deprecated']
82+
): Program<CustomCliArguments, CustomExecutionContext>;
7683
};
7784

7885
/**
@@ -86,7 +93,9 @@ export type Program<
8693
*
8794
* @see {@link _Program.showHelpOnFail}
8895
*/
89-
showHelpOnFail: (enabled: boolean) => Program<CustomCliArguments>;
96+
showHelpOnFail: (
97+
enabled: boolean
98+
) => Program<CustomCliArguments, CustomExecutionContext>;
9099

91100
/**
92101
* Identical to `yargs::command` except its execution is enqueued and
@@ -95,7 +104,7 @@ export type Program<
95104
* @see {@link _Program.command}
96105
* @internal
97106
*/
98-
command_deferred: Program<CustomCliArguments>['command'];
107+
command_deferred: Program<CustomCliArguments, CustomExecutionContext>['command'];
99108

100109
/**
101110
* @see {@link Program.command_deferred}
@@ -108,22 +117,31 @@ export type Program<
108117
* Represents an "effector" {@link Program} instance.
109118
*/
110119
export type EffectorProgram<
111-
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>
112-
> = Omit<Program<CustomCliArguments>, 'command_deferred' | 'command_finalize_deferred'>;
120+
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>,
121+
CustomExecutionContext extends ExecutionContext = ExecutionContext
122+
> = Omit<
123+
Program<CustomCliArguments, CustomExecutionContext>,
124+
'command_deferred' | 'command_finalize_deferred'
125+
>;
113126

114127
/**
115128
* Represents an "helper" {@link Program} instance.
116129
*/
117130
export type HelperProgram<
118-
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>
119-
> = Omit<Program<CustomCliArguments>, 'demand' | 'demandCommand' | 'command'>;
131+
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>,
132+
CustomExecutionContext extends ExecutionContext = ExecutionContext
133+
> = Omit<
134+
Program<CustomCliArguments, CustomExecutionContext>,
135+
'demand' | 'demandCommand' | 'command'
136+
>;
120137

121138
/**
122139
* Represents an "router" {@link Program} instance.
123140
*/
124141
export type RouterProgram<
125-
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>
126-
> = Pick<Program<CustomCliArguments>, 'parseAsync' | 'command'>;
142+
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>,
143+
CustomExecutionContext extends ExecutionContext = ExecutionContext
144+
> = Pick<Program<CustomCliArguments, CustomExecutionContext>, 'parseAsync' | 'command'>;
127145

128146
/**
129147
* Represents valid {@link Configuration} module types that can be loaded.
@@ -140,21 +158,27 @@ export type ProgramDescriptor = 'effector' | 'helper' | 'router';
140158
*/
141159
export type DescriptorToProgram<
142160
Descriptor extends ProgramDescriptor,
143-
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>
161+
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>,
162+
CustomExecutionContext extends ExecutionContext = ExecutionContext
144163
> = 'effector' extends Descriptor
145-
? EffectorProgram<CustomCliArguments>
164+
? EffectorProgram<CustomCliArguments, CustomExecutionContext>
146165
: 'helper' extends Descriptor
147-
? HelperProgram<CustomCliArguments>
148-
: RouterProgram<CustomCliArguments>;
166+
? HelperProgram<CustomCliArguments, CustomExecutionContext>
167+
: RouterProgram<CustomCliArguments, CustomExecutionContext>;
149168

150169
/**
151170
* Represents the program types that represent every Black Flag command as
152171
* aptly-named values in an object.
153172
*/
154173
export type Programs<
155-
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>
174+
CustomCliArguments extends Record<string, unknown> = Record<string, unknown>,
175+
CustomExecutionContext extends ExecutionContext = ExecutionContext
156176
> = {
157-
[Descriptor in ProgramDescriptor]: DescriptorToProgram<Descriptor, CustomCliArguments>;
177+
[Descriptor in ProgramDescriptor]: DescriptorToProgram<
178+
Descriptor,
179+
CustomCliArguments,
180+
CustomExecutionContext
181+
>;
158182
};
159183

160184
/**
@@ -230,8 +254,10 @@ export type ProgramMetadata = {
230254
* (e.g. `Arguments<MyCustomArgs>`), which will extend `FrameworkArguments` for
231255
* you.
232256
*/
233-
export type FrameworkArguments = {
234-
[$executionContext]: ExecutionContext;
257+
export type FrameworkArguments<
258+
CustomExecutionContext extends ExecutionContext = ExecutionContext
259+
> = {
260+
[$executionContext]: CustomExecutionContext;
235261
};
236262

237263
/**

0 commit comments

Comments
 (0)