)
store: void
@@ -87,7 +87,7 @@ The channel where the command was triggered.
The channel id where the command was triggered.
### client
-
+
The client instance.
### command
diff --git a/apps/website/docs/api-reference/commandkit/functions/apply-default-optional-component-behavior.mdx b/apps/website/docs/api-reference/commandkit/functions/apply-default-optional-component-behavior.mdx
new file mode 100644
index 00000000..863f9450
--- /dev/null
+++ b/apps/website/docs/api-reference/commandkit/functions/apply-default-optional-component-behavior.mdx
@@ -0,0 +1,28 @@
+---
+title: "ApplyDefaultOptionalComponentBehavior"
+isDefaultIndex: false
+generated: true
+---
+
+import MemberInfo from '@site/src/components/MemberInfo';
+import GenerationInfo from '@site/src/components/GenerationInfo';
+import MemberDescription from '@site/src/components/MemberDescription';
+
+
+
+
+## applyDefaultOptionalComponentBehavior
+
+
+
+
+
+```ts title="Signature"
+function applyDefaultOptionalComponentBehavior(props: P): P
+```
+Parameters
+
+### props
+
+
+
diff --git a/apps/website/docs/api-reference/commandkit/functions/channel-select-menu.mdx b/apps/website/docs/api-reference/commandkit/functions/channel-select-menu.mdx
index a9eed232..359fc0ba 100644
--- a/apps/website/docs/api-reference/commandkit/functions/channel-select-menu.mdx
+++ b/apps/website/docs/api-reference/commandkit/functions/channel-select-menu.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## ChannelSelectMenu
-
+
The ChannelSelectMenu component.
diff --git a/apps/website/docs/api-reference/commandkit/functions/create-element.mdx b/apps/website/docs/api-reference/commandkit/functions/create-element.mdx
index 6498958f..79ce68de 100644
--- a/apps/website/docs/api-reference/commandkit/functions/create-element.mdx
+++ b/apps/website/docs/api-reference/commandkit/functions/create-element.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## createElement
-
+
The createElement function is used to create CommandKit elements.
diff --git a/apps/website/docs/api-reference/commandkit/functions/file-upload.mdx b/apps/website/docs/api-reference/commandkit/functions/file-upload.mdx
index 9ac57eda..eea9502f 100644
--- a/apps/website/docs/api-reference/commandkit/functions/file-upload.mdx
+++ b/apps/website/docs/api-reference/commandkit/functions/file-upload.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## FileUpload
-
+
The file upload component.
diff --git a/apps/website/docs/api-reference/commandkit/functions/fragment.mdx b/apps/website/docs/api-reference/commandkit/functions/fragment.mdx
index b7206d07..908d8b86 100644
--- a/apps/website/docs/api-reference/commandkit/functions/fragment.mdx
+++ b/apps/website/docs/api-reference/commandkit/functions/fragment.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## Fragment
-
+
Represents a fragment of CommandKit elements.
diff --git a/apps/website/docs/api-reference/commandkit/functions/get-element.mdx b/apps/website/docs/api-reference/commandkit/functions/get-element.mdx
index 57ccfe5f..d90eda3c 100644
--- a/apps/website/docs/api-reference/commandkit/functions/get-element.mdx
+++ b/apps/website/docs/api-reference/commandkit/functions/get-element.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## getElement
-
+
Gets the element data for a specific CommandKit element.
diff --git a/apps/website/docs/api-reference/commandkit/functions/is-command-kit-element.mdx b/apps/website/docs/api-reference/commandkit/functions/is-command-kit-element.mdx
index 2746eee1..5dd4589f 100644
--- a/apps/website/docs/api-reference/commandkit/functions/is-command-kit-element.mdx
+++ b/apps/website/docs/api-reference/commandkit/functions/is-command-kit-element.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## isCommandKitElement
-
+
Checks if the given element is a CommandKit element.
diff --git a/apps/website/docs/api-reference/commandkit/functions/mentionable-select-menu.mdx b/apps/website/docs/api-reference/commandkit/functions/mentionable-select-menu.mdx
index 0318e8be..e2744c38 100644
--- a/apps/website/docs/api-reference/commandkit/functions/mentionable-select-menu.mdx
+++ b/apps/website/docs/api-reference/commandkit/functions/mentionable-select-menu.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## MentionableSelectMenu
-
+
The MentionableSelectMenu component.
diff --git a/apps/website/docs/api-reference/commandkit/functions/modal.mdx b/apps/website/docs/api-reference/commandkit/functions/modal.mdx
index 17a748fd..17c8b49c 100644
--- a/apps/website/docs/api-reference/commandkit/functions/modal.mdx
+++ b/apps/website/docs/api-reference/commandkit/functions/modal.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## Modal
-
+
The modal component.
diff --git a/apps/website/docs/api-reference/commandkit/functions/paragraph-input.mdx b/apps/website/docs/api-reference/commandkit/functions/paragraph-input.mdx
index 93d07aa7..2259e44e 100644
--- a/apps/website/docs/api-reference/commandkit/functions/paragraph-input.mdx
+++ b/apps/website/docs/api-reference/commandkit/functions/paragraph-input.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## ParagraphInput
-
+
The paragraph text input component.
diff --git a/apps/website/docs/api-reference/commandkit/functions/role-select-menu.mdx b/apps/website/docs/api-reference/commandkit/functions/role-select-menu.mdx
index bf8ed198..3f08a5ed 100644
--- a/apps/website/docs/api-reference/commandkit/functions/role-select-menu.mdx
+++ b/apps/website/docs/api-reference/commandkit/functions/role-select-menu.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## RoleSelectMenu
-
+
The RoleSelectMenu component.
diff --git a/apps/website/docs/api-reference/commandkit/functions/short-input.mdx b/apps/website/docs/api-reference/commandkit/functions/short-input.mdx
index 9ac60b0a..174b5d2d 100644
--- a/apps/website/docs/api-reference/commandkit/functions/short-input.mdx
+++ b/apps/website/docs/api-reference/commandkit/functions/short-input.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## ShortInput
-
+
The short text input component.
diff --git a/apps/website/docs/api-reference/commandkit/functions/string-select-menu-option.mdx b/apps/website/docs/api-reference/commandkit/functions/string-select-menu-option.mdx
index ef6f9fb7..b6ee3243 100644
--- a/apps/website/docs/api-reference/commandkit/functions/string-select-menu-option.mdx
+++ b/apps/website/docs/api-reference/commandkit/functions/string-select-menu-option.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## StringSelectMenuOption
-
+
A select menu option for the string select menu.
diff --git a/apps/website/docs/api-reference/commandkit/functions/string-select-menu.mdx b/apps/website/docs/api-reference/commandkit/functions/string-select-menu.mdx
index 63d63d14..afe9a125 100644
--- a/apps/website/docs/api-reference/commandkit/functions/string-select-menu.mdx
+++ b/apps/website/docs/api-reference/commandkit/functions/string-select-menu.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## StringSelectMenu
-
+
The StringSelectMenu component.
diff --git a/apps/website/docs/api-reference/commandkit/functions/text-input.mdx b/apps/website/docs/api-reference/commandkit/functions/text-input.mdx
index 03216614..8835e016 100644
--- a/apps/website/docs/api-reference/commandkit/functions/text-input.mdx
+++ b/apps/website/docs/api-reference/commandkit/functions/text-input.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## TextInput
-
+
The text input component.
diff --git a/apps/website/docs/api-reference/commandkit/functions/user-select-menu.mdx b/apps/website/docs/api-reference/commandkit/functions/user-select-menu.mdx
index 4ed147c5..3d58369b 100644
--- a/apps/website/docs/api-reference/commandkit/functions/user-select-menu.mdx
+++ b/apps/website/docs/api-reference/commandkit/functions/user-select-menu.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## UserSelectMenu
-
+
The UserSelectMenu component.
diff --git a/apps/website/docs/api-reference/commandkit/interfaces/channel-select-menu-props.mdx b/apps/website/docs/api-reference/commandkit/interfaces/channel-select-menu-props.mdx
index 1f3ba808..cb3c65f1 100644
--- a/apps/website/docs/api-reference/commandkit/interfaces/channel-select-menu-props.mdx
+++ b/apps/website/docs/api-reference/commandkit/interfaces/channel-select-menu-props.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## ChannelSelectMenuProps
-
+
The ChannelSelectMenu component props.
diff --git a/apps/website/docs/api-reference/commandkit/interfaces/command-kit-config.mdx b/apps/website/docs/api-reference/commandkit/interfaces/command-kit-config.mdx
index 26795770..f4408e05 100644
--- a/apps/website/docs/api-reference/commandkit/interfaces/command-kit-config.mdx
+++ b/apps/website/docs/api-reference/commandkit/interfaces/command-kit-config.mdx
@@ -58,6 +58,7 @@ interface CommandKitConfig {
disablePrefixCommands?: boolean;
disablePermissionsMiddleware?: boolean;
showUnknownPrefixCommandsWarning?: boolean;
+ jsxDefaultOptionalComponents?: boolean;
}
```
@@ -135,6 +136,11 @@ Whether or not to disable the built-in permissions middleware. This only affects
Whether or not to show a warning when a prefix command is not found. This only affects development mode.
+### jsxDefaultOptionalComponents
+
+
+
+Whether to make interaction components optional by default when using JSX (opposite of Discord's default behavior).
diff --git a/apps/website/docs/api-reference/commandkit/interfaces/command-kit-element-data.mdx b/apps/website/docs/api-reference/commandkit/interfaces/command-kit-element-data.mdx
index cd2af931..cf684288 100644
--- a/apps/website/docs/api-reference/commandkit/interfaces/command-kit-element-data.mdx
+++ b/apps/website/docs/api-reference/commandkit/interfaces/command-kit-element-data.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## CommandKitElementData
-
+
The data structure that maps each ElementType to its corresponding CommandKit element.
diff --git a/apps/website/docs/api-reference/commandkit/interfaces/common-select-menu-props.mdx b/apps/website/docs/api-reference/commandkit/interfaces/common-select-menu-props.mdx
index cba9b7a4..f909f5d0 100644
--- a/apps/website/docs/api-reference/commandkit/interfaces/common-select-menu-props.mdx
+++ b/apps/website/docs/api-reference/commandkit/interfaces/common-select-menu-props.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## CommonSelectMenuProps
-
+
Type for the common properties shared by all select menu builders.
diff --git a/apps/website/docs/api-reference/commandkit/interfaces/file-upload-props.mdx b/apps/website/docs/api-reference/commandkit/interfaces/file-upload-props.mdx
index 913696f6..daea7791 100644
--- a/apps/website/docs/api-reference/commandkit/interfaces/file-upload-props.mdx
+++ b/apps/website/docs/api-reference/commandkit/interfaces/file-upload-props.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## FileUploadProps
-
+
diff --git a/apps/website/docs/api-reference/commandkit/interfaces/fragment-element-props.mdx b/apps/website/docs/api-reference/commandkit/interfaces/fragment-element-props.mdx
index 25292466..f65a2ae1 100644
--- a/apps/website/docs/api-reference/commandkit/interfaces/fragment-element-props.mdx
+++ b/apps/website/docs/api-reference/commandkit/interfaces/fragment-element-props.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## FragmentElementProps
-
+
Represents the properties for a fragment element in CommandKit.
diff --git a/apps/website/docs/api-reference/commandkit/interfaces/mentionable-select-menu-props.mdx b/apps/website/docs/api-reference/commandkit/interfaces/mentionable-select-menu-props.mdx
index 399fda5c..64c430fc 100644
--- a/apps/website/docs/api-reference/commandkit/interfaces/mentionable-select-menu-props.mdx
+++ b/apps/website/docs/api-reference/commandkit/interfaces/mentionable-select-menu-props.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## MentionableSelectMenuProps
-
+
The MentionableSelectMenu component props.
diff --git a/apps/website/docs/api-reference/commandkit/interfaces/modal-props.mdx b/apps/website/docs/api-reference/commandkit/interfaces/modal-props.mdx
index 079e5369..65a95932 100644
--- a/apps/website/docs/api-reference/commandkit/interfaces/modal-props.mdx
+++ b/apps/website/docs/api-reference/commandkit/interfaces/modal-props.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## ModalProps
-
+
The properties for the modal component.
diff --git a/apps/website/docs/api-reference/commandkit/interfaces/role-select-menu-props.mdx b/apps/website/docs/api-reference/commandkit/interfaces/role-select-menu-props.mdx
index 6902e79e..d23e1aaa 100644
--- a/apps/website/docs/api-reference/commandkit/interfaces/role-select-menu-props.mdx
+++ b/apps/website/docs/api-reference/commandkit/interfaces/role-select-menu-props.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## RoleSelectMenuProps
-
+
The RoleSelectMenu component props.
diff --git a/apps/website/docs/api-reference/commandkit/interfaces/select-menu-props.mdx b/apps/website/docs/api-reference/commandkit/interfaces/select-menu-props.mdx
index 311fbfd9..c1ddf425 100644
--- a/apps/website/docs/api-reference/commandkit/interfaces/select-menu-props.mdx
+++ b/apps/website/docs/api-reference/commandkit/interfaces/select-menu-props.mdx
@@ -13,16 +13,27 @@ import MemberDescription from '@site/src/components/MemberDescription';
## SelectMenuProps
-
+
Type for the base select menu component data.
```ts title="Signature"
-interface SelectMenuProps extends Partial>,
+interface SelectMenuProps extends Partial>,
CommonSelectMenuProps {
-
+ required?: boolean;
}
```
-* Extends: Partial<Omit<BaseSelectMenuComponentData, 'type'>>, CommonSelectMenuProps<T, C>
+* Extends: Partial<Omit<BaseSelectMenuComponentData, 'type' | 'required'>>, CommonSelectMenuProps<T, C>
+
+
+
+
+
+### required
+
+
+
+
+
diff --git a/apps/website/docs/api-reference/commandkit/interfaces/string-select-menu-props.mdx b/apps/website/docs/api-reference/commandkit/interfaces/string-select-menu-props.mdx
index 9478ef78..844ae27a 100644
--- a/apps/website/docs/api-reference/commandkit/interfaces/string-select-menu-props.mdx
+++ b/apps/website/docs/api-reference/commandkit/interfaces/string-select-menu-props.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## StringSelectMenuProps
-
+
The properties for a string select menu component.
diff --git a/apps/website/docs/api-reference/commandkit/interfaces/text-input-props.mdx b/apps/website/docs/api-reference/commandkit/interfaces/text-input-props.mdx
index fc783063..61bf3d59 100644
--- a/apps/website/docs/api-reference/commandkit/interfaces/text-input-props.mdx
+++ b/apps/website/docs/api-reference/commandkit/interfaces/text-input-props.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## TextInputProps
-
+
diff --git a/apps/website/docs/api-reference/commandkit/interfaces/user-select-menu-props.mdx b/apps/website/docs/api-reference/commandkit/interfaces/user-select-menu-props.mdx
index 66b722d0..5a51fdca 100644
--- a/apps/website/docs/api-reference/commandkit/interfaces/user-select-menu-props.mdx
+++ b/apps/website/docs/api-reference/commandkit/interfaces/user-select-menu-props.mdx
@@ -13,16 +13,27 @@ import MemberDescription from '@site/src/components/MemberDescription';
## UserSelectMenuProps
-
+
The UserSelectMenu component.
```ts title="Signature"
-interface UserSelectMenuProps extends Partial>,
+interface UserSelectMenuProps extends Partial>,
CommonSelectMenuProps {
-
+ defaultValues?: MaybeArray;
}
```
-* Extends: Partial<Omit<UserSelectMenuComponentData, 'type'>>, CommonSelectMenuProps<UserSelectMenuInteraction, UserSelectMenuKit>
+* Extends: Partial<Omit<UserSelectMenuComponentData, 'type' | 'defaultValues'>>, CommonSelectMenuProps<UserSelectMenuInteraction, UserSelectMenuKit>
+
+
+
+
+
+### defaultValues
+
+MaybeArray<string | Snowflake>`} />
+
+
+
diff --git a/apps/website/docs/api-reference/commandkit/types/any-command-kit-element.mdx b/apps/website/docs/api-reference/commandkit/types/any-command-kit-element.mdx
index 93568385..c9e7ef07 100644
--- a/apps/website/docs/api-reference/commandkit/types/any-command-kit-element.mdx
+++ b/apps/website/docs/api-reference/commandkit/types/any-command-kit-element.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## AnyCommandKitElement
-
+
Represents any CommandKit element, which can be of any type defined in CommandKitElementData.
diff --git a/apps/website/docs/api-reference/commandkit/types/command-kit-element.mdx b/apps/website/docs/api-reference/commandkit/types/command-kit-element.mdx
index dea16a5b..cfff4652 100644
--- a/apps/website/docs/api-reference/commandkit/types/command-kit-element.mdx
+++ b/apps/website/docs/api-reference/commandkit/types/command-kit-element.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## CommandKitElement
-
+
Represents a CommandKit element with a specific type and data.
diff --git a/apps/website/docs/api-reference/commandkit/types/common-builder-kit.mdx b/apps/website/docs/api-reference/commandkit/types/common-builder-kit.mdx
index 688a68cd..8f60de09 100644
--- a/apps/website/docs/api-reference/commandkit/types/common-builder-kit.mdx
+++ b/apps/website/docs/api-reference/commandkit/types/common-builder-kit.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## CommonBuilderKit
-
+
Type for the common builder kit that can be used with select menus.
diff --git a/apps/website/docs/api-reference/commandkit/types/element-type.mdx b/apps/website/docs/api-reference/commandkit/types/element-type.mdx
index 4df0d795..afa9442a 100644
--- a/apps/website/docs/api-reference/commandkit/types/element-type.mdx
+++ b/apps/website/docs/api-reference/commandkit/types/element-type.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## ElementType
-
+
The type of element that can be used in CommandKit.
This is a union of the keys of the ElementType object.
diff --git a/apps/website/docs/api-reference/commandkit/types/resolve-builder-interaction.mdx b/apps/website/docs/api-reference/commandkit/types/resolve-builder-interaction.mdx
index 68884a61..b88e05f0 100644
--- a/apps/website/docs/api-reference/commandkit/types/resolve-builder-interaction.mdx
+++ b/apps/website/docs/api-reference/commandkit/types/resolve-builder-interaction.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## ResolveBuilderInteraction
-
+
Type that resolves to the specific interaction type based on the builder type.
This is used to ensure that the interaction type matches the builder type.
diff --git a/apps/website/docs/api-reference/commandkit/types/string-select-menu-option-props.mdx b/apps/website/docs/api-reference/commandkit/types/string-select-menu-option-props.mdx
index c059a1a7..54746d8e 100644
--- a/apps/website/docs/api-reference/commandkit/types/string-select-menu-option-props.mdx
+++ b/apps/website/docs/api-reference/commandkit/types/string-select-menu-option-props.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## StringSelectMenuOptionProps
-
+
Represents the properties for a string select menu option.
This can be either a SelectMenuComponentOptionData or an APISelectMenuOption.
diff --git a/apps/website/docs/api-reference/commandkit/variables/element-type.mdx b/apps/website/docs/api-reference/commandkit/variables/element-type.mdx
index 525b108c..4ae8628b 100644
--- a/apps/website/docs/api-reference/commandkit/variables/element-type.mdx
+++ b/apps/website/docs/api-reference/commandkit/variables/element-type.mdx
@@ -13,7 +13,7 @@ import MemberDescription from '@site/src/components/MemberDescription';
## ElementType
-
+
Represents the types of elements that can be used in CommandKit.
diff --git a/package.json b/package.json
index 314f36cc..4f5a7852 100644
--- a/package.json
+++ b/package.json
@@ -11,9 +11,9 @@
"bootstrap": "turbo gen bootstrap --args",
"check-types": "turbo run --filter=\"./packages/*\" check-types",
"build": "turbo run --filter=\"./packages/*\" build",
- "docgen": "tsx ./scripts/docs/generate-typescript-docs.ts && pnpm prettier:format",
+ "docgen": "tsx ./scripts/docs/generate-typescript-docs.ts && pnpm format",
"prettier:check": "prettier --experimental-cli --check . --ignore-path=.prettierignore",
- "prettier:format": "prettier --experimental-cli --write . --ignore-path=.prettierignore"
+ "format": "prettier --experimental-cli --write . --ignore-path=.prettierignore"
},
"devDependencies": {
"@types/node": "^22.10.2",
diff --git a/packages/commandkit/src/app/commands/Context.ts b/packages/commandkit/src/app/commands/Context.ts
index 8b2bca8b..5c143664 100644
--- a/packages/commandkit/src/app/commands/Context.ts
+++ b/packages/commandkit/src/app/commands/Context.ts
@@ -234,7 +234,7 @@ export class Context<
/**
* The client instance.
*/
- public readonly client: Client;
+ public readonly client: Client;
/**
* The command that this context belongs to.
@@ -265,7 +265,7 @@ export class Context<
// these are assigned to readonly properties to make them accessible via object destructuring
this.interaction = config.interaction;
this.message = config.message;
- this.client = commandkit.client;
+ this.client = commandkit.client as Client;
this.#store = config.environment?.store ?? config.store ?? new Collection();
this.command = config.command;
diff --git a/packages/commandkit/src/components/common/element.ts b/packages/commandkit/src/components/common/element.ts
index 2c9afc1c..c31cedbb 100644
--- a/packages/commandkit/src/components/common/element.ts
+++ b/packages/commandkit/src/components/common/element.ts
@@ -1,6 +1,7 @@
import type { ActionRowBuilder, TextInputBuilder } from 'discord.js';
import type { ButtonKit } from '../interactive/button/ButtonKit';
import type { ModalKit } from '../interactive/modal/ModalKit';
+import { getConfig } from '../../config/config';
/**
* Represents the types of elements that can be used in CommandKit.
@@ -102,3 +103,18 @@ export function createElement(
}
export { createElement as jsx, createElement as jsxs };
+
+let _isOptional: boolean;
+
+export function applyDefaultOptionalComponentBehavior(props: P): P {
+ if (
+ props &&
+ typeof props === 'object' &&
+ (props as { required?: boolean }).required == null &&
+ (_isOptional ??= getConfig().jsxDefaultOptionalComponents)
+ ) {
+ (props as { required?: boolean }).required ??= false;
+ }
+
+ return props;
+}
diff --git a/packages/commandkit/src/components/display/common.ts b/packages/commandkit/src/components/display/common.ts
index 8a7b4f19..5925bda3 100644
--- a/packages/commandkit/src/components/display/common.ts
+++ b/packages/commandkit/src/components/display/common.ts
@@ -1,9 +1,12 @@
import { ComponentBuilder } from 'discord.js';
+import { applyDefaultOptionalComponentBehavior } from '../..';
/**
* @private
*/
export function applyId(props: { id?: number }, component: ComponentBuilder) {
+ applyDefaultOptionalComponentBehavior(props);
+
if (props.id != null && 'setId' in component) {
component.setId(props.id);
}
diff --git a/packages/commandkit/src/components/interactive/modal/Modal.ts b/packages/commandkit/src/components/interactive/modal/Modal.ts
index d0d10f5b..376d0ef2 100644
--- a/packages/commandkit/src/components/interactive/modal/Modal.ts
+++ b/packages/commandkit/src/components/interactive/modal/Modal.ts
@@ -5,7 +5,10 @@ import {
FileUploadBuilder,
} from 'discord.js';
import { MaybeArray } from '../../common/types';
-import { CommandKitElement } from '../../common/element';
+import {
+ applyDefaultOptionalComponentBehavior,
+ CommandKitElement,
+} from '../../common/element';
import {
CommandKitModalBuilderInteractionCollectorDispatchContextData,
ModalKit,
@@ -95,6 +98,7 @@ export interface TextInputProps {
export function TextInput(
props: TextInputProps & { style: TextInputStyle },
): CommandKitElement<'text-input'> {
+ applyDefaultOptionalComponentBehavior(props);
const input = new TextInputBuilder().setStyle(props.style);
if (props.customId) {
@@ -127,7 +131,7 @@ export function TextInput(
input.setValue(props.value);
}
- if (props.required) {
+ if (props.required != null) {
input.setRequired(props.required);
}
diff --git a/packages/commandkit/src/components/interactive/select-menu/SelectMenu.ts b/packages/commandkit/src/components/interactive/select-menu/SelectMenu.ts
index 2a09a958..0bb1df21 100644
--- a/packages/commandkit/src/components/interactive/select-menu/SelectMenu.ts
+++ b/packages/commandkit/src/components/interactive/select-menu/SelectMenu.ts
@@ -8,6 +8,7 @@ import {
RoleSelectMenuComponentData,
RoleSelectMenuInteraction,
SelectMenuComponentOptionData,
+ Snowflake,
StringSelectMenuInteraction,
StringSelectMenuOptionBuilder,
UserSelectMenuComponentData,
@@ -24,6 +25,7 @@ import {
CommandKitSelectMenuBuilderInteractionCollectorDispatchContextData,
CommandKitSelectMenuBuilderOnEnd,
} from './common';
+import { applyDefaultOptionalComponentBehavior } from '../../common/element';
/**
* Type for the common properties shared by all select menu builders.
@@ -39,8 +41,10 @@ export interface CommonSelectMenuProps {
* Type for the base select menu component data.
*/
export interface SelectMenuProps
- extends Partial>,
- CommonSelectMenuProps {}
+ extends Partial>,
+ CommonSelectMenuProps {
+ required?: boolean;
+}
/**
* The properties for a string select menu component.
@@ -83,9 +87,13 @@ export type ResolveBuilderInteraction = T extends StringSelectMenuKit
*/
function applyPropsToBuilder(
builder: B,
- props: Partial> &
- CommonSelectMenuProps, B>,
+ props: Partial> &
+ CommonSelectMenuProps, B> & {
+ required?: boolean;
+ },
) {
+ applyDefaultOptionalComponentBehavior(props);
+
builder.setCustomId(props.customId ?? `select-menu::${crypto.randomUUID()}`);
if (props.maxValues != null) {
@@ -116,6 +124,10 @@ function applyPropsToBuilder(
// @ts-ignore
builder.onSelect(props.onSelect, props.options);
}
+
+ if (props.required != null) {
+ builder.setRequired(props.required);
+ }
}
/**
@@ -182,8 +194,10 @@ export function StringSelectMenuOption(props: StringSelectMenuOptionProps) {
* The UserSelectMenu component.
*/
export interface UserSelectMenuProps
- extends Partial>,
- CommonSelectMenuProps {}
+ extends Partial>,
+ CommonSelectMenuProps {
+ defaultValues?: MaybeArray;
+}
/**
* The UserSelectMenu component.
diff --git a/packages/commandkit/src/config/config.ts b/packages/commandkit/src/config/config.ts
index 35113877..5444a443 100644
--- a/packages/commandkit/src/config/config.ts
+++ b/packages/commandkit/src/config/config.ts
@@ -77,6 +77,9 @@ export function defineConfig(
disablePermissionsMiddleware:
config.disablePermissionsMiddleware ??
defaultConfig.disablePermissionsMiddleware,
+ jsxDefaultOptionalComponents:
+ config.jsxDefaultOptionalComponents ??
+ defaultConfig.jsxDefaultOptionalComponents,
};
return defined;
diff --git a/packages/commandkit/src/config/default.ts b/packages/commandkit/src/config/default.ts
index aa25dc11..c9764cd3 100644
--- a/packages/commandkit/src/config/default.ts
+++ b/packages/commandkit/src/config/default.ts
@@ -34,4 +34,5 @@ export const defaultConfig: ResolvedCommandKitConfig = {
development: true,
production: false,
},
+ jsxDefaultOptionalComponents: true,
};
diff --git a/packages/commandkit/src/config/types.ts b/packages/commandkit/src/config/types.ts
index 70ae75c1..2db2b35a 100644
--- a/packages/commandkit/src/config/types.ts
+++ b/packages/commandkit/src/config/types.ts
@@ -114,4 +114,9 @@ export interface CommandKitConfig {
* @default true
*/
showUnknownPrefixCommandsWarning?: boolean;
+ /**
+ * Whether to make interaction components optional by default when using JSX (opposite of Discord's default behavior).
+ * @default true
+ */
+ jsxDefaultOptionalComponents?: boolean;
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 3b44dd45..d473552f 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -14,8 +14,8 @@ catalogs:
version: 5.9.3
discordjs:
discord.js:
- specifier: ^14.24.0
- version: 14.24.0
+ specifier: ^14.25.1
+ version: 14.25.1
workflow:
'@workflow/builders':
specifier: ^4.0.1-beta.41
@@ -148,7 +148,7 @@ importers:
version: link:../../packages/commandkit
discord.js:
specifier: catalog:discordjs
- version: 14.24.0
+ version: 14.25.1
dotenv:
specifier: ^16.4.7
version: 16.6.1
@@ -259,7 +259,7 @@ importers:
version: link:../commandkit
discord.js:
specifier: catalog:discordjs
- version: 14.24.0
+ version: 14.25.1
tsconfig:
specifier: workspace:*
version: link:../tsconfig
@@ -360,7 +360,7 @@ importers:
version: 17.0.33
discord.js:
specifier: catalog:discordjs
- version: 14.24.0
+ version: 14.25.1
tsconfig:
specifier: workspace:*
version: link:../tsconfig
@@ -449,7 +449,7 @@ importers:
version: link:../commandkit
discord.js:
specifier: catalog:discordjs
- version: 14.24.0
+ version: 14.25.1
tsconfig:
specifier: workspace:*
version: link:../tsconfig
@@ -643,7 +643,7 @@ importers:
version: link:../commandkit
discord.js:
specifier: catalog:discordjs
- version: 14.24.0
+ version: 14.25.1
tsconfig:
specifier: workspace:*
version: link:../tsconfig
@@ -658,7 +658,7 @@ importers:
version: link:../commandkit
discord.js:
specifier: catalog:discordjs
- version: 14.24.0
+ version: 14.25.1
tsconfig:
specifier: workspace:*
version: link:../tsconfig
@@ -1875,16 +1875,16 @@ packages:
resolution: {integrity: sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==}
engines: {node: '>=18'}
- '@discordjs/formatters@0.6.1':
- resolution: {integrity: sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==}
+ '@discordjs/formatters@0.6.2':
+ resolution: {integrity: sha512-y4UPwWhH6vChKRkGdMB4odasUbHOUwy7KL+OVwF86PvT6QVOwElx+TiI1/6kcmcEe+g5YRXJFiXSXUdabqZOvQ==}
engines: {node: '>=16.11.0'}
'@discordjs/rest@2.6.0':
resolution: {integrity: sha512-RDYrhmpB7mTvmCKcpj+pc5k7POKszS4E2O9TYc+U+Y4iaCP+r910QdO43qmpOja8LRr1RJ0b3U+CqVsnPqzf4w==}
engines: {node: '>=18'}
- '@discordjs/util@1.1.1':
- resolution: {integrity: sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==}
+ '@discordjs/util@1.2.0':
+ resolution: {integrity: sha512-3LKP7F2+atl9vJFhaBjn4nOaSWahZ/yWjOvA4e5pnXkt2qyXRCHLxoBQy81GFtLGCq7K9lPm9R517M1U+/90Qg==}
engines: {node: '>=18'}
'@discordjs/ws@1.2.3':
@@ -5887,11 +5887,11 @@ packages:
directive-to-hof@0.0.2:
resolution: {integrity: sha512-LXSafC5HhiYxMxAUMgq8TvbgL9TjGwkN5yqndVluDa5DbuuCouSuwGqpwHJadTxm+KZmwBmxJKsGVdOk1NT2uw==}
- discord-api-types@0.38.31:
- resolution: {integrity: sha512-kC94ANsk8ackj8ENTuO8joTNEL0KtymVhHy9dyEC/s4QAZ7GCx40dYEzQaadyo8w+oP0X8QydE/nzAWRylTGtQ==}
+ discord-api-types@0.38.38:
+ resolution: {integrity: sha512-7qcM5IeZrfb+LXW07HvoI5L+j4PQeMZXEkSm1htHAHh4Y9JSMXBWjy/r7zmUCOj4F7zNjMcm7IMWr131MT2h0Q==}
- discord.js@14.24.0:
- resolution: {integrity: sha512-KNq/ekT8bsmT3ZAfVre8cPbl+DfVYSdlLnDmGZPoz7Cw21LYeWHllRA9MivqNq5b1GPGAxGvyUN1vxbTb/PQWw==}
+ discord.js@14.25.1:
+ resolution: {integrity: sha512-2l0gsPOLPs5t6GFZfQZKnL1OJNYFcuC/ETWsW4VtKVD/tg4ICa9x+jb9bkPffkMdRpRpuUaO/fKkHCBeiCKh8g==}
engines: {node: '>=18'}
dlv@1.1.3:
@@ -11910,10 +11910,10 @@ snapshots:
'@discordjs/builders@1.13.0':
dependencies:
- '@discordjs/formatters': 0.6.1
- '@discordjs/util': 1.1.1
+ '@discordjs/formatters': 0.6.2
+ '@discordjs/util': 1.2.0
'@sapphire/shapeshift': 4.0.0
- discord-api-types: 0.38.31
+ discord-api-types: 0.38.38
fast-deep-equal: 3.1.3
ts-mixer: 6.0.4
tslib: 2.8.1
@@ -11922,33 +11922,35 @@ snapshots:
'@discordjs/collection@2.1.1': {}
- '@discordjs/formatters@0.6.1':
+ '@discordjs/formatters@0.6.2':
dependencies:
- discord-api-types: 0.38.31
+ discord-api-types: 0.38.38
'@discordjs/rest@2.6.0':
dependencies:
'@discordjs/collection': 2.1.1
- '@discordjs/util': 1.1.1
+ '@discordjs/util': 1.2.0
'@sapphire/async-queue': 1.5.5
'@sapphire/snowflake': 3.5.3
'@vladfrangu/async_event_emitter': 2.4.6
- discord-api-types: 0.38.31
+ discord-api-types: 0.38.38
magic-bytes.js: 1.12.1
tslib: 2.8.1
undici: 7.19.2
- '@discordjs/util@1.1.1': {}
+ '@discordjs/util@1.2.0':
+ dependencies:
+ discord-api-types: 0.38.38
'@discordjs/ws@1.2.3':
dependencies:
'@discordjs/collection': 2.1.1
'@discordjs/rest': 2.6.0
- '@discordjs/util': 1.1.1
+ '@discordjs/util': 1.2.0
'@sapphire/async-queue': 1.5.5
'@types/ws': 8.18.1
'@vladfrangu/async_event_emitter': 2.4.6
- discord-api-types: 0.38.31
+ discord-api-types: 0.38.38
tslib: 2.8.1
ws: 8.18.3
transitivePeerDependencies:
@@ -16952,18 +16954,18 @@ snapshots:
transitivePeerDependencies:
- supports-color
- discord-api-types@0.38.31: {}
+ discord-api-types@0.38.38: {}
- discord.js@14.24.0:
+ discord.js@14.25.1:
dependencies:
'@discordjs/builders': 1.13.0
'@discordjs/collection': 1.5.3
- '@discordjs/formatters': 0.6.1
+ '@discordjs/formatters': 0.6.2
'@discordjs/rest': 2.6.0
- '@discordjs/util': 1.1.1
+ '@discordjs/util': 1.2.0
'@discordjs/ws': 1.2.3
'@sapphire/snowflake': 3.5.3
- discord-api-types: 0.38.31
+ discord-api-types: 0.38.38
fast-deep-equal: 3.1.3
lodash.snakecase: 4.1.1
magic-bytes.js: 1.12.1
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index fff22d57..ecad9c2b 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -3,7 +3,7 @@ packages:
- apps/*
catalogs:
discordjs:
- discord.js: ^14.24.0
+ discord.js: ^14.25.1
build:
typescript: ^5.9.3
tsdown: ^0.20.0-beta.3