Skip to content

Commit ae73466

Browse files
authored
Allow default property of Flag types to accept arrays (#190)
1 parent d66fddc commit ae73466

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

index.d.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,17 @@ Callback function to determine if a flag is required during runtime.
1212
*/
1313
export type IsRequiredPredicate = (flags: Readonly<AnyFlags>, input: readonly string[]) => boolean;
1414

15-
export interface Flag<Type extends FlagType, Default> {
15+
export interface Flag<Type extends FlagType, Default, IsMultiple = false> {
1616
readonly type?: Type;
1717
readonly alias?: string;
1818
readonly default?: Default;
1919
readonly isRequired?: boolean | IsRequiredPredicate;
20-
readonly isMultiple?: boolean;
20+
readonly isMultiple?: IsMultiple;
2121
}
2222

23-
type StringFlag = Flag<'string', string>;
24-
type BooleanFlag = Flag<'boolean', boolean>;
25-
type NumberFlag = Flag<'number', number>;
23+
type StringFlag = Flag<'string', string> | Flag<'string', string[], true>;
24+
type BooleanFlag = Flag<'boolean', boolean> | Flag<'boolean', boolean[], true>;
25+
type NumberFlag = Flag<'number', number> | Flag<'number', number[], true>;
2626
type AnyFlag = StringFlag | BooleanFlag | NumberFlag;
2727
type AnyFlags = Record<string, AnyFlag>;
2828

index.test-d.ts

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import {expectAssignable, expectType} from 'tsd';
1+
import {expectAssignable, expectError, expectType} from 'tsd';
22
import {PackageJson} from 'type-fest';
3-
import meow, {Result} from './index.js';
3+
import meow, {Result, AnyFlag} from './index.js';
44

55
const importMeta = import.meta;
66

@@ -24,6 +24,15 @@ expectAssignable<{flags: {foo: string | undefined}}>(
2424
expectAssignable<{flags: {foo: boolean | undefined}}>(
2525
meow({importMeta, flags: {foo: {type: 'boolean'}}})
2626
);
27+
expectAssignable<{flags: {foo: number[] | undefined}}>(
28+
meow({importMeta, flags: {foo: {type: 'number', isMultiple: true}}})
29+
);
30+
expectAssignable<{flags: {foo: string[] | undefined}}>(
31+
meow({importMeta, flags: {foo: {type: 'string', isMultiple: true}}})
32+
);
33+
expectAssignable<{flags: {foo: boolean[] | undefined}}>(
34+
meow({importMeta, flags: {foo: {type: 'boolean', isMultiple: true}}})
35+
);
2736
expectType<Result<never>>(meow({importMeta, description: 'foo'}));
2837
expectType<Result<never>>(meow({importMeta, description: false}));
2938
expectType<Result<never>>(meow({importMeta, help: 'foo'}));
@@ -79,3 +88,19 @@ const options = {
7988
} as const;
8089

8190
meow('', options);
91+
92+
expectAssignable<AnyFlag>({type: 'string', default: 'cat'});
93+
expectAssignable<AnyFlag>({type: 'number', default: 42});
94+
expectAssignable<AnyFlag>({type: 'boolean', default: true});
95+
96+
expectAssignable<AnyFlag>({type: 'string', default: undefined});
97+
expectAssignable<AnyFlag>({type: 'number', default: undefined});
98+
expectAssignable<AnyFlag>({type: 'boolean', default: undefined});
99+
100+
expectAssignable<AnyFlag>({type: 'string', isMultiple: true, default: ['cat']});
101+
expectAssignable<AnyFlag>({type: 'number', isMultiple: true, default: [42]});
102+
expectAssignable<AnyFlag>({type: 'boolean', isMultiple: true, default: [false]});
103+
104+
expectError<AnyFlag>({type: 'string', isMultiple: true, default: 'cat'});
105+
expectError<AnyFlag>({type: 'number', isMultiple: true, default: 42});
106+
expectError<AnyFlag>({type: 'boolean', isMultiple: true, default: false});

0 commit comments

Comments
 (0)