Skip to content

Commit 05e6b2a

Browse files
committed
fix: render flag choices
1 parent 4b57b18 commit 05e6b2a

File tree

5 files changed

+32
-15
lines changed

5 files changed

+32
-15
lines changed

src/entrypoints/_shared.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ export async function runCLI(entrypoint: string) {
9898
const commandFlags = Object.entries(command.flags ?? {})
9999
.filter(([, flag]) => typeof flag !== 'string')
100100
.map(([flagName, flag]) => {
101-
const castedFlag = flag as TaggedFlagBuilder<FlagTag, unknown, unknown, unknown>;
101+
const castedFlag = flag as TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>;
102102

103103
const flagKey = kebabCaseString(camelCaseToKebabCase(flagName)).toLowerCase();
104104

src/lib/command-framework/apify-command.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ type If<T, Y, N> = T extends true ? Y : N;
3535
type IfNotUnknown<T, Y, N> = T extends unknown ? Y : N;
3636

3737
type InferFlagTypeFromFlag<
38-
Builder extends TaggedFlagBuilder<FlagTag, unknown, unknown, unknown>,
38+
Builder extends TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>,
3939
OptionalIfHasDefault = false,
4040
> = Builder extends TaggedFlagBuilder<infer ReturnedType, never, infer Required, infer HasDefault> // Handle special case where there can be no choices
4141
? If<
@@ -90,7 +90,7 @@ type _InferArgsFromCommand<O extends Record<string, TaggedArgBuilder<ArgTag, unk
9090
};
9191

9292
type _InferFlagsFromCommand<
93-
O extends Record<string, TaggedFlagBuilder<FlagTag, unknown, unknown, unknown>>,
93+
O extends Record<string, TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>>,
9494
OptionalIfHasDefault = false,
9595
> = {
9696
[K in keyof O as CamelCase<string & K>]: InferFlagTypeFromFlag<O[K], OptionalIfHasDefault>;
@@ -101,7 +101,7 @@ type InferArgsFromCommand<O extends Record<string, TaggedArgBuilder<ArgTag, unkn
101101
: _InferArgsFromCommand<Exclude<O, undefined>>;
102102

103103
type InferFlagsFromCommand<
104-
O extends Record<string, TaggedFlagBuilder<FlagTag, unknown, unknown, unknown>> | undefined,
104+
O extends Record<string, TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>> | undefined,
105105
OptionalIfHasDefault = false,
106106
> = (O extends undefined
107107
? Record<string, unknown>
@@ -128,7 +128,7 @@ export abstract class ApifyCommand<T extends typeof BuiltApifyCommand = typeof B
128128
json?: 'Do not use json as the key of an argument, as it will prevent the --json flag from working';
129129
};
130130

131-
static flags?: Record<string, TaggedFlagBuilder<FlagTag, unknown, unknown, unknown>> & {
131+
static flags?: Record<string, TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>> & {
132132
json?: 'Do not use json as the key of a flag, override the enableJsonFlag static property instead';
133133
};
134134

src/lib/command-framework/flags.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,12 @@ export interface IntegerFlagOptions extends BaseFlagOptions {
3535
default?: number;
3636
}
3737

38-
export type TaggedFlagBuilder<Tag extends FlagTag, ChoicesType = unknown, Required = boolean, HasDefault = false> = {
38+
export type TaggedFlagBuilder<
39+
Tag extends FlagTag,
40+
ChoicesType extends readonly string[] | null,
41+
Required = boolean,
42+
HasDefault = false,
43+
> = {
3944
flagTag: Tag;
4045
builder: (args: Argv, objectName: string, extraArgs?: string[], invertDefaultIfSet?: boolean) => Argv;
4146
choicesType: ChoicesType;
@@ -57,7 +62,7 @@ export const Flags = {
5762
integer: integerFlag,
5863
};
5964

60-
function stringFlag<const Choices, const T extends StringFlagOptions<readonly string[]>>(
65+
function stringFlag<const Choices extends string[], const T extends StringFlagOptions<readonly string[]>>(
6166
options: T & { choices?: Choices },
6267
): TaggedFlagBuilder<'string', Choices, T['default'] extends string ? true : T['required'], T['default']> {
6368
return {

src/lib/command-framework/help/CommandHelp.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ export class CommandHelp extends BaseCommandRenderer {
141141
}
142142

143143
return a[0].localeCompare(b[0]);
144-
}) as [string, TaggedFlagBuilder<FlagTag, unknown, unknown, unknown>][],
144+
}) as [string, TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>][],
145145
);
146146

147147
const flagsToIgnore = new Set<string>();
@@ -226,14 +226,17 @@ export class CommandHelp extends BaseCommandRenderer {
226226
result.push('');
227227
}
228228

229-
protected pushFlags(result: string[], flags: Map<string, TaggedFlagBuilder<FlagTag, unknown, unknown, unknown>>) {
229+
protected pushFlags(
230+
result: string[],
231+
flags: Map<string, TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>>,
232+
) {
230233
if (!flags.size) {
231234
return;
232235
}
233236

234237
result.push(chalk.bold('FLAGS'));
235238

236-
const linesOfFlags = new Map<string, TaggedFlagBuilder<FlagTag, unknown, unknown, unknown>>();
239+
const linesOfFlags = new Map<string, TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>>();
237240

238241
for (const [flagName, flag] of flags) {
239242
const stringParts: string[] = [];
@@ -249,9 +252,12 @@ export class CommandHelp extends BaseCommandRenderer {
249252
stringParts.push(`--${this.kebabFlagName(flagName)}`);
250253
break;
251254
case 'string':
252-
case 'integer':
253-
stringParts.push(`--${this.kebabFlagName(flagName)}=${chalk.underline('<value>')}`);
255+
case 'integer': {
256+
const flagValues = flag.choicesType ? '<option>' : '<value>';
257+
258+
stringParts.push(`--${this.kebabFlagName(flagName)}=${chalk.underline(flagValues)}`);
254259
break;
260+
}
255261
default:
256262
throw new Error(`Unhandled flag tag: ${flag.flagTag}`);
257263
}
@@ -263,7 +269,11 @@ export class CommandHelp extends BaseCommandRenderer {
263269

264270
for (const [flagString, flag] of linesOfFlags) {
265271
const paddingToAdd = widestFlagNameLength - stripAnsi(flagString).length;
266-
const fullString = `${flagString}${' '.repeat(paddingToAdd)} ${flag.description ?? ''}`;
272+
let fullString = `${flagString}${' '.repeat(paddingToAdd)} ${flag.description ?? ''}`;
273+
274+
if (flag.choicesType?.length) {
275+
fullString += `\n<options: ${flag.choicesType.join('|')}>`;
276+
}
267277

268278
const wrapped = wrap(fullString, getMaxLineWidth() - widestFlagNameLength);
269279

src/lib/command-framework/help/_BaseCommandRenderer.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export abstract class BaseCommandRenderer {
7373
return kebabCaseString(camelCaseToKebabCase(flagName)).toLowerCase();
7474
}
7575

76-
protected makeFlagString(flagName: string, flag: TaggedFlagBuilder<FlagTag, unknown, unknown, unknown>) {
76+
protected makeFlagString(flagName: string, flag: TaggedFlagBuilder<FlagTag, string[] | null, unknown, unknown>) {
7777
const flagKey = this.kebabFlagName(flagName);
7878

7979
const mainFlagPart = flag.char ? `-${flag.char}` : `--${flagKey}`;
@@ -85,7 +85,9 @@ export abstract class BaseCommandRenderer {
8585

8686
case 'string':
8787
case 'integer': {
88-
return `${mainFlagPart} <value>`;
88+
const flagValues = flag.choicesType?.length ? `${flag.choicesType.join('|')}` : '<value>';
89+
90+
return `${mainFlagPart} ${flagValues}`;
8991
}
9092

9193
default: {

0 commit comments

Comments
 (0)