Skip to content

Commit c83a713

Browse files
committed
fix: allow flags to parse arrays without variadic modifier
Signed-off-by: Michael Molisani <[email protected]>
1 parent 2bb4b8d commit c83a713

File tree

6 files changed

+952
-4
lines changed

6 files changed

+952
-4
lines changed

packages/core/src/parameter/flag/types.ts

+10-4
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,11 @@ interface RequiredVariadicParsedFlagParameter<T, CONTEXT extends CommandContext>
298298

299299
type TypedFlagParameter_Optional<T, CONTEXT extends CommandContext> = [T] extends [readonly (infer A)[]]
300300
? [A] extends [string]
301-
? OptionalVariadicParsedFlagParameter<A, CONTEXT> | OptionalVariadicEnumFlagParameter<A>
302-
: OptionalVariadicParsedFlagParameter<A, CONTEXT>
301+
?
302+
| OptionalVariadicParsedFlagParameter<A, CONTEXT>
303+
| OptionalParsedFlagParameter<T, CONTEXT>
304+
| OptionalVariadicEnumFlagParameter<A>
305+
: OptionalVariadicParsedFlagParameter<A, CONTEXT> | OptionalParsedFlagParameter<T, CONTEXT>
303306
: [T] extends [boolean]
304307
? OptionalBooleanFlagParameter | OptionalParsedFlagParameter<boolean, CONTEXT>
305308
: [T] extends [number]
@@ -312,8 +315,11 @@ type TypedFlagParameter_Optional<T, CONTEXT extends CommandContext> = [T] extend
312315

313316
type TypedFlagParameter_Required<T, CONTEXT extends CommandContext> = [T] extends [readonly (infer A)[]]
314317
? [A] extends [string]
315-
? RequiredVariadicParsedFlagParameter<A, CONTEXT> | RequiredVariadicEnumFlagParameter<A>
316-
: RequiredVariadicParsedFlagParameter<A, CONTEXT>
318+
?
319+
| RequiredVariadicParsedFlagParameter<A, CONTEXT>
320+
| RequiredParsedFlagParameter<readonly A[], CONTEXT>
321+
| RequiredVariadicEnumFlagParameter<A>
322+
: RequiredVariadicParsedFlagParameter<A, CONTEXT> | RequiredParsedFlagParameter<readonly A[], CONTEXT>
317323
: [T] extends [boolean]
318324
? RequiredBooleanFlagParameter | RequiredParsedFlagParameter<boolean, CONTEXT>
319325
: [T] extends [number]

packages/core/tests/baselines/reference/parameter/flag/formatting.txt

+8
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@
5050
 --required-parsed-with-kebab-case-name required parsed flag with kebab-case name
5151
-h --help Print help information and exit
5252
 -- All subsequent inputs should be interpreted as arguments
53+
:::: formatDocumentationForFlagParameters / parsed / optional array parsed flag
54+
 [--optionalArrayParsed] optional array parsed flag
55+
-h  --help Print help information and exit
56+
  -- All subsequent inputs should be interpreted as arguments
5357
:::: formatDocumentationForFlagParameters / parsed / optional parsed flag
5458
 [--optionalParsed] optional parsed flag
5559
-h  --help Print help information and exit
@@ -62,6 +66,10 @@
6266
 [--optionalVariadicParsed]... optional variadic parsed flag
6367
-h  --help Print help information and exit
6468
  -- All subsequent inputs should be interpreted as arguments
69+
:::: formatDocumentationForFlagParameters / parsed / required array parsed flag
70+
 --requiredArrayParsed required array parsed flag
71+
-h --help Print help information and exit
72+
 -- All subsequent inputs should be interpreted as arguments
6573
:::: formatDocumentationForFlagParameters / parsed / required parsed flag
6674
 --requiredParsed required parsed flag
6775
-h --help Print help information and exit

packages/core/tests/baselines/reference/parameter/formatting.txt

+4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ cli [--optionalEnum a|b|c]
1212
cli (--requiredEnum a|b|c)
1313
:::: formatUsageLineForParameters / flags / enum / required enum flag with default
1414
cli [--requiredEnum a|b|c]
15+
:::: formatUsageLineForParameters / flags / parsed / optional array parsed flag
16+
cli [--optionalArrayParsed value]
1517
:::: formatUsageLineForParameters / flags / parsed / optional parsed flag
1618
cli [--optionalParsed value]
1719
:::: formatUsageLineForParameters / flags / parsed / optional parsed flag [hidden]
@@ -20,6 +22,8 @@ cli
2022
cli [--optionalParsed parsed]
2123
:::: formatUsageLineForParameters / flags / parsed / optional variadic parsed flag
2224
cli [--optionalVariadicParsed value]...
25+
:::: formatUsageLineForParameters / flags / parsed / required array parsed flag
26+
cli (--requiredArrayParsed value)
2327
:::: formatUsageLineForParameters / flags / parsed / required parsed flag
2428
cli (--requiredParsed value)
2529
:::: formatUsageLineForParameters / flags / parsed / required parsed flag with alias

