Skip to content

Commit a5bdb96

Browse files
committed
chore: fix negated-by-default flags
1 parent 784a969 commit a5bdb96

2 files changed

Lines changed: 20 additions & 11 deletions

File tree

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,14 @@ export abstract class ApifyCommand<T extends typeof BuiltApifyCommand = typeof B
231231
throw new RangeError('Do not provide the string for the json arg! It is a type level assertion!');
232232
}
233233

234-
const yargsFlagName = kebabCaseString(camelCaseToKebabCase(userFlagName)).toLowerCase();
235-
const camelCasedName = camelCaseString(yargsFlagName);
234+
const rawYargsFlagName = kebabCaseString(camelCaseToKebabCase(userFlagName)).toLowerCase();
235+
const camelCasedName = camelCaseString(rawYargsFlagName);
236+
237+
let yargsFlagName = rawYargsFlagName;
238+
239+
if (rawYargsFlagName.startsWith('no-')) {
240+
yargsFlagName = rawYargsFlagName.slice(3);
241+
}
236242

237243
if (typeof rawArgs[yargsFlagName] !== 'undefined') {
238244
if (Array.isArray(rawArgs[yargsFlagName])) {
@@ -245,7 +251,10 @@ export abstract class ApifyCommand<T extends typeof BuiltApifyCommand = typeof B
245251

246252
switch (builderData.flagTag) {
247253
case 'boolean': {
248-
this.flags[camelCasedName] = rawArgs[yargsFlagName];
254+
this.flags[camelCasedName] = rawYargsFlagName.startsWith('no-')
255+
? !rawArgs[yargsFlagName]
256+
: rawArgs[yargsFlagName];
257+
249258
break;
250259
}
251260
case 'integer': {
@@ -395,7 +404,7 @@ export abstract class ApifyCommand<T extends typeof BuiltApifyCommand = typeof B
395404

396405
// yargs handles "no-" flags by negating the flag, so we need to handle that differently if we register a flag with a "no-" prefix
397406
if (flagKey.startsWith('no-')) {
398-
finalYargs = internalBuilderData.builder(finalYargs, flagKey.slice(3));
407+
finalYargs = internalBuilderData.builder(finalYargs, flagKey.slice(3), [], true);
399408
} else {
400409
finalYargs = internalBuilderData.builder(finalYargs, flagKey);
401410
}

src/lib/command-framework/flags.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export interface IntegerFlagOptions extends BaseFlagOptions {
3737

3838
export type TaggedFlagBuilder<Tag extends FlagTag, ChoicesType = unknown, Required = boolean, HasDefault = false> = {
3939
flagTag: Tag;
40-
builder: (args: Argv, objectName: string, extraArgs?: string[]) => Argv;
40+
builder: (args: Argv, objectName: string, extraArgs?: string[], invertDefaultIfSet?: boolean) => Argv;
4141
choicesType: ChoicesType;
4242
required: Required;
4343
hasDefault: HasDefault;
@@ -62,7 +62,7 @@ function stringFlag<const Choices, const T extends StringFlagOptions<readonly st
6262
): TaggedFlagBuilder<'string', Choices, T['default'] extends string ? true : T['required'], T['default']> {
6363
return {
6464
flagTag: 'string',
65-
builder: (args, objectName, extraAliases) => {
65+
builder: (args, objectName, extraAliases, invertDefaultIfSet = false) => {
6666
const allAliases = new Set([...(options.aliases ?? []), ...(extraAliases ?? [])]);
6767

6868
if (options.char) {
@@ -77,7 +77,7 @@ function stringFlag<const Choices, const T extends StringFlagOptions<readonly st
7777
alias: [...allAliases].map((alias) => kebabCaseString(camelCaseToKebabCase(alias))),
7878
hidden: options.hidden ?? false,
7979
conflicts: options.exclusive,
80-
default: options.default,
80+
default: invertDefaultIfSet ? !options.default : options.default,
8181
choices: options.choices,
8282
string: true,
8383
// we only require something be passed in if we don't have a default or read from stdin
@@ -102,7 +102,7 @@ function booleanFlag<const T extends BooleanFlagOptions>(
102102
): TaggedFlagBuilder<'boolean', never, T['default'] extends boolean ? true : T['required'], T['default']> {
103103
return {
104104
flagTag: 'boolean',
105-
builder: (args, objectName, extraAliases) => {
105+
builder: (args, objectName, extraAliases, invertDefaultIfSet = false) => {
106106
const allAliases = new Set([...(options.aliases ?? []), ...(extraAliases ?? [])]);
107107

108108
if (options.char) {
@@ -117,7 +117,7 @@ function booleanFlag<const T extends BooleanFlagOptions>(
117117
alias: [...allAliases].map((alias) => kebabCaseString(camelCaseToKebabCase(alias))),
118118
hidden: options.hidden ?? false,
119119
conflicts: options.exclusive,
120-
default: options.default,
120+
default: invertDefaultIfSet ? !options.default : options.default,
121121
boolean: true,
122122
});
123123
},
@@ -139,7 +139,7 @@ function integerFlag<const T extends IntegerFlagOptions>(
139139
): TaggedFlagBuilder<'integer', never, T['default'] extends number ? true : T['required'], T['default']> {
140140
return {
141141
flagTag: 'integer',
142-
builder: (args, objectName, extraAliases) => {
142+
builder: (args, objectName, extraAliases, invertDefaultIfSet = false) => {
143143
const allAliases = new Set([...(options.aliases ?? []), ...(extraAliases ?? [])]);
144144

145145
if (options.char) {
@@ -154,7 +154,7 @@ function integerFlag<const T extends IntegerFlagOptions>(
154154
alias: [...allAliases].map((alias) => kebabCaseString(camelCaseToKebabCase(alias))),
155155
hidden: options.hidden ?? false,
156156
conflicts: options.exclusive,
157-
default: options.default,
157+
default: invertDefaultIfSet ? !options.default : options.default,
158158
choices: options.choices,
159159
string: true,
160160
nargs: 1,

0 commit comments

Comments
 (0)