@gunshi/definition 0.27.0-alpha.9 → 0.27.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -1
- package/lib/index.d.ts +1052 -143
- package/lib/index.js +227 -6
- package/package.json +5 -5
package/lib/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
//#region ../../node_modules/.pnpm/args-tokens@0.
|
|
1
|
+
//#region ../../node_modules/.pnpm/args-tokens@0.23.0/node_modules/args-tokens/lib/parser-C6MbpZjd.d.ts
|
|
2
2
|
//#region src/parser.d.ts
|
|
3
3
|
/**
|
|
4
4
|
* Entry point of argument parser.
|
|
5
|
+
*
|
|
5
6
|
* @module
|
|
6
7
|
*/
|
|
7
8
|
/**
|
|
@@ -14,6 +15,7 @@
|
|
|
14
15
|
*/
|
|
15
16
|
/**
|
|
16
17
|
* Argument token Kind.
|
|
18
|
+
*
|
|
17
19
|
* - `option`: option token, support short option (e.g. `-x`) and long option (e.g. `--foo`)
|
|
18
20
|
* - `option-terminator`: option terminator (`--`) token, see guideline 10 in https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
|
|
19
21
|
* - `positional`: positional token
|
|
@@ -53,91 +55,462 @@ interface ArgToken {
|
|
|
53
55
|
* Parser Options.
|
|
54
56
|
*/
|
|
55
57
|
//#endregion
|
|
56
|
-
//#region ../../node_modules/.pnpm/args-tokens@0.
|
|
58
|
+
//#region ../../node_modules/.pnpm/args-tokens@0.23.0/node_modules/args-tokens/lib/resolver-D64nGlCD.d.ts
|
|
57
59
|
//#region src/resolver.d.ts
|
|
58
60
|
|
|
59
61
|
/**
|
|
60
|
-
* An argument schema
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* - `required`
|
|
64
|
-
* - `type`
|
|
65
|
-
* - `default` property type, not
|
|
62
|
+
* An argument schema definition for command-line argument parsing.
|
|
63
|
+
*
|
|
64
|
+
* This schema is similar to the schema of Node.js `util.parseArgs` but with extended features:
|
|
65
|
+
* - Additional `required` and `description` properties
|
|
66
|
+
* - Extended `type` support: 'string', 'boolean', 'number', 'enum', 'positional', 'custom'
|
|
67
|
+
* - Simplified `default` property (single type, not union types)
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* Basic string argument:
|
|
71
|
+
* ```ts
|
|
72
|
+
* const schema: ArgSchema = {
|
|
73
|
+
* type: 'string',
|
|
74
|
+
* description: 'Server hostname',
|
|
75
|
+
* default: 'localhost'
|
|
76
|
+
* }
|
|
77
|
+
* ```
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* Required number argument with alias:
|
|
81
|
+
* ```ts
|
|
82
|
+
* const schema: ArgSchema = {
|
|
83
|
+
* type: 'number',
|
|
84
|
+
* short: 'p',
|
|
85
|
+
* description: 'Port number to listen on',
|
|
86
|
+
* required: true
|
|
87
|
+
* }
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* Enum argument with choices:
|
|
92
|
+
* ```ts
|
|
93
|
+
* const schema: ArgSchema = {
|
|
94
|
+
* type: 'enum',
|
|
95
|
+
* choices: ['info', 'warn', 'error'],
|
|
96
|
+
* description: 'Logging level',
|
|
97
|
+
* default: 'info'
|
|
98
|
+
* }
|
|
99
|
+
* ```
|
|
66
100
|
*/
|
|
67
101
|
interface ArgSchema {
|
|
68
102
|
/**
|
|
69
|
-
* Type of argument.
|
|
103
|
+
* Type of the argument value.
|
|
104
|
+
*
|
|
105
|
+
* - `'string'`: Text value (default if not specified)
|
|
106
|
+
* - `'boolean'`: `true`/`false` flag (can be negatable with `--no-` prefix)
|
|
107
|
+
* - `'number'`: Numeric value (parsed as integer or float)
|
|
108
|
+
* - `'enum'`: One of predefined string values (requires `choices` property)
|
|
109
|
+
* - `'positional'`: Non-option argument by position
|
|
110
|
+
* - `'custom'`: Custom parsing with user-defined `parse` function
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* Different argument types:
|
|
114
|
+
* ```ts
|
|
115
|
+
* {
|
|
116
|
+
* name: { type: 'string' }, // --name value
|
|
117
|
+
* verbose: { type: 'boolean' }, // --verbose or --no-verbose
|
|
118
|
+
* port: { type: 'number' }, // --port 3000
|
|
119
|
+
* level: { type: 'enum', choices: ['debug', 'info'] },
|
|
120
|
+
* file: { type: 'positional' }, // first positional arg
|
|
121
|
+
* config: { type: 'custom', parse: JSON.parse }
|
|
122
|
+
* }
|
|
123
|
+
* ```
|
|
70
124
|
*/
|
|
71
125
|
type: 'string' | 'boolean' | 'number' | 'enum' | 'positional' | 'custom';
|
|
72
126
|
/**
|
|
73
|
-
*
|
|
127
|
+
* Single character alias for the long option name.
|
|
128
|
+
*
|
|
129
|
+
* As example, allows users to use `-x` instead of `--extended-option`.
|
|
130
|
+
* Only valid for non-positional argument types.
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* Short alias usage:
|
|
134
|
+
* ```ts
|
|
135
|
+
* {
|
|
136
|
+
* verbose: {
|
|
137
|
+
* type: 'boolean',
|
|
138
|
+
* short: 'v' // Enables both --verbose and -v
|
|
139
|
+
* },
|
|
140
|
+
* port: {
|
|
141
|
+
* type: 'number',
|
|
142
|
+
* short: 'p' // Enables both --port 3000 and -p 3000
|
|
143
|
+
* }
|
|
144
|
+
* }
|
|
145
|
+
* ```
|
|
74
146
|
*/
|
|
75
147
|
short?: string;
|
|
76
148
|
/**
|
|
77
|
-
*
|
|
149
|
+
* Human-readable description of the argument's purpose.
|
|
150
|
+
*
|
|
151
|
+
* Used for help text generation and documentation.
|
|
152
|
+
* Should be concise but descriptive enough to understand the argument's role.
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* Descriptive help text:
|
|
156
|
+
* ```ts
|
|
157
|
+
* {
|
|
158
|
+
* config: {
|
|
159
|
+
* type: 'string',
|
|
160
|
+
* description: 'Path to configuration file'
|
|
161
|
+
* },
|
|
162
|
+
* timeout: {
|
|
163
|
+
* type: 'number',
|
|
164
|
+
* description: 'Request timeout in milliseconds'
|
|
165
|
+
* }
|
|
166
|
+
* }
|
|
167
|
+
* ```
|
|
78
168
|
*/
|
|
79
169
|
description?: string;
|
|
80
170
|
/**
|
|
81
|
-
*
|
|
171
|
+
* Marks the argument as required.
|
|
172
|
+
*
|
|
173
|
+
* When `true`, the argument must be provided by the user.
|
|
174
|
+
* If missing, an `ArgResolveError` with type 'required' will be thrown.
|
|
175
|
+
*
|
|
176
|
+
* Note: Only `true` is allowed (not `false`) to make intent explicit.
|
|
177
|
+
*
|
|
178
|
+
* @example
|
|
179
|
+
* Required arguments:
|
|
180
|
+
* ```ts
|
|
181
|
+
* {
|
|
182
|
+
* input: {
|
|
183
|
+
* type: 'string',
|
|
184
|
+
* required: true, // Must be provided: --input file.txt
|
|
185
|
+
* description: 'Input file path'
|
|
186
|
+
* },
|
|
187
|
+
* source: {
|
|
188
|
+
* type: 'positional',
|
|
189
|
+
* required: true // First positional argument must exist
|
|
190
|
+
* }
|
|
191
|
+
* }
|
|
192
|
+
* ```
|
|
82
193
|
*/
|
|
83
194
|
required?: true;
|
|
84
195
|
/**
|
|
85
|
-
*
|
|
196
|
+
* Allows the argument to accept multiple values.
|
|
197
|
+
*
|
|
198
|
+
* When `true`, the resolved value becomes an array.
|
|
199
|
+
* For options: can be specified multiple times (--tag foo --tag bar)
|
|
200
|
+
* For positional: collects remaining positional arguments
|
|
201
|
+
*
|
|
202
|
+
* Note: Only `true` is allowed (not `false`) to make intent explicit.
|
|
203
|
+
*
|
|
204
|
+
* @example
|
|
205
|
+
* Multiple values:
|
|
206
|
+
* ```ts
|
|
207
|
+
* {
|
|
208
|
+
* tags: {
|
|
209
|
+
* type: 'string',
|
|
210
|
+
* multiple: true, // --tags foo --tags bar → ['foo', 'bar']
|
|
211
|
+
* description: 'Tags to apply'
|
|
212
|
+
* },
|
|
213
|
+
* files: {
|
|
214
|
+
* type: 'positional',
|
|
215
|
+
* multiple: true // Collects all remaining positional args
|
|
216
|
+
* }
|
|
217
|
+
* }
|
|
218
|
+
* ```
|
|
86
219
|
*/
|
|
87
220
|
multiple?: true;
|
|
88
221
|
/**
|
|
89
|
-
*
|
|
222
|
+
* Enables negation for boolean arguments using `--no-` prefix.
|
|
223
|
+
*
|
|
224
|
+
* When `true`, allows users to explicitly set the boolean to `false`
|
|
225
|
+
* using `--no-option-name`. When `false` or omitted, only positive
|
|
226
|
+
* form is available.
|
|
227
|
+
*
|
|
228
|
+
* Only applicable to `type: 'boolean'` arguments.
|
|
229
|
+
*
|
|
230
|
+
* @example
|
|
231
|
+
* Negatable boolean:
|
|
232
|
+
* ```ts
|
|
233
|
+
* {
|
|
234
|
+
* color: {
|
|
235
|
+
* type: 'boolean',
|
|
236
|
+
* negatable: true,
|
|
237
|
+
* default: true,
|
|
238
|
+
* description: 'Enable colorized output'
|
|
239
|
+
* }
|
|
240
|
+
* // Usage: --color (true), --no-color (false)
|
|
241
|
+
* }
|
|
242
|
+
* ```
|
|
90
243
|
*/
|
|
91
244
|
negatable?: boolean;
|
|
92
245
|
/**
|
|
93
|
-
*
|
|
246
|
+
* Array of allowed string values for enum-type arguments.
|
|
247
|
+
*
|
|
248
|
+
* Required when `type: 'enum'`. The argument value must be one of these choices,
|
|
249
|
+
* otherwise an `ArgResolveError` with type 'type' will be thrown.
|
|
250
|
+
*
|
|
251
|
+
* Supports both mutable arrays and readonly arrays for type safety.
|
|
252
|
+
*
|
|
253
|
+
* @example
|
|
254
|
+
* Enum choices:
|
|
255
|
+
* ```ts
|
|
256
|
+
* {
|
|
257
|
+
* logLevel: {
|
|
258
|
+
* type: 'enum',
|
|
259
|
+
* choices: ['debug', 'info', 'warn', 'error'] as const,
|
|
260
|
+
* default: 'info',
|
|
261
|
+
* description: 'Logging verbosity level'
|
|
262
|
+
* },
|
|
263
|
+
* format: {
|
|
264
|
+
* type: 'enum',
|
|
265
|
+
* choices: ['json', 'yaml', 'toml'],
|
|
266
|
+
* description: 'Output format'
|
|
267
|
+
* }
|
|
268
|
+
* }
|
|
269
|
+
* ```
|
|
94
270
|
*/
|
|
95
271
|
choices?: string[] | readonly string[];
|
|
96
272
|
/**
|
|
97
|
-
*
|
|
98
|
-
*
|
|
273
|
+
* Default value used when the argument is not provided.
|
|
274
|
+
*
|
|
275
|
+
* The type must match the argument's `type` property:
|
|
276
|
+
* - `string` type: string default
|
|
277
|
+
* - `boolean` type: boolean default
|
|
278
|
+
* - `number` type: number default
|
|
279
|
+
* - `enum` type: must be one of the `choices` values
|
|
280
|
+
* - `positional`/`custom` type: any appropriate default
|
|
281
|
+
*
|
|
282
|
+
* @example
|
|
283
|
+
* Default values by type:
|
|
284
|
+
* ```ts
|
|
285
|
+
* {
|
|
286
|
+
* host: {
|
|
287
|
+
* type: 'string',
|
|
288
|
+
* default: 'localhost' // string default
|
|
289
|
+
* },
|
|
290
|
+
* verbose: {
|
|
291
|
+
* type: 'boolean',
|
|
292
|
+
* default: false // boolean default
|
|
293
|
+
* },
|
|
294
|
+
* port: {
|
|
295
|
+
* type: 'number',
|
|
296
|
+
* default: 8080 // number default
|
|
297
|
+
* },
|
|
298
|
+
* level: {
|
|
299
|
+
* type: 'enum',
|
|
300
|
+
* choices: ['low', 'high'],
|
|
301
|
+
* default: 'low' // must be in choices
|
|
302
|
+
* }
|
|
303
|
+
* }
|
|
304
|
+
* ```
|
|
99
305
|
*/
|
|
100
306
|
default?: string | boolean | number;
|
|
101
307
|
/**
|
|
102
|
-
*
|
|
308
|
+
* Converts the argument name from camelCase to kebab-case for CLI usage.
|
|
309
|
+
*
|
|
310
|
+
* When `true`, a property like `maxCount` becomes available as `--max-count`.
|
|
311
|
+
* This allows [CAC](https://github.com/cacjs/cac) user-friendly property names while maintaining CLI conventions.
|
|
312
|
+
*
|
|
313
|
+
* Can be overridden globally with `resolveArgs({ toKebab: true })`.
|
|
314
|
+
*
|
|
315
|
+
* Note: Only `true` is allowed (not `false`) to make intent explicit.
|
|
316
|
+
*
|
|
317
|
+
* @example
|
|
318
|
+
* Kebab-case conversion:
|
|
319
|
+
* ```ts
|
|
320
|
+
* {
|
|
321
|
+
* maxRetries: {
|
|
322
|
+
* type: 'number',
|
|
323
|
+
* toKebab: true, // Accessible as --max-retries
|
|
324
|
+
* description: 'Maximum retry attempts'
|
|
325
|
+
* },
|
|
326
|
+
* enableLogging: {
|
|
327
|
+
* type: 'boolean',
|
|
328
|
+
* toKebab: true // Accessible as --enable-logging
|
|
329
|
+
* }
|
|
330
|
+
* }
|
|
331
|
+
* ```
|
|
103
332
|
*/
|
|
104
333
|
toKebab?: true;
|
|
105
334
|
/**
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
335
|
+
* Names of other options that conflict with this option.
|
|
336
|
+
*
|
|
337
|
+
* When this option is used together with any of the conflicting options,
|
|
338
|
+
* an `ArgResolveError` with type 'conflict' will be thrown.
|
|
339
|
+
*
|
|
340
|
+
* Conflicts only need to be defined on one side - if option A defines a conflict
|
|
341
|
+
* with option B, the conflict is automatically detected when both are used,
|
|
342
|
+
* regardless of whether B also defines a conflict with A.
|
|
343
|
+
*
|
|
344
|
+
* Supports both single option name or array of option names.
|
|
345
|
+
* Option names must match the property keys in the schema object exactly
|
|
346
|
+
* (no automatic conversion between camelCase and kebab-case).
|
|
347
|
+
*
|
|
348
|
+
* @example
|
|
349
|
+
* Single conflict (bidirectional definition):
|
|
350
|
+
* ```ts
|
|
351
|
+
* {
|
|
352
|
+
* summer: {
|
|
353
|
+
* type: 'boolean',
|
|
354
|
+
* conflicts: 'autumn' // Cannot use --summer with --autumn
|
|
355
|
+
* },
|
|
356
|
+
* autumn: {
|
|
357
|
+
* type: 'boolean',
|
|
358
|
+
* conflicts: 'summer' // Can define on both sides for clarity
|
|
359
|
+
* }
|
|
360
|
+
* }
|
|
361
|
+
* ```
|
|
362
|
+
*
|
|
363
|
+
* @example
|
|
364
|
+
* Single conflict (one-way definition):
|
|
365
|
+
* ```ts
|
|
366
|
+
* {
|
|
367
|
+
* summer: {
|
|
368
|
+
* type: 'boolean',
|
|
369
|
+
* conflicts: 'autumn' // Only defined on summer side
|
|
370
|
+
* },
|
|
371
|
+
* autumn: {
|
|
372
|
+
* type: 'boolean'
|
|
373
|
+
* // No conflicts defined, but still cannot use with --summer
|
|
374
|
+
* }
|
|
375
|
+
* }
|
|
376
|
+
* // Usage: --summer --autumn will throw error
|
|
377
|
+
* // Error: "Optional argument '--summer' conflicts with '--autumn'"
|
|
378
|
+
* ```
|
|
379
|
+
*
|
|
380
|
+
* @example
|
|
381
|
+
* Multiple conflicts:
|
|
382
|
+
* ```ts
|
|
383
|
+
* {
|
|
384
|
+
* port: {
|
|
385
|
+
* type: 'number',
|
|
386
|
+
* conflicts: ['socket', 'pipe'], // Cannot use with --socket or --pipe
|
|
387
|
+
* description: 'TCP port number'
|
|
388
|
+
* },
|
|
389
|
+
* socket: {
|
|
390
|
+
* type: 'string',
|
|
391
|
+
* conflicts: ['port', 'pipe'], // Cannot use with --port or --pipe
|
|
392
|
+
* description: 'Unix socket path'
|
|
393
|
+
* },
|
|
394
|
+
* pipe: {
|
|
395
|
+
* type: 'string',
|
|
396
|
+
* conflicts: ['port', 'socket'], // Cannot use with --port or --socket
|
|
397
|
+
* description: 'Named pipe path'
|
|
398
|
+
* }
|
|
399
|
+
* }
|
|
400
|
+
* // These three options are mutually exclusive
|
|
401
|
+
* ```
|
|
402
|
+
*
|
|
403
|
+
* @example
|
|
404
|
+
* With kebab-case conversion:
|
|
405
|
+
* ```ts
|
|
406
|
+
* {
|
|
407
|
+
* summerSeason: {
|
|
408
|
+
* type: 'boolean',
|
|
409
|
+
* toKebab: true, // Accessible as --summer-season
|
|
410
|
+
* conflicts: 'autumnSeason' // Must use property key, not CLI name
|
|
411
|
+
* },
|
|
412
|
+
* autumnSeason: {
|
|
413
|
+
* type: 'boolean',
|
|
414
|
+
* toKebab: true // Accessible as --autumn-season
|
|
415
|
+
* }
|
|
416
|
+
* }
|
|
417
|
+
* // Error: "Optional argument '--summer-season' conflicts with '--autumn-season'"
|
|
418
|
+
* ```
|
|
419
|
+
*/
|
|
420
|
+
conflicts?: string | string[];
|
|
421
|
+
/**
|
|
422
|
+
* Custom parsing function for `type: 'custom'` arguments.
|
|
423
|
+
*
|
|
424
|
+
* Required when `type: 'custom'`. Receives the raw string value and must
|
|
425
|
+
* return the parsed result. Should throw an Error (or subclass) if parsing fails.
|
|
426
|
+
*
|
|
427
|
+
* The function's return type becomes the resolved argument type.
|
|
428
|
+
*
|
|
429
|
+
* @param value - Raw string value from command line
|
|
430
|
+
* @returns Parsed value of any type
|
|
431
|
+
* @throws Error or subclass when value is invalid
|
|
432
|
+
*
|
|
433
|
+
* @example
|
|
434
|
+
* Custom parsing functions:
|
|
435
|
+
* ```ts
|
|
436
|
+
* {
|
|
437
|
+
* config: {
|
|
438
|
+
* type: 'custom',
|
|
439
|
+
* parse: (value: string) => {
|
|
440
|
+
* try {
|
|
441
|
+
* return JSON.parse(value) // Parse JSON config
|
|
442
|
+
* } catch {
|
|
443
|
+
* throw new Error('Invalid JSON configuration')
|
|
444
|
+
* }
|
|
445
|
+
* },
|
|
446
|
+
* description: 'JSON configuration object'
|
|
447
|
+
* },
|
|
448
|
+
* date: {
|
|
449
|
+
* type: 'custom',
|
|
450
|
+
* parse: (value: string) => {
|
|
451
|
+
* const date = new Date(value)
|
|
452
|
+
* if (isNaN(date.getTime())) {
|
|
453
|
+
* throw new Error('Invalid date format')
|
|
454
|
+
* }
|
|
455
|
+
* return date
|
|
456
|
+
* }
|
|
457
|
+
* }
|
|
458
|
+
* }
|
|
459
|
+
* ```
|
|
111
460
|
*/
|
|
112
461
|
parse?: (value: string) => any;
|
|
113
462
|
}
|
|
114
463
|
/**
|
|
115
464
|
* An object that contains {@link ArgSchema | argument schema}.
|
|
465
|
+
*
|
|
466
|
+
* This type is used to define the structure and validation rules for command line arguments.
|
|
116
467
|
*/
|
|
117
468
|
interface Args {
|
|
118
469
|
[option: string]: ArgSchema;
|
|
119
470
|
}
|
|
120
471
|
/**
|
|
121
472
|
* An object that contains the values of the arguments.
|
|
473
|
+
*
|
|
474
|
+
* @typeParam T - {@link Args | Arguments} which is an object that defines the command line arguments.
|
|
122
475
|
*/
|
|
123
476
|
type ArgValues<T> = T extends Args ? ResolveArgValues<T, { [Arg in keyof T]: ExtractOptionValue<T[Arg]> }> : {
|
|
124
477
|
[option: string]: string | boolean | number | (string | boolean | number)[] | undefined;
|
|
125
478
|
};
|
|
126
479
|
type IsFunction<T> = T extends ((...args: any[]) => any) ? true : false;
|
|
127
480
|
/**
|
|
481
|
+
* Extracts the value type from the argument schema.
|
|
482
|
+
*
|
|
483
|
+
* @typeParam A - {@link ArgSchema | Argument schema} which is an object that defines command line arguments.
|
|
484
|
+
*
|
|
128
485
|
* @internal
|
|
129
486
|
*/
|
|
130
487
|
type ExtractOptionValue<A extends ArgSchema> = A['type'] extends 'string' ? ResolveOptionValue<A, string> : A['type'] extends 'boolean' ? ResolveOptionValue<A, boolean> : A['type'] extends 'number' ? ResolveOptionValue<A, number> : A['type'] extends 'positional' ? ResolveOptionValue<A, string> : A['type'] extends 'enum' ? A['choices'] extends string[] | readonly string[] ? ResolveOptionValue<A, A['choices'][number]> : never : A['type'] extends 'custom' ? IsFunction<A['parse']> extends true ? ResolveOptionValue<A, ReturnType<NonNullable<A['parse']>>> : never : ResolveOptionValue<A, string | boolean | number>;
|
|
131
488
|
type ResolveOptionValue<A extends ArgSchema, T> = A['multiple'] extends true ? T[] : T;
|
|
132
489
|
/**
|
|
490
|
+
* Resolved argument values.
|
|
491
|
+
*
|
|
492
|
+
* @typeParam A - {@link Arguments | Args} which is an object that defines the command line arguments.
|
|
493
|
+
* @typeParam V - Resolvable argument values.
|
|
494
|
+
*
|
|
133
495
|
* @internal
|
|
134
496
|
*/
|
|
135
497
|
type ResolveArgValues<A extends Args, V extends Record<keyof A, unknown>> = { -readonly [Arg in keyof A]?: V[Arg] } & FilterArgs<A, V, 'default'> & FilterArgs<A, V, 'required'> & FilterPositionalArgs<A, V> extends infer P ? { [K in keyof P]: P[K] } : never;
|
|
136
498
|
/**
|
|
499
|
+
* Filters the arguments based on their default values.
|
|
500
|
+
*
|
|
501
|
+
* @typeParam A - {@link Args | Arguments}, which is an object that defines the command line arguments.
|
|
502
|
+
* @typeParam V - Resolvable argument values.
|
|
503
|
+
* @typeParam K - Key of the {@link ArgSchema | argument schema} to filter by.
|
|
504
|
+
*
|
|
137
505
|
* @internal
|
|
138
506
|
*/
|
|
139
507
|
type FilterArgs<A extends Args, V extends Record<keyof A, unknown>, K extends keyof ArgSchema> = { [Arg in keyof A as A[Arg][K] extends {} ? Arg : never]: V[Arg] };
|
|
140
508
|
/**
|
|
509
|
+
* Filters positional arguments from the argument schema.
|
|
510
|
+
*
|
|
511
|
+
* @typeParam A - {@link Args | Arguments}, which is an object that defines the command line arguments.
|
|
512
|
+
* @typeParam V - Resolvable argument values.
|
|
513
|
+
*
|
|
141
514
|
* @internal
|
|
142
515
|
*/
|
|
143
516
|
type FilterPositionalArgs<A extends Args, V extends Record<keyof A, unknown>> = { [Arg in keyof A as A[Arg]['type'] extends 'positional' ? Arg : never]: V[Arg] };
|
|
@@ -150,10 +523,15 @@ type FilterPositionalArgs<A extends Args, V extends Record<keyof A, unknown>> =
|
|
|
150
523
|
*
|
|
151
524
|
* Each property indicates whether the corresponding argument was explicitly
|
|
152
525
|
* provided (true) or is using a default value or not provided (false).
|
|
526
|
+
*
|
|
527
|
+
* @typeParam A - {@link Args | Arguments}, which is an object that defines the command line arguments.
|
|
153
528
|
*/
|
|
154
529
|
type ArgExplicitlyProvided<A extends Args> = { [K in keyof A]: boolean };
|
|
155
530
|
/**
|
|
156
531
|
* Resolve command line arguments.
|
|
532
|
+
*
|
|
533
|
+
* @typeParam A - {@link Args | Arguments}, which is an object that defines the command line arguments.
|
|
534
|
+
*
|
|
157
535
|
* @param args - An arguments that contains {@link ArgSchema | arguments schema}.
|
|
158
536
|
* @param tokens - An array of {@link ArgToken | tokens}.
|
|
159
537
|
* @param resolveArgs - An arguments that contains {@link ResolveArgs | resolve arguments}.
|
|
@@ -182,16 +560,161 @@ type ArgExplicitlyProvided<A extends Args> = { [K in keyof A]: boolean };
|
|
|
182
560
|
* ```
|
|
183
561
|
*/
|
|
184
562
|
//#endregion
|
|
563
|
+
//#region ../gunshi/src/plugin/context.d.ts
|
|
564
|
+
/**
|
|
565
|
+
* Type helper to create GunshiParams from extracted args and extensions
|
|
566
|
+
*
|
|
567
|
+
* @internal
|
|
568
|
+
*/
|
|
569
|
+
type ExtractedParams<G extends GunshiParamsConstraint, L extends Record<string, unknown> = {}> = {
|
|
570
|
+
args: ExtractArgs<G>;
|
|
571
|
+
extensions: ExtractExtensions<G> & L;
|
|
572
|
+
};
|
|
573
|
+
/**
|
|
574
|
+
* Gunshi plugin context interface.
|
|
575
|
+
*
|
|
576
|
+
* @typeParam G - A type extending {@linkcode GunshiParams} to specify the shape of command parameters.
|
|
577
|
+
*
|
|
578
|
+
* @since v0.27.0
|
|
579
|
+
*/
|
|
580
|
+
interface PluginContext<G extends GunshiParamsConstraint = DefaultGunshiParams> {
|
|
581
|
+
/**
|
|
582
|
+
* Get the global options
|
|
583
|
+
*
|
|
584
|
+
* @returns A map of global options.
|
|
585
|
+
*/
|
|
586
|
+
readonly globalOptions: Map<string, ArgSchema>;
|
|
587
|
+
/**
|
|
588
|
+
* Get the registered sub commands
|
|
589
|
+
*
|
|
590
|
+
* @returns A map of sub commands.
|
|
591
|
+
*/
|
|
592
|
+
readonly subCommands: ReadonlyMap<string, Command<G> | LazyCommand<G>>;
|
|
593
|
+
/**
|
|
594
|
+
* Add a global option.
|
|
595
|
+
*
|
|
596
|
+
* @param name - An option name
|
|
597
|
+
* @param schema - An {@linkcode ArgSchema} for the option
|
|
598
|
+
*/
|
|
599
|
+
addGlobalOption(name: string, schema: ArgSchema): void;
|
|
600
|
+
/**
|
|
601
|
+
* Add a sub command.
|
|
602
|
+
*
|
|
603
|
+
* @param name - Command name
|
|
604
|
+
* @param command - Command definition
|
|
605
|
+
*/
|
|
606
|
+
addCommand(name: string, command: Command<G> | LazyCommand<G>): void;
|
|
607
|
+
/**
|
|
608
|
+
* Check if a command exists.
|
|
609
|
+
*
|
|
610
|
+
* @param name - Command name
|
|
611
|
+
* @returns True if the command exists, false otherwise
|
|
612
|
+
*/
|
|
613
|
+
hasCommand(name: string): boolean;
|
|
614
|
+
/**
|
|
615
|
+
* Decorate the header renderer.
|
|
616
|
+
*
|
|
617
|
+
* @typeParam L - An extensions type to specify the shape of {@linkcode CommandContext}'s extensions.
|
|
618
|
+
*
|
|
619
|
+
* @param decorator - A decorator function that wraps the base header renderer.
|
|
620
|
+
*/
|
|
621
|
+
decorateHeaderRenderer<L extends Record<string, unknown> = DefaultGunshiParams['extensions']>(decorator: (baseRenderer: (ctx: Readonly<CommandContext<ExtractedParams<G, L>>>) => Promise<string>, ctx: Readonly<CommandContext<ExtractedParams<G, L>>>) => Promise<string>): void;
|
|
622
|
+
/**
|
|
623
|
+
* Decorate the usage renderer.
|
|
624
|
+
*
|
|
625
|
+
* @typeParam L - An extensions type to specify the shape of {@linkcode CommandContext}'s extensions.
|
|
626
|
+
*
|
|
627
|
+
* @param decorator - A decorator function that wraps the base usage renderer.
|
|
628
|
+
*/
|
|
629
|
+
decorateUsageRenderer<L extends Record<string, unknown> = DefaultGunshiParams['extensions']>(decorator: (baseRenderer: (ctx: Readonly<CommandContext<ExtractedParams<G, L>>>) => Promise<string>, ctx: Readonly<CommandContext<ExtractedParams<G, L>>>) => Promise<string>): void;
|
|
630
|
+
/**
|
|
631
|
+
* Decorate the validation errors renderer.
|
|
632
|
+
*
|
|
633
|
+
* @typeParam L - An extensions type to specify the shape of {@linkcode CommandContext}'s extensions.
|
|
634
|
+
*
|
|
635
|
+
* @param decorator - A decorator function that wraps the base validation errors renderer.
|
|
636
|
+
*/
|
|
637
|
+
decorateValidationErrorsRenderer<L extends Record<string, unknown> = DefaultGunshiParams['extensions']>(decorator: (baseRenderer: (ctx: Readonly<CommandContext<ExtractedParams<G, L>>>, error: AggregateError) => Promise<string>, ctx: Readonly<CommandContext<ExtractedParams<G, L>>>, error: AggregateError) => Promise<string>): void;
|
|
638
|
+
/**
|
|
639
|
+
* Decorate the command execution.
|
|
640
|
+
*
|
|
641
|
+
* Decorators are applied in reverse order (last registered is executed first).
|
|
642
|
+
*
|
|
643
|
+
* @typeParam L - An extensions type to specify the shape of {@linkcode CommandContext}'s extensions.
|
|
644
|
+
*
|
|
645
|
+
* @param decorator - A decorator function that wraps the command runner
|
|
646
|
+
*/
|
|
647
|
+
decorateCommand<L extends Record<string, unknown> = DefaultGunshiParams['extensions']>(decorator: (baseRunner: (ctx: Readonly<CommandContext<ExtractedParams<G, L>>>) => Awaitable<void | string>) => (ctx: Readonly<CommandContext<ExtractedParams<G, L>>>) => Awaitable<void | string>): void;
|
|
648
|
+
}
|
|
649
|
+
//#endregion
|
|
650
|
+
//#region ../gunshi/src/plugin/core.d.ts
|
|
651
|
+
/**
|
|
652
|
+
* Plugin dependency definition
|
|
653
|
+
*
|
|
654
|
+
* @since v0.27.0
|
|
655
|
+
*/
|
|
656
|
+
interface PluginDependency {
|
|
657
|
+
/**
|
|
658
|
+
* Dependency plugin id
|
|
659
|
+
*/
|
|
660
|
+
id: string;
|
|
661
|
+
/**
|
|
662
|
+
* Optional dependency flag.
|
|
663
|
+
* If `true`, the plugin will not throw an error if the dependency is not found
|
|
664
|
+
*/
|
|
665
|
+
optional?: boolean;
|
|
666
|
+
}
|
|
667
|
+
/**
|
|
668
|
+
* Plugin function type
|
|
669
|
+
*
|
|
670
|
+
* @typeParam G - A type extending {@linkcode GunshiParams} to specify the {@linkcode PluginContext}.
|
|
671
|
+
*
|
|
672
|
+
* @since v0.27.0
|
|
673
|
+
*/
|
|
674
|
+
type PluginFunction<G extends GunshiParams = DefaultGunshiParams> = (ctx: Readonly<PluginContext<G>>) => Awaitable<void>;
|
|
675
|
+
/**
|
|
676
|
+
* Gunshi plugin, which is a function that receives a PluginContext.
|
|
677
|
+
*
|
|
678
|
+
* @typeParam E - A type extending {@link GunshiParams} to specify the shape of {@linkcode CommandContext}'s extensions.
|
|
679
|
+
*
|
|
680
|
+
* @param ctx - A {@linkcode PluginContext}.
|
|
681
|
+
* @returns An {@linkcode Awaitable} that resolves when the plugin is loaded.
|
|
682
|
+
*
|
|
683
|
+
* @since v0.27.0
|
|
684
|
+
*/
|
|
685
|
+
type Plugin<E extends GunshiParams['extensions'] = DefaultGunshiParams['extensions']> = PluginFunction & {
|
|
686
|
+
id: string;
|
|
687
|
+
name?: string;
|
|
688
|
+
dependencies?: (PluginDependency | string)[];
|
|
689
|
+
extension?: CommandContextExtension<E>;
|
|
690
|
+
};
|
|
691
|
+
//#endregion
|
|
185
692
|
//#region ../gunshi/src/types.d.ts
|
|
693
|
+
/**
|
|
694
|
+
* Awaitable type.
|
|
695
|
+
*
|
|
696
|
+
* @typeParam T - The type of the value that can be awaited.
|
|
697
|
+
*/
|
|
186
698
|
type Awaitable<T> = T | Promise<T>;
|
|
187
699
|
/**
|
|
188
|
-
*
|
|
700
|
+
* Prettify a type by flattening its structure.
|
|
701
|
+
*
|
|
702
|
+
* @typeParam T - The type to be prettified.
|
|
703
|
+
*/
|
|
704
|
+
type Prettify<T> = { [K in keyof T]: T[K] } & {};
|
|
705
|
+
/**
|
|
706
|
+
* Extend command context type. This type is used to extend the command context with additional properties at {@linkcode CommandContext.extensions}.
|
|
707
|
+
*
|
|
189
708
|
* @since v0.27.0
|
|
190
709
|
*/
|
|
191
710
|
type ExtendContext = Record<string, unknown>;
|
|
192
711
|
/**
|
|
193
712
|
* Gunshi unified parameter type.
|
|
713
|
+
*
|
|
194
714
|
* This type combines both argument definitions and command context extensions.
|
|
715
|
+
*
|
|
716
|
+
* @typeParam P - The type of parameters, which can include `args` and `extensions`.
|
|
717
|
+
*
|
|
195
718
|
* @since v0.27.0
|
|
196
719
|
*/
|
|
197
720
|
interface GunshiParams<P extends {
|
|
@@ -202,111 +725,131 @@ interface GunshiParams<P extends {
|
|
|
202
725
|
extensions: {};
|
|
203
726
|
}> {
|
|
204
727
|
/**
|
|
205
|
-
* Command argument definitions
|
|
728
|
+
* Command argument definitions.
|
|
206
729
|
*/
|
|
207
730
|
args: P extends {
|
|
208
731
|
args: infer A extends Args;
|
|
209
732
|
} ? A : Args;
|
|
210
733
|
/**
|
|
211
|
-
* Command context extensions
|
|
734
|
+
* Command context extensions.
|
|
212
735
|
*/
|
|
213
736
|
extensions: P extends {
|
|
214
737
|
extensions: infer E extends ExtendContext;
|
|
215
738
|
} ? E : {};
|
|
216
739
|
}
|
|
217
740
|
/**
|
|
218
|
-
* Default Gunshi parameters
|
|
741
|
+
* Default Gunshi parameters.
|
|
742
|
+
*
|
|
219
743
|
* @since v0.27.0
|
|
220
744
|
*/
|
|
221
745
|
type DefaultGunshiParams = GunshiParams;
|
|
222
746
|
/**
|
|
223
747
|
* Generic constraint for command-related types.
|
|
224
|
-
*
|
|
748
|
+
*
|
|
749
|
+
* This type constraint allows both {@linkcode GunshiParams} and objects with extensions.
|
|
750
|
+
*
|
|
225
751
|
* @since v0.27.0
|
|
226
752
|
*/
|
|
227
753
|
type GunshiParamsConstraint = GunshiParams<any> | {
|
|
754
|
+
args: Args;
|
|
755
|
+
} | {
|
|
228
756
|
extensions: ExtendContext;
|
|
229
757
|
};
|
|
230
758
|
/**
|
|
231
|
-
* Type helper to extract args
|
|
759
|
+
* Type helper to extract args
|
|
760
|
+
*
|
|
761
|
+
* @typeParam G - The type of {@linkcode GunshiParams} or an object with {@linkcode Args}.
|
|
762
|
+
*
|
|
232
763
|
* @internal
|
|
233
764
|
*/
|
|
234
|
-
type ExtractArgs<G> = G extends GunshiParams<any> ? G['args'] :
|
|
765
|
+
type ExtractArgs<G> = G extends GunshiParams<any> ? G['args'] : G extends {
|
|
766
|
+
args: infer A extends Args;
|
|
767
|
+
} ? A : Args;
|
|
235
768
|
/**
|
|
236
|
-
* Type helper to extract explicitly provided argument flags
|
|
769
|
+
* Type helper to extract explicitly provided argument flags.
|
|
770
|
+
*
|
|
771
|
+
* @typeParam G - The type of {@linkcode GunshiParams}.
|
|
772
|
+
*
|
|
237
773
|
* @internal
|
|
238
774
|
*/
|
|
239
775
|
type ExtractArgExplicitlyProvided<G> = ArgExplicitlyProvided<ExtractArgs<G>>;
|
|
240
776
|
/**
|
|
241
777
|
* Type helper to extract extensions from G
|
|
778
|
+
*
|
|
242
779
|
* @internal
|
|
243
780
|
*/
|
|
244
781
|
type ExtractExtensions<G> = G extends GunshiParams<any> ? G['extensions'] : G extends {
|
|
245
782
|
extensions: infer E;
|
|
246
783
|
} ? E : {};
|
|
247
|
-
/**
|
|
248
|
-
* Type helper to normalize G to GunshiParams
|
|
249
|
-
* @internal
|
|
250
|
-
*/
|
|
251
|
-
|
|
252
784
|
/**
|
|
253
785
|
* Command environment.
|
|
786
|
+
*
|
|
787
|
+
* @typeParam G - A type extending {@linkcode GunshiParams} to specify the shape of command environments.
|
|
254
788
|
*/
|
|
255
789
|
interface CommandEnvironment<G extends GunshiParamsConstraint = DefaultGunshiParams> {
|
|
256
790
|
/**
|
|
257
791
|
* Current working directory.
|
|
258
|
-
*
|
|
792
|
+
*
|
|
793
|
+
* @see {@linkcode CliOptions.cwd}
|
|
259
794
|
*/
|
|
260
795
|
cwd: string | undefined;
|
|
261
796
|
/**
|
|
262
797
|
* Command name.
|
|
263
|
-
*
|
|
798
|
+
*
|
|
799
|
+
* @see {@linkcode CliOptions.name}
|
|
264
800
|
*/
|
|
265
801
|
name: string | undefined;
|
|
266
802
|
/**
|
|
267
803
|
* Command description.
|
|
268
|
-
* @see {@link CliOptions.description}
|
|
269
804
|
*
|
|
805
|
+
* @see {@linkcode CliOptions.description}
|
|
270
806
|
*/
|
|
271
807
|
description: string | undefined;
|
|
272
808
|
/**
|
|
273
809
|
* Command version.
|
|
274
|
-
*
|
|
810
|
+
*
|
|
811
|
+
* @see {@linkcode CliOptions.version}
|
|
275
812
|
*/
|
|
276
813
|
version: string | undefined;
|
|
277
814
|
/**
|
|
278
815
|
* Left margin of the command output.
|
|
816
|
+
*
|
|
279
817
|
* @default 2
|
|
280
|
-
* @see {@
|
|
818
|
+
* @see {@linkcode CliOptions.leftMargin}
|
|
281
819
|
*/
|
|
282
820
|
leftMargin: number;
|
|
283
821
|
/**
|
|
284
822
|
* Middle margin of the command output.
|
|
823
|
+
*
|
|
285
824
|
* @default 10
|
|
286
|
-
* @see {@
|
|
825
|
+
* @see {@linkcode CliOptions.middleMargin}
|
|
287
826
|
*/
|
|
288
827
|
middleMargin: number;
|
|
289
828
|
/**
|
|
290
829
|
* Whether to display the usage option type.
|
|
830
|
+
*
|
|
291
831
|
* @default false
|
|
292
|
-
* @see {@
|
|
832
|
+
* @see {@linkcode CliOptions.usageOptionType}
|
|
293
833
|
*/
|
|
294
834
|
usageOptionType: boolean;
|
|
295
835
|
/**
|
|
296
836
|
* Whether to display the option value.
|
|
837
|
+
*
|
|
297
838
|
* @default true
|
|
298
|
-
* @see {@
|
|
839
|
+
* @see {@linkcode CliOptions.usageOptionValue}
|
|
299
840
|
*/
|
|
300
841
|
usageOptionValue: boolean;
|
|
301
842
|
/**
|
|
302
843
|
* Whether to display the command usage.
|
|
844
|
+
*
|
|
303
845
|
* @default false
|
|
304
|
-
* @see {@
|
|
846
|
+
* @see {@linkcode CliOptions.usageSilent}
|
|
305
847
|
*/
|
|
306
848
|
usageSilent: boolean;
|
|
307
849
|
/**
|
|
308
850
|
* Sub commands.
|
|
309
|
-
*
|
|
851
|
+
*
|
|
852
|
+
* @see {@linkcode CliOptions.subCommands}
|
|
310
853
|
*/
|
|
311
854
|
subCommands: Map<string, Command<any> | LazyCommand<any>> | undefined;
|
|
312
855
|
/**
|
|
@@ -323,54 +866,155 @@ interface CommandEnvironment<G extends GunshiParamsConstraint = DefaultGunshiPar
|
|
|
323
866
|
renderValidationErrors: ((ctx: Readonly<CommandContext<G>>, error: AggregateError) => Promise<string>) | null | undefined;
|
|
324
867
|
/**
|
|
325
868
|
* Hook that runs before any command execution
|
|
326
|
-
*
|
|
869
|
+
*
|
|
870
|
+
* @see {@linkcode CliOptions.onBeforeCommand}
|
|
327
871
|
* @since v0.27.0
|
|
328
872
|
*/
|
|
329
873
|
onBeforeCommand: ((ctx: Readonly<CommandContext<G>>) => Awaitable<void>) | undefined;
|
|
330
874
|
/**
|
|
331
875
|
* Hook that runs after successful command execution
|
|
332
|
-
*
|
|
876
|
+
*
|
|
877
|
+
* @see {@linkcode CliOptions.onAfterCommand}
|
|
333
878
|
* @since v0.27.0
|
|
334
879
|
*/
|
|
335
880
|
onAfterCommand: ((ctx: Readonly<CommandContext<G>>, result: string | undefined) => Awaitable<void>) | undefined;
|
|
336
881
|
/**
|
|
337
882
|
* Hook that runs when a command throws an error
|
|
338
|
-
*
|
|
883
|
+
*
|
|
884
|
+
* @see {@linkcode CliOptions.onErrorCommand}
|
|
339
885
|
* @since v0.27.0
|
|
340
886
|
*/
|
|
341
887
|
onErrorCommand: ((ctx: Readonly<CommandContext<G>>, error: Error) => Awaitable<void>) | undefined;
|
|
342
888
|
}
|
|
343
889
|
/**
|
|
344
|
-
* CLI options of
|
|
890
|
+
* CLI options of {@linkcode cli} function.
|
|
891
|
+
*
|
|
892
|
+
* @typeParam G - A type extending {@linkcode GunshiParams} to specify the shape of cli options.
|
|
345
893
|
*/
|
|
346
|
-
|
|
894
|
+
interface CliOptions<G extends GunshiParamsConstraint = DefaultGunshiParams> {
|
|
895
|
+
/**
|
|
896
|
+
* Current working directory.
|
|
897
|
+
*/
|
|
898
|
+
cwd?: string;
|
|
899
|
+
/**
|
|
900
|
+
* Command program name.
|
|
901
|
+
*/
|
|
902
|
+
name?: string;
|
|
903
|
+
/**
|
|
904
|
+
* Command program description.
|
|
905
|
+
*
|
|
906
|
+
*/
|
|
907
|
+
description?: string;
|
|
908
|
+
/**
|
|
909
|
+
* Command program version.
|
|
910
|
+
*/
|
|
911
|
+
version?: string;
|
|
912
|
+
/**
|
|
913
|
+
* Sub commands.
|
|
914
|
+
*/
|
|
915
|
+
subCommands?: Record<string, Command<any> | LazyCommand<any>> | Map<string, Command<any> | LazyCommand<any>>;
|
|
916
|
+
/**
|
|
917
|
+
* Left margin of the command output.
|
|
918
|
+
*/
|
|
919
|
+
leftMargin?: number;
|
|
920
|
+
/**
|
|
921
|
+
* Middle margin of the command output.
|
|
922
|
+
*/
|
|
923
|
+
middleMargin?: number;
|
|
924
|
+
/**
|
|
925
|
+
* Whether to display the usage optional argument type.
|
|
926
|
+
*/
|
|
927
|
+
usageOptionType?: boolean;
|
|
928
|
+
/**
|
|
929
|
+
* Whether to display the optional argument value.
|
|
930
|
+
*/
|
|
931
|
+
usageOptionValue?: boolean;
|
|
932
|
+
/**
|
|
933
|
+
* Whether to display the command usage.
|
|
934
|
+
*/
|
|
935
|
+
usageSilent?: boolean;
|
|
936
|
+
/**
|
|
937
|
+
* Render function the command usage.
|
|
938
|
+
*/
|
|
939
|
+
renderUsage?: ((ctx: Readonly<CommandContext<G>>) => Promise<string>) | null;
|
|
940
|
+
/**
|
|
941
|
+
* Render function the header section in the command usage.
|
|
942
|
+
*/
|
|
943
|
+
renderHeader?: ((ctx: Readonly<CommandContext<G>>) => Promise<string>) | null;
|
|
944
|
+
/**
|
|
945
|
+
* Render function the validation errors.
|
|
946
|
+
*/
|
|
947
|
+
renderValidationErrors?: ((ctx: Readonly<CommandContext<G>>, error: AggregateError) => Promise<string>) | null;
|
|
948
|
+
/**
|
|
949
|
+
* Whether to fallback to entry command when the sub-command is not found.
|
|
950
|
+
*
|
|
951
|
+
* @default false
|
|
952
|
+
* @since v0.27.0
|
|
953
|
+
*/
|
|
954
|
+
fallbackToEntry?: boolean;
|
|
955
|
+
/**
|
|
956
|
+
* User plugins.
|
|
957
|
+
*
|
|
958
|
+
* @since v0.27.0
|
|
959
|
+
*/
|
|
960
|
+
plugins?: Plugin[];
|
|
961
|
+
/**
|
|
962
|
+
* Hook that runs before any command execution
|
|
963
|
+
*
|
|
964
|
+
* @param ctx - The command context
|
|
965
|
+
* @since v0.27.0
|
|
966
|
+
*/
|
|
967
|
+
onBeforeCommand?: (ctx: Readonly<CommandContext<G>>) => Awaitable<void>;
|
|
968
|
+
/**
|
|
969
|
+
* Hook that runs after successful command execution
|
|
970
|
+
*
|
|
971
|
+
* @param ctx - The command context
|
|
972
|
+
* @param result - The command execution result
|
|
973
|
+
* @since v0.27.0
|
|
974
|
+
*/
|
|
975
|
+
onAfterCommand?: (ctx: Readonly<CommandContext<G>>, result: string | undefined) => Awaitable<void>;
|
|
976
|
+
/**
|
|
977
|
+
* Hook that runs when a command throws an error
|
|
978
|
+
*
|
|
979
|
+
* @param ctx - The command context
|
|
980
|
+
* @param error - The error thrown during execution
|
|
981
|
+
* @since v0.27.0
|
|
982
|
+
*/
|
|
983
|
+
onErrorCommand?: (ctx: Readonly<CommandContext<G>>, error: Error) => Awaitable<void>;
|
|
984
|
+
}
|
|
347
985
|
/**
|
|
348
986
|
* Command call mode.
|
|
987
|
+
*
|
|
988
|
+
* - `entry`: The command is executed as an entry command.
|
|
989
|
+
* - `subCommand`: The command is executed as a sub-command.
|
|
349
990
|
*/
|
|
350
991
|
type CommandCallMode = 'entry' | 'subCommand' | 'unexpected';
|
|
351
992
|
/**
|
|
352
993
|
* Command context.
|
|
994
|
+
*
|
|
353
995
|
* Command context is the context of the command execution.
|
|
996
|
+
*
|
|
997
|
+
* @typeParam G - A type extending {@linkcode GunshiParams} to specify the shape of command context.
|
|
354
998
|
*/
|
|
355
999
|
interface CommandContext<G extends GunshiParamsConstraint = DefaultGunshiParams> {
|
|
356
1000
|
/**
|
|
357
1001
|
* Command name, that is the command that is executed.
|
|
358
|
-
* The command name is same {@
|
|
1002
|
+
* The command name is same {@linkcode CommandEnvironment.name}.
|
|
359
1003
|
*/
|
|
360
1004
|
name: string | undefined;
|
|
361
1005
|
/**
|
|
362
1006
|
* Command description, that is the description of the command that is executed.
|
|
363
|
-
* The command description is same {@
|
|
1007
|
+
* The command description is same {@linkcode CommandEnvironment.description}.
|
|
364
1008
|
*/
|
|
365
1009
|
description: string | undefined;
|
|
366
1010
|
/**
|
|
367
1011
|
* Command environment, that is the environment of the command that is executed.
|
|
368
|
-
* The command environment is same {@
|
|
1012
|
+
* The command environment is same {@linkcode CommandEnvironment}.
|
|
369
1013
|
*/
|
|
370
1014
|
env: Readonly<CommandEnvironment<G>>;
|
|
371
1015
|
/**
|
|
372
1016
|
* Command arguments, that is the arguments of the command that is executed.
|
|
373
|
-
* The command arguments is same {@
|
|
1017
|
+
* The command arguments is same {@linkcode Command.args}.
|
|
374
1018
|
*/
|
|
375
1019
|
args: ExtractArgs<G>;
|
|
376
1020
|
/**
|
|
@@ -384,7 +1028,7 @@ interface CommandContext<G extends GunshiParamsConstraint = DefaultGunshiParams>
|
|
|
384
1028
|
explicit: ExtractArgExplicitlyProvided<G>;
|
|
385
1029
|
/**
|
|
386
1030
|
* Command values, that is the values of the command that is executed.
|
|
387
|
-
* Resolve values with `resolveArgs` from command arguments and {@
|
|
1031
|
+
* Resolve values with `resolveArgs` from command arguments and {@linkcode Command.args}.
|
|
388
1032
|
*/
|
|
389
1033
|
values: ArgValues<ExtractArgs<G>>;
|
|
390
1034
|
/**
|
|
@@ -416,22 +1060,24 @@ interface CommandContext<G extends GunshiParamsConstraint = DefaultGunshiParams>
|
|
|
416
1060
|
callMode: CommandCallMode;
|
|
417
1061
|
/**
|
|
418
1062
|
* Whether to convert the camel-case style argument name to kebab-case.
|
|
419
|
-
* This context value is set from {@
|
|
1063
|
+
* This context value is set from {@linkcode Command.toKebab} option.
|
|
420
1064
|
*/
|
|
421
1065
|
toKebab?: boolean;
|
|
422
1066
|
/**
|
|
423
1067
|
* Output a message.
|
|
424
|
-
*
|
|
425
|
-
* @
|
|
426
|
-
*
|
|
427
|
-
* @
|
|
1068
|
+
*
|
|
1069
|
+
* If {@linkcode CommandEnvironment.usageSilent} is true, the message is not output.
|
|
1070
|
+
*
|
|
1071
|
+
* @param message - an output message, see {@linkcode console.log}
|
|
1072
|
+
* @param optionalParams - an optional parameters, see {@linkcode console.log}
|
|
428
1073
|
*/
|
|
429
1074
|
log: (message?: any, ...optionalParams: any[]) => void;
|
|
430
1075
|
/**
|
|
431
1076
|
* Command context extensions.
|
|
1077
|
+
*
|
|
432
1078
|
* @since v0.27.0
|
|
433
1079
|
*/
|
|
434
|
-
extensions: keyof ExtractExtensions<G> extends never ?
|
|
1080
|
+
extensions: keyof ExtractExtensions<G> extends never ? any : ExtractExtensions<G>;
|
|
435
1081
|
/**
|
|
436
1082
|
* Validation error from argument parsing.
|
|
437
1083
|
* This will be set if argument validation fails during CLI execution.
|
|
@@ -440,11 +1086,38 @@ interface CommandContext<G extends GunshiParamsConstraint = DefaultGunshiParams>
|
|
|
440
1086
|
}
|
|
441
1087
|
/**
|
|
442
1088
|
* CommandContextCore type (base type without extensions)
|
|
1089
|
+
*
|
|
1090
|
+
* @typeParam G - A type extending {@linkcode GunshiParams} to specify the shape of command context.
|
|
1091
|
+
*
|
|
443
1092
|
* @since v0.27.0
|
|
444
1093
|
*/
|
|
445
|
-
|
|
1094
|
+
type CommandContextCore<G extends GunshiParamsConstraint = DefaultGunshiParams> = Readonly<CommandContext<G>>;
|
|
1095
|
+
/**
|
|
1096
|
+
* Command context extension
|
|
1097
|
+
*
|
|
1098
|
+
* @typeParam E - A type extending {@linkcode GunshiParams.extensions} to specify the shape of the extension.
|
|
1099
|
+
*
|
|
1100
|
+
* @since v0.27.0
|
|
1101
|
+
*/
|
|
1102
|
+
interface CommandContextExtension<E extends GunshiParams['extensions'] = DefaultGunshiParams['extensions']> {
|
|
1103
|
+
/**
|
|
1104
|
+
* Plugin identifier
|
|
1105
|
+
*/
|
|
1106
|
+
readonly key: symbol;
|
|
1107
|
+
/**
|
|
1108
|
+
* Plugin extension factory
|
|
1109
|
+
*/
|
|
1110
|
+
readonly factory: (ctx: CommandContextCore, cmd: Command) => Awaitable<E>;
|
|
1111
|
+
/**
|
|
1112
|
+
* Plugin extension factory after hook
|
|
1113
|
+
*/
|
|
1114
|
+
readonly onFactory?: (ctx: Readonly<CommandContext>, cmd: Readonly<Command>) => Awaitable<void>;
|
|
1115
|
+
}
|
|
446
1116
|
/**
|
|
447
1117
|
* Rendering control options
|
|
1118
|
+
*
|
|
1119
|
+
* @typeParam G - A type extending {@linkcode GunshiParams} to specify the shape of render options.
|
|
1120
|
+
*
|
|
448
1121
|
* @since v0.27.0
|
|
449
1122
|
*/
|
|
450
1123
|
interface RenderingOptions<G extends GunshiParamsConstraint = DefaultGunshiParams> {
|
|
@@ -472,6 +1145,8 @@ interface RenderingOptions<G extends GunshiParamsConstraint = DefaultGunshiParam
|
|
|
472
1145
|
}
|
|
473
1146
|
/**
|
|
474
1147
|
* Command interface.
|
|
1148
|
+
*
|
|
1149
|
+
* @typeParam G - The Gunshi parameters constraint
|
|
475
1150
|
*/
|
|
476
1151
|
interface Command<G extends GunshiParamsConstraint = DefaultGunshiParams> {
|
|
477
1152
|
/**
|
|
@@ -500,105 +1175,281 @@ interface Command<G extends GunshiParamsConstraint = DefaultGunshiParams> {
|
|
|
500
1175
|
run?: CommandRunner<G>;
|
|
501
1176
|
/**
|
|
502
1177
|
* Whether to convert the camel-case style argument name to kebab-case.
|
|
503
|
-
* If you will set to `true`, All {@
|
|
1178
|
+
* If you will set to `true`, All {@linkcode Command.args} names will be converted to kebab-case.
|
|
504
1179
|
*/
|
|
505
1180
|
toKebab?: boolean;
|
|
506
1181
|
/**
|
|
507
1182
|
* Whether this is an internal command.
|
|
508
1183
|
* Internal commands are not shown in help usage.
|
|
1184
|
+
*
|
|
509
1185
|
* @default false
|
|
510
1186
|
* @since v0.27.0
|
|
511
1187
|
*/
|
|
512
1188
|
internal?: boolean;
|
|
513
1189
|
/**
|
|
514
1190
|
* Whether this command is an entry command.
|
|
1191
|
+
*
|
|
515
1192
|
* @default undefined
|
|
516
1193
|
* @since v0.27.0
|
|
517
1194
|
*/
|
|
518
1195
|
entry?: boolean;
|
|
519
1196
|
/**
|
|
520
1197
|
* Rendering control options
|
|
1198
|
+
*
|
|
521
1199
|
* @since v0.27.0
|
|
522
1200
|
*/
|
|
523
1201
|
rendering?: RenderingOptions<G>;
|
|
524
1202
|
}
|
|
525
1203
|
/**
|
|
526
1204
|
* Lazy command interface.
|
|
1205
|
+
*
|
|
527
1206
|
* Lazy command that's not loaded until it is executed.
|
|
1207
|
+
*
|
|
1208
|
+
* @typeParam G - The Gunshi parameters constraint
|
|
1209
|
+
* @typeParam D - The partial command definition provided to lazy function
|
|
528
1210
|
*/
|
|
529
|
-
type LazyCommand<G extends GunshiParamsConstraint = DefaultGunshiParams> = {
|
|
1211
|
+
type LazyCommand<G extends GunshiParamsConstraint = DefaultGunshiParams, D extends Partial<Command<G>> = {}> = {
|
|
530
1212
|
/**
|
|
531
1213
|
* Command load function
|
|
532
1214
|
*/
|
|
533
1215
|
(): Awaitable<Command<G> | CommandRunner<G>>;
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
1216
|
+
} & (D extends {
|
|
1217
|
+
name: infer N;
|
|
1218
|
+
} ? {
|
|
1219
|
+
commandName: N;
|
|
1220
|
+
} : {
|
|
537
1221
|
commandName?: string;
|
|
538
|
-
} & Omit<Command<G>, 'run' | 'name'
|
|
539
|
-
/**
|
|
540
|
-
* Define a command type.
|
|
541
|
-
*/
|
|
542
|
-
|
|
1222
|
+
}) & Omit<D, 'name' | 'run'> & Partial<Omit<Command<G>, keyof D | 'run' | 'name'>>;
|
|
543
1223
|
/**
|
|
544
1224
|
* Command examples fetcher.
|
|
545
|
-
*
|
|
1225
|
+
*
|
|
1226
|
+
* @typeParam G - A type extending {@linkcode GunshiParams} to specify the shape of command context.
|
|
1227
|
+
*
|
|
1228
|
+
* @param ctx - A {@link CommandContext | command context}
|
|
546
1229
|
* @returns A fetched command examples.
|
|
547
1230
|
*/
|
|
548
1231
|
type CommandExamplesFetcher<G extends GunshiParamsConstraint = DefaultGunshiParams> = (ctx: Readonly<CommandContext<G>>) => Awaitable<string>;
|
|
549
1232
|
/**
|
|
550
1233
|
* Command runner.
|
|
551
|
-
*
|
|
1234
|
+
*
|
|
1235
|
+
* @typeParam G - A type extending {@linkcode GunshiParams} to specify the shape of command context.
|
|
1236
|
+
*
|
|
1237
|
+
* @param ctx - A {@link CommandContext | command context}
|
|
552
1238
|
* @returns void or string (for CLI output)
|
|
553
1239
|
*/
|
|
554
1240
|
type CommandRunner<G extends GunshiParamsConstraint = DefaultGunshiParams> = (ctx: Readonly<CommandContext<G>>) => Awaitable<string | void>;
|
|
555
1241
|
/**
|
|
556
1242
|
* Command loader.
|
|
1243
|
+
*
|
|
557
1244
|
* A function that returns a command or command runner.
|
|
558
1245
|
* This is used to lazily load commands.
|
|
1246
|
+
*
|
|
1247
|
+
* @typeParam G - A type extending {@linkcode GunshiParams} to specify the shape of command context and command runner.
|
|
1248
|
+
*
|
|
559
1249
|
* @returns A command or command runner
|
|
560
1250
|
*/
|
|
561
1251
|
type CommandLoader<G extends GunshiParamsConstraint = DefaultGunshiParams> = () => Awaitable<Command<G> | CommandRunner<G>>;
|
|
1252
|
+
//#endregion
|
|
1253
|
+
//#region ../gunshi/src/context.d.ts
|
|
562
1254
|
/**
|
|
563
|
-
*
|
|
564
|
-
*
|
|
565
|
-
* @
|
|
566
|
-
* @returns The decorated command runner
|
|
567
|
-
* @since v0.27.0
|
|
1255
|
+
* Extract extension return types from extensions record
|
|
1256
|
+
*
|
|
1257
|
+
* @internal
|
|
568
1258
|
*/
|
|
1259
|
+
type ExtractExtensions$1<E extends Record<string, CommandContextExtension>> = { [K in keyof E]: E[K] extends CommandContextExtension<infer T> ? T : never };
|
|
1260
|
+
/**
|
|
1261
|
+
* Parameters of {@link createCommandContext}
|
|
1262
|
+
*/
|
|
1263
|
+
interface CommandContextParams<G extends GunshiParams | {
|
|
1264
|
+
args: Args;
|
|
1265
|
+
} | {
|
|
1266
|
+
extensions: ExtendContext;
|
|
1267
|
+
}, V extends ArgValues<ExtractArgs<G>>, C extends Command<G> | LazyCommand<G> = Command<G>, E extends Record<string, CommandContextExtension> = Record<string, CommandContextExtension>> {
|
|
1268
|
+
/**
|
|
1269
|
+
* An arguments of target command
|
|
1270
|
+
*/
|
|
1271
|
+
args?: ExtractArgs<G>;
|
|
1272
|
+
/**
|
|
1273
|
+
* Explicitly provided arguments
|
|
1274
|
+
*/
|
|
1275
|
+
explicit?: ExtractArgExplicitlyProvided<G>;
|
|
1276
|
+
/**
|
|
1277
|
+
* A values of target command
|
|
1278
|
+
*/
|
|
1279
|
+
values?: V;
|
|
1280
|
+
/**
|
|
1281
|
+
* A positionals arguments, which passed to the target command
|
|
1282
|
+
*/
|
|
1283
|
+
positionals?: string[];
|
|
1284
|
+
/**
|
|
1285
|
+
* A rest arguments, which passed to the target command
|
|
1286
|
+
*/
|
|
1287
|
+
rest?: string[];
|
|
1288
|
+
/**
|
|
1289
|
+
* Original command line arguments
|
|
1290
|
+
*/
|
|
1291
|
+
argv?: string[];
|
|
1292
|
+
/**
|
|
1293
|
+
* Argument tokens that are parsed by the `parseArgs` function
|
|
1294
|
+
*/
|
|
1295
|
+
tokens?: ArgToken[];
|
|
1296
|
+
/**
|
|
1297
|
+
* Whether the command is omitted
|
|
1298
|
+
*/
|
|
1299
|
+
omitted?: boolean;
|
|
1300
|
+
/**
|
|
1301
|
+
* Command call mode.
|
|
1302
|
+
*/
|
|
1303
|
+
callMode?: CommandCallMode;
|
|
1304
|
+
/**
|
|
1305
|
+
* A target command
|
|
1306
|
+
*/
|
|
1307
|
+
command?: C;
|
|
1308
|
+
/**
|
|
1309
|
+
* Plugin extensions to apply as the command context extension.
|
|
1310
|
+
*/
|
|
1311
|
+
extensions?: E;
|
|
1312
|
+
/**
|
|
1313
|
+
* A command options, which is spicialized from `cli` function
|
|
1314
|
+
*/
|
|
1315
|
+
cliOptions?: CliOptions<G>;
|
|
1316
|
+
/**
|
|
1317
|
+
* Validation error from argument parsing.
|
|
1318
|
+
*/
|
|
1319
|
+
validationError?: AggregateError;
|
|
1320
|
+
}
|
|
1321
|
+
/**
|
|
1322
|
+
* Create a command context.
|
|
1323
|
+
*
|
|
1324
|
+
* @param param - A {@link CommandContextParams | parameters} to create a command context.
|
|
1325
|
+
* @returns A {@link CommandContext | command context}, which is readonly.
|
|
1326
|
+
*/
|
|
1327
|
+
declare function createCommandContext<G extends GunshiParamsConstraint = DefaultGunshiParams, V extends ArgValues<ExtractArgs<G>> = ArgValues<ExtractArgs<G>>, C extends Command<G> | LazyCommand<G> = Command<G>, E extends Record<string, CommandContextExtension> = {}>({
|
|
1328
|
+
args,
|
|
1329
|
+
explicit,
|
|
1330
|
+
values,
|
|
1331
|
+
positionals,
|
|
1332
|
+
rest,
|
|
1333
|
+
argv,
|
|
1334
|
+
tokens,
|
|
1335
|
+
command,
|
|
1336
|
+
extensions,
|
|
1337
|
+
cliOptions,
|
|
1338
|
+
callMode,
|
|
1339
|
+
omitted,
|
|
1340
|
+
validationError
|
|
1341
|
+
}: CommandContextParams<G, V, C, E>): Promise<{} extends ExtractExtensions$1<E> ? Readonly<CommandContext<G>> : Readonly<CommandContext<GunshiParams<{
|
|
1342
|
+
args: ExtractArgs<G>;
|
|
1343
|
+
extensions: ExtractExtensions$1<E>;
|
|
1344
|
+
}>>>>;
|
|
569
1345
|
//#endregion
|
|
570
1346
|
//#region ../gunshi/src/definition.d.ts
|
|
571
1347
|
/**
|
|
572
|
-
*
|
|
573
|
-
*
|
|
1348
|
+
* Infer command properties excluding for {@link define} function
|
|
1349
|
+
*
|
|
1350
|
+
* @internal
|
|
574
1351
|
*/
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
1352
|
+
type InferCommandProps<G extends GunshiParamsConstraint = DefaultGunshiParams> = Pick<Command<G>, Exclude<keyof Command<G>, keyof Command<G>>>;
|
|
1353
|
+
/**
|
|
1354
|
+
* The result type of the {@link define} function
|
|
1355
|
+
*
|
|
1356
|
+
* @internal
|
|
1357
|
+
*/
|
|
1358
|
+
type CommandDefinitionResult<G extends GunshiParamsConstraint = DefaultGunshiParams, C extends Command<G> = Command<G>> = Prettify<Pick<C, keyof C> & Partial<Pick<Command<G>, Exclude<keyof Command<G>, keyof C>>>>;
|
|
1359
|
+
/**
|
|
1360
|
+
* Define a {@link Command | command}.
|
|
1361
|
+
*
|
|
1362
|
+
* @example
|
|
1363
|
+
* ```ts
|
|
1364
|
+
* const command = define({
|
|
1365
|
+
* name: 'test',
|
|
1366
|
+
* description: 'A test command',
|
|
1367
|
+
* args: {
|
|
1368
|
+
* debug: {
|
|
1369
|
+
* type: 'boolean',
|
|
1370
|
+
* description: 'Enable debug mode',
|
|
1371
|
+
* default: false
|
|
1372
|
+
* }
|
|
1373
|
+
* },
|
|
1374
|
+
* run: ctx => {
|
|
1375
|
+
* if (ctx.values.debug) {
|
|
1376
|
+
* console.debug('Debug mode is enabled');
|
|
1377
|
+
* }
|
|
1378
|
+
* }
|
|
1379
|
+
* })
|
|
1380
|
+
* ```
|
|
1381
|
+
*
|
|
1382
|
+
* @typeParam G - A {@link GunshiParamsConstraint} type
|
|
1383
|
+
* @typeParam A - An {@link Args} type extracted from {@link GunshiParamsConstraint}
|
|
1384
|
+
* @typeParam C - A {@link Command} type inferred from {@link GunshiParamsConstraint}
|
|
1385
|
+
*
|
|
1386
|
+
* @param definition - A {@link Command | command} definition
|
|
1387
|
+
* @returns A defined {@link Command | command}
|
|
1388
|
+
*/
|
|
1389
|
+
declare function define<G extends GunshiParamsConstraint = DefaultGunshiParams, A extends Args = ExtractArgs<G>, C extends InferCommandProps<G> = InferCommandProps<G>>(definition: C & Command<{
|
|
579
1390
|
args: A;
|
|
580
|
-
extensions:
|
|
581
|
-
}>;
|
|
1391
|
+
extensions: ExtractExtensions<G>;
|
|
1392
|
+
}>): CommandDefinitionResult<G, C>;
|
|
582
1393
|
/**
|
|
583
|
-
*
|
|
584
|
-
*
|
|
1394
|
+
* Return type for defineWithTypes
|
|
1395
|
+
*
|
|
1396
|
+
* @typeParam DefaultExtensions - The {@link ExtendContext} type extracted from G
|
|
1397
|
+
*
|
|
1398
|
+
* @internal
|
|
585
1399
|
*/
|
|
586
|
-
|
|
587
|
-
args:
|
|
588
|
-
extensions:
|
|
589
|
-
}>
|
|
590
|
-
args:
|
|
591
|
-
extensions:
|
|
592
|
-
}
|
|
1400
|
+
type DefineWithTypesReturn<DefaultExtensions extends ExtendContext, DefaultArgs extends Args> = <A extends DefaultArgs = DefaultArgs, C extends Partial<Command<{
|
|
1401
|
+
args: A;
|
|
1402
|
+
extensions: DefaultExtensions;
|
|
1403
|
+
}>> = {}>(definition: C & Command<{
|
|
1404
|
+
args: A;
|
|
1405
|
+
extensions: DefaultExtensions;
|
|
1406
|
+
}>) => CommandDefinitionResult<{
|
|
1407
|
+
args: A;
|
|
1408
|
+
extensions: DefaultExtensions;
|
|
1409
|
+
}, C>;
|
|
593
1410
|
/**
|
|
594
|
-
* Define a {@link Command | command}
|
|
595
|
-
*
|
|
1411
|
+
* Define a {@link Command | command} with types
|
|
1412
|
+
*
|
|
1413
|
+
* This helper function allows specifying the type parameter of {@link GunshiParams}
|
|
1414
|
+
* while inferring the {@link Args} type, {@link ExtendContext} type from the definition.
|
|
1415
|
+
*
|
|
1416
|
+
* @example
|
|
1417
|
+
* ```ts
|
|
1418
|
+
* // Define a command with specific extensions type
|
|
1419
|
+
* type MyExtensions = { logger: { log: (message: string) => void } }
|
|
1420
|
+
*
|
|
1421
|
+
* const command = defineWithTypes<{ extensions: MyExtensions }>()({
|
|
1422
|
+
* name: 'greet',
|
|
1423
|
+
* args: {
|
|
1424
|
+
* name: { type: 'string' }
|
|
1425
|
+
* },
|
|
1426
|
+
* run: ctx => {
|
|
1427
|
+
* // ctx.values is inferred as { name?: string }
|
|
1428
|
+
* // ctx.extensions is MyExtensions
|
|
1429
|
+
* }
|
|
1430
|
+
* })
|
|
1431
|
+
* ```
|
|
1432
|
+
*
|
|
1433
|
+
* @typeParam G - A {@link GunshiParams} type
|
|
1434
|
+
*
|
|
1435
|
+
* @returns A function that takes a command definition via {@link define}
|
|
1436
|
+
*
|
|
1437
|
+
* @since v0.27.0
|
|
596
1438
|
*/
|
|
597
|
-
declare function
|
|
1439
|
+
declare function defineWithTypes<G extends GunshiParamsConstraint>(): DefineWithTypesReturn<ExtractExtensions<G>, ExtractArgs<G>>;
|
|
598
1440
|
/**
|
|
599
|
-
* Define a {@link LazyCommand | lazy command}
|
|
600
|
-
*
|
|
601
|
-
* @
|
|
1441
|
+
* Define a {@link LazyCommand | lazy command}.
|
|
1442
|
+
*
|
|
1443
|
+
* @example
|
|
1444
|
+
* ```ts
|
|
1445
|
+
* // load command with dynamic importing
|
|
1446
|
+
* const test = lazy(() => import('./commands/test'))
|
|
1447
|
+
* ```
|
|
1448
|
+
*
|
|
1449
|
+
* @typeParam A - An {@link Args} type
|
|
1450
|
+
*
|
|
1451
|
+
* @param loader - A {@link CommandLoader | command loader}
|
|
1452
|
+
* @returns A {@link LazyCommand | lazy command} with loader
|
|
602
1453
|
*/
|
|
603
1454
|
declare function lazy<A extends Args>(loader: CommandLoader<{
|
|
604
1455
|
args: A;
|
|
@@ -606,63 +1457,121 @@ declare function lazy<A extends Args>(loader: CommandLoader<{
|
|
|
606
1457
|
}>): LazyCommand<{
|
|
607
1458
|
args: A;
|
|
608
1459
|
extensions: {};
|
|
609
|
-
}>;
|
|
1460
|
+
}, {}>;
|
|
610
1461
|
/**
|
|
611
1462
|
* Define a {@link LazyCommand | lazy command} with definition.
|
|
612
|
-
*
|
|
613
|
-
* @
|
|
1463
|
+
*
|
|
1464
|
+
* @example
|
|
1465
|
+
* ```ts
|
|
1466
|
+
* // define command without command runner
|
|
1467
|
+
* const testDefinition = define({
|
|
1468
|
+
* name: 'test',
|
|
1469
|
+
* description: 'Test command',
|
|
1470
|
+
* args: {
|
|
1471
|
+
* debug: {
|
|
1472
|
+
* type: 'boolean',
|
|
1473
|
+
* description: 'Enable debug mode',
|
|
1474
|
+
* default: false
|
|
1475
|
+
* }
|
|
1476
|
+
* },
|
|
1477
|
+
* })
|
|
1478
|
+
*
|
|
1479
|
+
* // define load command with command runner and defined command
|
|
1480
|
+
* const test = lazy((): CommandRunner<{ args: typeof testDefinition.args; extensions: {} }> => {
|
|
1481
|
+
* return ctx => {
|
|
1482
|
+
* if (ctx.values.debug) {
|
|
1483
|
+
* console.debug('Debug mode is enabled');
|
|
1484
|
+
* }
|
|
1485
|
+
* }
|
|
1486
|
+
* }, testDefinition)
|
|
1487
|
+
* ```
|
|
1488
|
+
*
|
|
1489
|
+
* @typeParam A - An {@link Args} type
|
|
1490
|
+
* @typeParam D - A partial {@link Command} definition type
|
|
1491
|
+
*
|
|
1492
|
+
* @param loader - A {@link CommandLoader | command loader} function that returns a command definition
|
|
1493
|
+
* @param definition - An optional {@link Command | command} definition
|
|
614
1494
|
* @returns A {@link LazyCommand | lazy command} that can be executed later
|
|
615
1495
|
*/
|
|
616
|
-
declare function lazy<A extends
|
|
1496
|
+
declare function lazy<G extends GunshiParamsConstraint = DefaultGunshiParams, A extends ExtractArgs<G> = ExtractArgs<G>, D extends Partial<Command<{
|
|
617
1497
|
args: A;
|
|
618
1498
|
extensions: {};
|
|
619
|
-
}
|
|
1499
|
+
}>> = Partial<Command<{
|
|
620
1500
|
args: A;
|
|
621
1501
|
extensions: {};
|
|
622
|
-
}
|
|
1502
|
+
}>>>(loader: CommandLoader<{
|
|
623
1503
|
args: A;
|
|
624
1504
|
extensions: {};
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
* @returns A {@link LazyCommand | lazy command} loader
|
|
630
|
-
*/
|
|
631
|
-
declare function lazy<E extends ExtendContext>(loader: CommandLoader<{
|
|
632
|
-
args: Args;
|
|
633
|
-
extensions: E;
|
|
634
|
-
}>): LazyCommand<{
|
|
635
|
-
args: Args;
|
|
636
|
-
extensions: E;
|
|
637
|
-
}>;
|
|
1505
|
+
}>, definition: D): LazyCommand<{
|
|
1506
|
+
args: A;
|
|
1507
|
+
extensions: {};
|
|
1508
|
+
}, D>;
|
|
638
1509
|
/**
|
|
639
|
-
*
|
|
640
|
-
*
|
|
641
|
-
* @
|
|
642
|
-
*
|
|
1510
|
+
* Normalize G to a full GunshiParams type
|
|
1511
|
+
*
|
|
1512
|
+
* @typeParam G - A {@link GunshiParamsConstraint} type
|
|
1513
|
+
*
|
|
1514
|
+
* @internal
|
|
643
1515
|
*/
|
|
644
|
-
|
|
645
|
-
args:
|
|
646
|
-
extensions: E;
|
|
647
|
-
}
|
|
648
|
-
args:
|
|
1516
|
+
type NormalizeGunshiParams<G extends GunshiParamsConstraint> = G extends GunshiParams<any> ? G : G extends {
|
|
1517
|
+
args: infer A;
|
|
1518
|
+
extensions: infer E;
|
|
1519
|
+
} ? {
|
|
1520
|
+
args: A;
|
|
649
1521
|
extensions: E;
|
|
650
|
-
}
|
|
1522
|
+
} : G extends {
|
|
1523
|
+
args: infer A;
|
|
1524
|
+
} ? {
|
|
1525
|
+
args: A;
|
|
1526
|
+
extensions: {};
|
|
1527
|
+
} : G extends {
|
|
1528
|
+
extensions: infer E;
|
|
1529
|
+
} ? {
|
|
651
1530
|
args: Args;
|
|
652
1531
|
extensions: E;
|
|
653
|
-
}
|
|
1532
|
+
} : DefaultGunshiParams;
|
|
654
1533
|
/**
|
|
655
|
-
*
|
|
656
|
-
*
|
|
657
|
-
* @
|
|
1534
|
+
* Return type for lazyWithTypes
|
|
1535
|
+
*
|
|
1536
|
+
* @typeParam FullG - The normalized {@link GunshiParams} type
|
|
1537
|
+
*
|
|
1538
|
+
* @internal
|
|
658
1539
|
*/
|
|
659
|
-
|
|
1540
|
+
type LazyWithTypesReturn<FullG extends GunshiParamsConstraint> = <D extends Partial<Command<FullG>> = {}>(loader: CommandLoader<FullG>, definition?: D) => LazyCommand<FullG, D>;
|
|
660
1541
|
/**
|
|
661
|
-
* Define a {@link LazyCommand | lazy command} with
|
|
662
|
-
*
|
|
663
|
-
*
|
|
664
|
-
*
|
|
1542
|
+
* Define a {@link LazyCommand | lazy command} with specific type parameters.
|
|
1543
|
+
*
|
|
1544
|
+
* This helper function allows specifying the type parameter of {@link GunshiParams}
|
|
1545
|
+
* while inferring the {@link Args} type, {@link ExtendContext} type from the definition.
|
|
1546
|
+
*
|
|
1547
|
+
* @example
|
|
1548
|
+
* ```ts
|
|
1549
|
+
* type MyExtensions = { logger: { log: (message: string) => void } }
|
|
1550
|
+
*
|
|
1551
|
+
* const command = lazyWithTypes<{ extensions: MyExtensions }>()(
|
|
1552
|
+
* () => {
|
|
1553
|
+
* return ctx => {
|
|
1554
|
+
* // Command runner implementation
|
|
1555
|
+
* ctx.extensions.logger?.log('Command executed')
|
|
1556
|
+
* },
|
|
1557
|
+
* {
|
|
1558
|
+
* name: 'lazy-command',
|
|
1559
|
+
* args: {
|
|
1560
|
+
* opt: {
|
|
1561
|
+
* type: 'string',
|
|
1562
|
+
* description: 'An optional string argument',
|
|
1563
|
+
* required: false,
|
|
1564
|
+
* },
|
|
1565
|
+
* },
|
|
1566
|
+
* )
|
|
1567
|
+
* ```
|
|
1568
|
+
*
|
|
1569
|
+
* @typeParam G - A {@link GunshiParams} type
|
|
1570
|
+
*
|
|
1571
|
+
* @returns A function that takes a lazy command definition via {@link lazy}
|
|
1572
|
+
*
|
|
1573
|
+
* @since v0.27.0
|
|
665
1574
|
*/
|
|
666
|
-
declare function
|
|
1575
|
+
declare function lazyWithTypes<G extends GunshiParamsConstraint>(): LazyWithTypesReturn<NormalizeGunshiParams<G>>;
|
|
667
1576
|
//#endregion
|
|
668
|
-
export { type ArgSchema, type ArgValues, type Args, type Command, type CommandLoader, type CommandRunner, type DefaultGunshiParams, type ExtendContext, type GunshiParams, type LazyCommand, define, lazy };
|
|
1577
|
+
export { type ArgSchema, type ArgValues, type Args, type Command, type CommandContextParams, type CommandLoader, type CommandRunner, type DefaultGunshiParams, type ExtendContext, type GunshiParams, type LazyCommand, createCommandContext, define, defineWithTypes, lazy, lazyWithTypes };
|