From 6a2d0d8e96d157d5b85cee7f17bffdfff4240074 Mon Sep 17 00:00:00 2001 From: Suneet Tipirneni <77477100+suneettipirneni@users.noreply.github.com> Date: Sun, 24 Jul 2022 09:14:33 -0400 Subject: [PATCH] fix(selectMenu): allow json to be used for select menu options (#8322) --- .../__tests__/components/selectMenu.test.ts | 11 ++++++++++ .../builders/src/components/Assertions.ts | 22 +++++++++---------- .../src/components/selectMenu/SelectMenu.ts | 6 ++--- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/packages/builders/__tests__/components/selectMenu.test.ts b/packages/builders/__tests__/components/selectMenu.test.ts index ed95ea4d0..e5b4e6e03 100644 --- a/packages/builders/__tests__/components/selectMenu.test.ts +++ b/packages/builders/__tests__/components/selectMenu.test.ts @@ -149,6 +149,17 @@ describe('Select Menu Components', () => { }).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', () => { expect( new SelectMenuBuilder(selectMenuDataWithoutOptions) diff --git a/packages/builders/src/components/Assertions.ts b/packages/builders/src/components/Assertions.ts index 7b3309e40..5fa6c7efc 100644 --- a/packages/builders/src/components/Assertions.ts +++ b/packages/builders/src/components/Assertions.ts @@ -35,19 +35,19 @@ export const labelValueDescriptionValidator = s.string .lengthGreaterThanOrEqual(1) .lengthLessThanOrEqual(100) .setValidationEnabled(isValidationEnabled); -export const optionValidator = s - .union( - s.object({ - label: labelValueDescriptionValidator, - value: labelValueDescriptionValidator, - description: labelValueDescriptionValidator.optional, - emoji: emojiValidator.optional, - default: s.boolean.optional, - }), - s.instance(SelectMenuOptionBuilder), - ) + +export const jsonOptionValidator = s + .object({ + label: labelValueDescriptionValidator, + value: labelValueDescriptionValidator, + description: labelValueDescriptionValidator.optional, + emoji: emojiValidator.optional, + default: s.boolean.optional, + }) .setValidationEnabled(isValidationEnabled); +export const optionValidator = s.instance(SelectMenuOptionBuilder).setValidationEnabled(isValidationEnabled); + export const optionsValidator = optionValidator.array .lengthGreaterThanOrEqual(0) .setValidationEnabled(isValidationEnabled); diff --git a/packages/builders/src/components/selectMenu/SelectMenu.ts b/packages/builders/src/components/selectMenu/SelectMenu.ts index dd4ae6cd6..e0ea41175 100644 --- a/packages/builders/src/components/selectMenu/SelectMenu.ts +++ b/packages/builders/src/components/selectMenu/SelectMenu.ts @@ -4,9 +4,9 @@ import { normalizeArray, type RestOrArray } from '../../util/normalizeArray'; import { customIdValidator, disabledValidator, + jsonOptionValidator, minMaxValidator, optionsLengthValidator, - optionValidator, placeholderValidator, validateRequiredSelectMenuParameters, } from '../Assertions'; @@ -90,7 +90,7 @@ export class SelectMenuBuilder extends ComponentBuilder ...options.map((option) => option instanceof SelectMenuOptionBuilder ? option - : new SelectMenuOptionBuilder(optionValidator.parse(option)), + : new SelectMenuOptionBuilder(jsonOptionValidator.parse(option)), ), ); return this; @@ -110,7 +110,7 @@ export class SelectMenuBuilder extends ComponentBuilder ...options.map((option) => option instanceof SelectMenuOptionBuilder ? option - : new SelectMenuOptionBuilder(optionValidator.parse(option)), + : new SelectMenuOptionBuilder(jsonOptionValidator.parse(option)), ), ); return this;