fix(selectMenu): allow json to be used for select menu options (#8322)

This commit is contained in:
Suneet Tipirneni
2022-07-24 09:14:33 -04:00
committed by GitHub
parent 335695c698
commit 6a2d0d8e96
3 changed files with 25 additions and 14 deletions

View File

@@ -149,6 +149,17 @@ describe('Select Menu Components', () => {
}).toThrowError(); }).toThrowError();
}); });
test('GIVEN valid option types THEN does not throw', () => {
expect(() =>
selectMenu().addOptions({
label: 'test',
value: 'test',
}),
).not.toThrowError();
expect(() => selectMenu().addOptions(selectMenuOption().setLabel('test').setValue('test'))).not.toThrowError();
});
test('GIVEN valid JSON input THEN valid JSON history is correct', () => { test('GIVEN valid JSON input THEN valid JSON history is correct', () => {
expect( expect(
new SelectMenuBuilder(selectMenuDataWithoutOptions) new SelectMenuBuilder(selectMenuDataWithoutOptions)

View File

@@ -35,19 +35,19 @@ export const labelValueDescriptionValidator = s.string
.lengthGreaterThanOrEqual(1) .lengthGreaterThanOrEqual(1)
.lengthLessThanOrEqual(100) .lengthLessThanOrEqual(100)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const optionValidator = s
.union( export const jsonOptionValidator = s
s.object({ .object({
label: labelValueDescriptionValidator, label: labelValueDescriptionValidator,
value: labelValueDescriptionValidator, value: labelValueDescriptionValidator,
description: labelValueDescriptionValidator.optional, description: labelValueDescriptionValidator.optional,
emoji: emojiValidator.optional, emoji: emojiValidator.optional,
default: s.boolean.optional, default: s.boolean.optional,
}), })
s.instance(SelectMenuOptionBuilder),
)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);
export const optionValidator = s.instance(SelectMenuOptionBuilder).setValidationEnabled(isValidationEnabled);
export const optionsValidator = optionValidator.array export const optionsValidator = optionValidator.array
.lengthGreaterThanOrEqual(0) .lengthGreaterThanOrEqual(0)
.setValidationEnabled(isValidationEnabled); .setValidationEnabled(isValidationEnabled);

View File

@@ -4,9 +4,9 @@ import { normalizeArray, type RestOrArray } from '../../util/normalizeArray';
import { import {
customIdValidator, customIdValidator,
disabledValidator, disabledValidator,
jsonOptionValidator,
minMaxValidator, minMaxValidator,
optionsLengthValidator, optionsLengthValidator,
optionValidator,
placeholderValidator, placeholderValidator,
validateRequiredSelectMenuParameters, validateRequiredSelectMenuParameters,
} from '../Assertions'; } from '../Assertions';
@@ -90,7 +90,7 @@ export class SelectMenuBuilder extends ComponentBuilder<APISelectMenuComponent>
...options.map((option) => ...options.map((option) =>
option instanceof SelectMenuOptionBuilder option instanceof SelectMenuOptionBuilder
? option ? option
: new SelectMenuOptionBuilder(optionValidator.parse<APISelectMenuOption>(option)), : new SelectMenuOptionBuilder(jsonOptionValidator.parse(option)),
), ),
); );
return this; return this;
@@ -110,7 +110,7 @@ export class SelectMenuBuilder extends ComponentBuilder<APISelectMenuComponent>
...options.map((option) => ...options.map((option) =>
option instanceof SelectMenuOptionBuilder option instanceof SelectMenuOptionBuilder
? option ? option
: new SelectMenuOptionBuilder(optionValidator.parse<APISelectMenuOption>(option)), : new SelectMenuOptionBuilder(jsonOptionValidator.parse(option)),
), ),
); );
return this; return this;