packages/core/tests/parameter/flag/formatting.spec.ts

+55
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,61 @@ describe("formatDocumentationForFlagParameters", function () {
637637
compareToBaseline(this, StringArrayBaselineFormat, lines);
638638
});
639639

640+
it("required array parsed flag", function () {
641+
// GIVEN
642+
type Positional = [];
643+
type Flags = {
644+
readonly requiredArrayParsed: string[];
645+
};
646+
647+
const parameters: TypedCommandParameters<Flags, Positional, CommandContext> = {
648+
flags: {
649+
requiredArrayParsed: {
650+
kind: "parsed",
651+
parse: (values) => values.split(","),
652+
brief: "required array parsed flag",
653+
},
654+
},
655+
positional: { kind: "tuple", parameters: [] },
656+
};
657+
658+
// WHEN
659+
const lines = formatDocumentationForFlagParameters(parameters.flags, parameters.aliases ?? {}, defaultArgs);
660+
661+
// THEN
662+
compareToBaseline(this, StringArrayBaselineFormat, lines);
663+
});
664+
665+
it("optional array parsed flag", function () {
666+
// GIVEN
667+
type Positional = [];
668+
type Flags = {
669+
readonly optionalArrayParsed?: string[];
670+
};
671+
672+
const parameters: TypedCommandParameters<Flags, Positional, CommandContext> = {
673+
flags: {
674+
optionalArrayParsed: {
675+
kind: "parsed",
676+
parse: (values) => values.split(","),
677+
optional: true,
678+
brief: "optional array parsed flag",
679+
},
680+
},
681+
positional: { kind: "tuple", parameters: [] },
682+
};
683+
684+
// WHEN
685+
const lines = formatDocumentationForFlagParameters(
686+
parameters.flags ?? {},
687+
parameters.aliases ?? {},
688+
defaultArgs,
689+
);
690+
691+
// THEN
692+
compareToBaseline(this, StringArrayBaselineFormat, lines);
693+
});
694+
640695
it("multiple parsed flags", function () {
641696
// GIVEN
642697
type Positional = [];

packages/core/tests/parameter/formatting.spec.ts

+51
Original file line numberDiff line numberDiff line change
@@ -676,6 +676,57 @@ describe("formatUsageLineForParameters", function () {
676676
// THEN
677677
compareToBaseline(this, StringArrayBaselineFormat, [line]);
678678
});
679+
680+
it("required array parsed flag", function () {
681+
// GIVEN
682+
type Positional = [];
683+
type Flags = {
684+
readonly requiredArrayParsed: string[];
685+
};
686+
687+
const parameters: TypedCommandParameters<Flags, Positional, CommandContext> = {
688+
flags: {
689+
requiredArrayParsed: {
690+
kind: "parsed",
691+
parse: (values) => values.split(","),
692+
brief: "required array parsed flag",
693+
},
694+
},
695+
positional: { kind: "tuple", parameters: [] },
696+
};
697+
698+
// WHEN
699+
const line = formatUsageLineForParameters(parameters, defaultArgs);
700+
701+
// THEN
702+
compareToBaseline(this, StringArrayBaselineFormat, [line]);
703+
});
704+
705+
it("optional array parsed flag", function () {
706+
// GIVEN
707+
type Positional = [];
708+
type Flags = {
709+
readonly optionalArrayParsed?: string[];
710+
};
711+
712+
const parameters: TypedCommandParameters<Flags, Positional, CommandContext> = {
713+
flags: {
714+
optionalArrayParsed: {
715+
kind: "parsed",
716+
parse: (values) => values.split(","),
717+
optional: true,
718+
brief: "optional array parsed flag",
719+
},
720+
},
721+
positional: { kind: "tuple", parameters: [] },
722+
};
723+
724+
// WHEN
725+
const line = formatUsageLineForParameters(parameters, defaultArgs);
726+
727+
// THEN
728+
compareToBaseline(this, StringArrayBaselineFormat, [line]);
729+
});
679730
});
680731
});
681732
});

0 commit comments

Comments
 (0)