mini-interactions-builders 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,368 @@
1
+ declare enum ComponentType {
2
+ ActionRow = 1,
3
+ Button = 2,
4
+ StringSelect = 3,
5
+ TextInput = 4,
6
+ UserSelect = 5,
7
+ RoleSelect = 6,
8
+ MentionableSelect = 7,
9
+ ChannelSelect = 8,
10
+ Section = 9,
11
+ TextDisplay = 10,
12
+ Thumbnail = 11,
13
+ MediaGallery = 12,
14
+ File = 13,
15
+ Separator = 14,
16
+ Container = 17,
17
+ Label = 18,
18
+ FileUpload = 19,
19
+ RadioGroup = 21,
20
+ CheckboxGroup = 22,
21
+ Checkbox = 23
22
+ }
23
+ declare enum ButtonStyle {
24
+ Primary = 1,
25
+ Secondary = 2,
26
+ Success = 3,
27
+ Danger = 4,
28
+ Link = 5,
29
+ Premium = 6
30
+ }
31
+ declare enum TextInputStyle {
32
+ Short = 1,
33
+ Paragraph = 2
34
+ }
35
+ declare enum SeparatorSpacing {
36
+ Small = 1,
37
+ Large = 2
38
+ }
39
+ interface ComponentBuilder<T> {
40
+ toJSON(): T;
41
+ }
42
+ interface ComponentEmoji {
43
+ id?: string;
44
+ name?: string;
45
+ animated?: boolean;
46
+ }
47
+ interface ButtonData {
48
+ type: ComponentType.Button;
49
+ style: ButtonStyle;
50
+ label?: string;
51
+ emoji?: ComponentEmoji;
52
+ custom_id?: string;
53
+ url?: string;
54
+ sku_id?: string;
55
+ disabled?: boolean;
56
+ }
57
+ declare class ButtonBuilder implements ComponentBuilder<ButtonData> {
58
+ #private;
59
+ setCustomId(customId: string): this;
60
+ setLabel(label: string): this;
61
+ setStyle(style: ButtonStyle): this;
62
+ setEmoji(emoji: ComponentEmoji): this;
63
+ setURL(url: string): this;
64
+ setSkuId(skuId: string): this;
65
+ setDisabled(disabled?: boolean): this;
66
+ toJSON(): ButtonData;
67
+ }
68
+ interface StringSelectOptionData {
69
+ label: string;
70
+ value: string;
71
+ description?: string;
72
+ emoji?: ComponentEmoji;
73
+ default?: boolean;
74
+ }
75
+ declare class StringSelectOptionBuilder implements ComponentBuilder<StringSelectOptionData> {
76
+ #private;
77
+ setLabel(label: string): this;
78
+ setValue(value: string): this;
79
+ setDescription(description: string): this;
80
+ setEmoji(emoji: ComponentEmoji): this;
81
+ setDefault(isDefault?: boolean): this;
82
+ toJSON(): StringSelectOptionData;
83
+ }
84
+ interface SelectMenuFields {
85
+ custom_id: string;
86
+ placeholder?: string;
87
+ min_values?: number;
88
+ max_values?: number;
89
+ required?: boolean;
90
+ disabled?: boolean;
91
+ }
92
+ interface StringSelectMenuData extends SelectMenuFields {
93
+ type: ComponentType.StringSelect;
94
+ options: readonly StringSelectOptionData[];
95
+ }
96
+ declare abstract class SelectMenuBuilderBase<TData extends SelectMenuFields> implements ComponentBuilder<TData> {
97
+ protected readonly data: Partial<SelectMenuFields>;
98
+ setCustomId(customId: string): this;
99
+ setPlaceholder(placeholder: string): this;
100
+ setMinValues(minValues: number): this;
101
+ setMaxValues(maxValues: number): this;
102
+ setRequired(required?: boolean): this;
103
+ setDisabled(disabled?: boolean): this;
104
+ protected validate(): void;
105
+ abstract toJSON(): TData;
106
+ }
107
+ declare class StringSelectMenuBuilder extends SelectMenuBuilderBase<StringSelectMenuData> {
108
+ #private;
109
+ addOptions(...options: Array<StringSelectOptionData | ComponentBuilder<StringSelectOptionData>>): this;
110
+ setOptions(...options: Array<StringSelectOptionData | ComponentBuilder<StringSelectOptionData>>): this;
111
+ toJSON(): StringSelectMenuData;
112
+ }
113
+ interface EntitySelectMenuData extends SelectMenuFields {
114
+ type: ComponentType.UserSelect | ComponentType.RoleSelect | ComponentType.MentionableSelect | ComponentType.ChannelSelect;
115
+ channel_types?: readonly number[];
116
+ }
117
+ declare abstract class EntitySelectMenuBuilder extends SelectMenuBuilderBase<EntitySelectMenuData> {
118
+ protected abstract readonly componentType: EntitySelectMenuData["type"];
119
+ toJSON(): EntitySelectMenuData;
120
+ }
121
+ declare class UserSelectMenuBuilder extends EntitySelectMenuBuilder {
122
+ protected readonly componentType = ComponentType.UserSelect;
123
+ }
124
+ declare class RoleSelectMenuBuilder extends EntitySelectMenuBuilder {
125
+ protected readonly componentType = ComponentType.RoleSelect;
126
+ }
127
+ declare class MentionableSelectMenuBuilder extends EntitySelectMenuBuilder {
128
+ protected readonly componentType = ComponentType.MentionableSelect;
129
+ }
130
+ declare class ChannelSelectMenuBuilder extends EntitySelectMenuBuilder {
131
+ #private;
132
+ protected readonly componentType = ComponentType.ChannelSelect;
133
+ setChannelTypes(...channelTypes: number[]): this;
134
+ toJSON(): EntitySelectMenuData;
135
+ }
136
+ interface TextInputData {
137
+ type: ComponentType.TextInput;
138
+ custom_id: string;
139
+ style: TextInputStyle;
140
+ placeholder?: string;
141
+ value?: string;
142
+ min_length?: number;
143
+ max_length?: number;
144
+ required?: boolean;
145
+ }
146
+ declare class TextInputBuilder implements ComponentBuilder<TextInputData> {
147
+ #private;
148
+ setCustomId(customId: string): this;
149
+ setStyle(style: TextInputStyle): this;
150
+ setPlaceholder(placeholder: string): this;
151
+ setValue(value: string): this;
152
+ setMinLength(minLength: number): this;
153
+ setMaxLength(maxLength: number): this;
154
+ setRequired(required?: boolean): this;
155
+ toJSON(): TextInputData;
156
+ }
157
+ interface TextDisplayData {
158
+ type: ComponentType.TextDisplay;
159
+ content: string;
160
+ }
161
+ declare class TextDisplayBuilder implements ComponentBuilder<TextDisplayData> {
162
+ #private;
163
+ setContent(content: string): this;
164
+ toJSON(): TextDisplayData;
165
+ }
166
+ interface UnfurledMediaItemData {
167
+ url: string;
168
+ }
169
+ declare class UnfurledMediaItemBuilder implements ComponentBuilder<UnfurledMediaItemData> {
170
+ #private;
171
+ setURL(url: string): this;
172
+ toJSON(): UnfurledMediaItemData;
173
+ }
174
+ interface ThumbnailData {
175
+ type: ComponentType.Thumbnail;
176
+ media: UnfurledMediaItemData;
177
+ description?: string;
178
+ spoiler?: boolean;
179
+ }
180
+ declare class ThumbnailBuilder implements ComponentBuilder<ThumbnailData> {
181
+ #private;
182
+ setMedia(media: UnfurledMediaItemData | ComponentBuilder<UnfurledMediaItemData>): this;
183
+ setDescription(description: string): this;
184
+ setSpoiler(spoiler?: boolean): this;
185
+ toJSON(): ThumbnailData;
186
+ }
187
+ interface MediaGalleryItemData {
188
+ media: UnfurledMediaItemData;
189
+ description?: string;
190
+ spoiler?: boolean;
191
+ }
192
+ declare class MediaGalleryItemBuilder implements ComponentBuilder<MediaGalleryItemData> {
193
+ #private;
194
+ setMedia(media: UnfurledMediaItemData | ComponentBuilder<UnfurledMediaItemData>): this;
195
+ setDescription(description: string): this;
196
+ setSpoiler(spoiler?: boolean): this;
197
+ toJSON(): MediaGalleryItemData;
198
+ }
199
+ interface MediaGalleryData {
200
+ type: ComponentType.MediaGallery;
201
+ items: readonly MediaGalleryItemData[];
202
+ }
203
+ declare class MediaGalleryBuilder implements ComponentBuilder<MediaGalleryData> {
204
+ #private;
205
+ addItems(...items: Array<MediaGalleryItemData | ComponentBuilder<MediaGalleryItemData>>): this;
206
+ setItems(...items: Array<MediaGalleryItemData | ComponentBuilder<MediaGalleryItemData>>): this;
207
+ toJSON(): MediaGalleryData;
208
+ }
209
+ interface FileData {
210
+ type: ComponentType.File;
211
+ file: UnfurledMediaItemData;
212
+ spoiler?: boolean;
213
+ }
214
+ declare class FileBuilder implements ComponentBuilder<FileData> {
215
+ #private;
216
+ setFile(file: UnfurledMediaItemData | ComponentBuilder<UnfurledMediaItemData>): this;
217
+ setSpoiler(spoiler?: boolean): this;
218
+ toJSON(): FileData;
219
+ }
220
+ interface SeparatorData {
221
+ type: ComponentType.Separator;
222
+ divider?: boolean;
223
+ spacing?: SeparatorSpacing;
224
+ }
225
+ declare class SeparatorBuilder implements ComponentBuilder<SeparatorData> {
226
+ #private;
227
+ setDivider(divider?: boolean): this;
228
+ setSpacing(spacing: SeparatorSpacing): this;
229
+ toJSON(): SeparatorData;
230
+ }
231
+ interface SectionData {
232
+ type: ComponentType.Section;
233
+ components: readonly TextDisplayData[];
234
+ accessory: ButtonData | ThumbnailData;
235
+ }
236
+ declare class SectionBuilder implements ComponentBuilder<SectionData> {
237
+ #private;
238
+ addComponents(...components: Array<TextDisplayData | ComponentBuilder<TextDisplayData>>): this;
239
+ setAccessory(accessory: ButtonData | ThumbnailData | ComponentBuilder<ButtonData | ThumbnailData>): this;
240
+ toJSON(): SectionData;
241
+ }
242
+ type ContainerChild = ActionRowData | TextDisplayData | SectionData | MediaGalleryData | SeparatorData | FileData;
243
+ interface ContainerData {
244
+ type: ComponentType.Container;
245
+ components: readonly ContainerChild[];
246
+ accent_color?: number;
247
+ spoiler?: boolean;
248
+ }
249
+ declare class ContainerBuilder implements ComponentBuilder<ContainerData> {
250
+ #private;
251
+ addComponents(...components: Array<ContainerChild | ComponentBuilder<ContainerChild>>): this;
252
+ setAccentColor(accentColor: number): this;
253
+ setSpoiler(spoiler?: boolean): this;
254
+ toJSON(): ContainerData;
255
+ }
256
+ interface FileUploadData {
257
+ type: ComponentType.FileUpload;
258
+ custom_id: string;
259
+ min_values?: number;
260
+ max_values?: number;
261
+ required?: boolean;
262
+ }
263
+ declare class FileUploadBuilder implements ComponentBuilder<FileUploadData> {
264
+ #private;
265
+ setCustomId(customId: string): this;
266
+ setMinValues(minValues: number): this;
267
+ setMaxValues(maxValues: number): this;
268
+ setRequired(required?: boolean): this;
269
+ toJSON(): FileUploadData;
270
+ }
271
+ interface GroupOptionData {
272
+ value: string;
273
+ label: string;
274
+ description?: string;
275
+ default?: boolean;
276
+ }
277
+ declare abstract class GroupOptionBuilderBase implements ComponentBuilder<GroupOptionData> {
278
+ #private;
279
+ setValue(value: string): this;
280
+ setLabel(label: string): this;
281
+ setDescription(description: string): this;
282
+ setDefault(isDefault?: boolean): this;
283
+ toJSON(): GroupOptionData;
284
+ }
285
+ declare class RadioGroupOptionBuilder extends GroupOptionBuilderBase {
286
+ }
287
+ declare class CheckboxGroupOptionBuilder extends GroupOptionBuilderBase {
288
+ }
289
+ interface RadioGroupData {
290
+ type: ComponentType.RadioGroup;
291
+ custom_id: string;
292
+ options: readonly GroupOptionData[];
293
+ required?: boolean;
294
+ }
295
+ declare class RadioGroupBuilder implements ComponentBuilder<RadioGroupData> {
296
+ #private;
297
+ setCustomId(customId: string): this;
298
+ addOptions(...options: Array<GroupOptionData | ComponentBuilder<GroupOptionData>>): this;
299
+ setOptions(...options: Array<GroupOptionData | ComponentBuilder<GroupOptionData>>): this;
300
+ setRequired(required?: boolean): this;
301
+ toJSON(): RadioGroupData;
302
+ }
303
+ interface CheckboxGroupData {
304
+ type: ComponentType.CheckboxGroup;
305
+ custom_id: string;
306
+ options: readonly GroupOptionData[];
307
+ min_values?: number;
308
+ max_values?: number;
309
+ required?: boolean;
310
+ }
311
+ declare class CheckboxGroupBuilder implements ComponentBuilder<CheckboxGroupData> {
312
+ #private;
313
+ setCustomId(customId: string): this;
314
+ addOptions(...options: Array<GroupOptionData | ComponentBuilder<GroupOptionData>>): this;
315
+ setOptions(...options: Array<GroupOptionData | ComponentBuilder<GroupOptionData>>): this;
316
+ setMinValues(minValues: number): this;
317
+ setMaxValues(maxValues: number): this;
318
+ setRequired(required?: boolean): this;
319
+ toJSON(): CheckboxGroupData;
320
+ }
321
+ interface CheckboxData {
322
+ type: ComponentType.Checkbox;
323
+ custom_id: string;
324
+ default?: boolean;
325
+ }
326
+ declare class CheckboxBuilder implements ComponentBuilder<CheckboxData> {
327
+ #private;
328
+ setCustomId(customId: string): this;
329
+ setDefault(isDefault?: boolean): this;
330
+ toJSON(): CheckboxData;
331
+ }
332
+ interface LabelData {
333
+ type: ComponentType.Label;
334
+ label: string;
335
+ description?: string;
336
+ component: TextInputData | StringSelectMenuData | EntitySelectMenuData | FileUploadData | RadioGroupData | CheckboxGroupData | CheckboxData;
337
+ }
338
+ declare class LabelBuilder implements ComponentBuilder<LabelData> {
339
+ #private;
340
+ setLabel(label: string): this;
341
+ setDescription(description: string): this;
342
+ setComponent(component: LabelData["component"] | ComponentBuilder<LabelData["component"]>): this;
343
+ toJSON(): LabelData;
344
+ }
345
+ type ActionRowChild = ButtonData | StringSelectMenuData | EntitySelectMenuData | TextInputData;
346
+ interface ActionRowData {
347
+ type: ComponentType.ActionRow;
348
+ components: readonly ActionRowChild[];
349
+ }
350
+ declare class ActionRowBuilder implements ComponentBuilder<ActionRowData> {
351
+ #private;
352
+ addComponents(...components: Array<ActionRowChild | ComponentBuilder<ActionRowChild>>): this;
353
+ toJSON(): ActionRowData;
354
+ }
355
+ interface ModalData {
356
+ custom_id: string;
357
+ title: string;
358
+ components: readonly (ActionRowData | LabelData | TextDisplayData)[];
359
+ }
360
+ declare class ModalBuilder implements ComponentBuilder<ModalData> {
361
+ #private;
362
+ setCustomId(customId: string): this;
363
+ setTitle(title: string): this;
364
+ addComponents(...components: Array<ActionRowData | LabelData | TextDisplayData | ComponentBuilder<ActionRowData | LabelData | TextDisplayData>>): this;
365
+ toJSON(): ModalData;
366
+ }
367
+
368
+ export { ActionRowBuilder, type ActionRowChild, type ActionRowData, ButtonBuilder, type ButtonData, ButtonStyle, ChannelSelectMenuBuilder, CheckboxBuilder, type CheckboxData, CheckboxGroupBuilder, type CheckboxGroupData, CheckboxGroupOptionBuilder, type ComponentBuilder, type ComponentEmoji, ComponentType, ContainerBuilder, type ContainerChild, type ContainerData, type EntitySelectMenuData, FileBuilder, type FileData, FileUploadBuilder, type FileUploadData, type GroupOptionData, LabelBuilder, type LabelData, MediaGalleryBuilder, type MediaGalleryData, MediaGalleryItemBuilder, type MediaGalleryItemData, MentionableSelectMenuBuilder, ModalBuilder, type ModalData, RadioGroupBuilder, type RadioGroupData, RadioGroupOptionBuilder, RoleSelectMenuBuilder, SectionBuilder, type SectionData, SeparatorBuilder, type SeparatorData, SeparatorSpacing, StringSelectMenuBuilder, type StringSelectMenuData, StringSelectOptionBuilder, type StringSelectOptionData, TextDisplayBuilder, type TextDisplayData, TextInputBuilder, type TextInputData, TextInputStyle, ThumbnailBuilder, type ThumbnailData, UnfurledMediaItemBuilder, type UnfurledMediaItemData, UserSelectMenuBuilder };
package/dist/index.js ADDED
@@ -0,0 +1,683 @@
1
+ // src/index.ts
2
+ var ComponentType = /* @__PURE__ */ ((ComponentType2) => {
3
+ ComponentType2[ComponentType2["ActionRow"] = 1] = "ActionRow";
4
+ ComponentType2[ComponentType2["Button"] = 2] = "Button";
5
+ ComponentType2[ComponentType2["StringSelect"] = 3] = "StringSelect";
6
+ ComponentType2[ComponentType2["TextInput"] = 4] = "TextInput";
7
+ ComponentType2[ComponentType2["UserSelect"] = 5] = "UserSelect";
8
+ ComponentType2[ComponentType2["RoleSelect"] = 6] = "RoleSelect";
9
+ ComponentType2[ComponentType2["MentionableSelect"] = 7] = "MentionableSelect";
10
+ ComponentType2[ComponentType2["ChannelSelect"] = 8] = "ChannelSelect";
11
+ ComponentType2[ComponentType2["Section"] = 9] = "Section";
12
+ ComponentType2[ComponentType2["TextDisplay"] = 10] = "TextDisplay";
13
+ ComponentType2[ComponentType2["Thumbnail"] = 11] = "Thumbnail";
14
+ ComponentType2[ComponentType2["MediaGallery"] = 12] = "MediaGallery";
15
+ ComponentType2[ComponentType2["File"] = 13] = "File";
16
+ ComponentType2[ComponentType2["Separator"] = 14] = "Separator";
17
+ ComponentType2[ComponentType2["Container"] = 17] = "Container";
18
+ ComponentType2[ComponentType2["Label"] = 18] = "Label";
19
+ ComponentType2[ComponentType2["FileUpload"] = 19] = "FileUpload";
20
+ ComponentType2[ComponentType2["RadioGroup"] = 21] = "RadioGroup";
21
+ ComponentType2[ComponentType2["CheckboxGroup"] = 22] = "CheckboxGroup";
22
+ ComponentType2[ComponentType2["Checkbox"] = 23] = "Checkbox";
23
+ return ComponentType2;
24
+ })(ComponentType || {});
25
+ var ButtonStyle = /* @__PURE__ */ ((ButtonStyle2) => {
26
+ ButtonStyle2[ButtonStyle2["Primary"] = 1] = "Primary";
27
+ ButtonStyle2[ButtonStyle2["Secondary"] = 2] = "Secondary";
28
+ ButtonStyle2[ButtonStyle2["Success"] = 3] = "Success";
29
+ ButtonStyle2[ButtonStyle2["Danger"] = 4] = "Danger";
30
+ ButtonStyle2[ButtonStyle2["Link"] = 5] = "Link";
31
+ ButtonStyle2[ButtonStyle2["Premium"] = 6] = "Premium";
32
+ return ButtonStyle2;
33
+ })(ButtonStyle || {});
34
+ var TextInputStyle = /* @__PURE__ */ ((TextInputStyle2) => {
35
+ TextInputStyle2[TextInputStyle2["Short"] = 1] = "Short";
36
+ TextInputStyle2[TextInputStyle2["Paragraph"] = 2] = "Paragraph";
37
+ return TextInputStyle2;
38
+ })(TextInputStyle || {});
39
+ var SeparatorSpacing = /* @__PURE__ */ ((SeparatorSpacing2) => {
40
+ SeparatorSpacing2[SeparatorSpacing2["Small"] = 1] = "Small";
41
+ SeparatorSpacing2[SeparatorSpacing2["Large"] = 2] = "Large";
42
+ return SeparatorSpacing2;
43
+ })(SeparatorSpacing || {});
44
+ function assertString(value, field, maxLength) {
45
+ const length = value.trim().length;
46
+ if (length === 0) throw new TypeError(`${field} must not be empty`);
47
+ if (value.length > maxLength) throw new RangeError(`${field} must be at most ${maxLength} characters`);
48
+ }
49
+ function assertInteger(value, field, minimum, maximum) {
50
+ if (!Number.isInteger(value) || value < minimum || value > maximum) {
51
+ throw new RangeError(`${field} must be an integer between ${minimum} and ${maximum}`);
52
+ }
53
+ }
54
+ function jsonOf(value) {
55
+ return typeof value === "object" && value !== null && "toJSON" in value ? value.toJSON() : value;
56
+ }
57
+ function frozen(value) {
58
+ return Object.freeze(value);
59
+ }
60
+ var ButtonBuilder = class {
61
+ #data = { style: 1 /* Primary */ };
62
+ setCustomId(customId) {
63
+ assertString(customId, "customId", 100);
64
+ this.#data.custom_id = customId;
65
+ delete this.#data.url;
66
+ delete this.#data.sku_id;
67
+ return this;
68
+ }
69
+ setLabel(label) {
70
+ assertString(label, "label", 80);
71
+ this.#data.label = label;
72
+ return this;
73
+ }
74
+ setStyle(style) {
75
+ assertInteger(style, "style", 1 /* Primary */, 6 /* Premium */);
76
+ this.#data.style = style;
77
+ return this;
78
+ }
79
+ setEmoji(emoji) {
80
+ if (!emoji.id && !emoji.name) throw new TypeError("emoji must have an id or name");
81
+ this.#data.emoji = frozen({ ...emoji });
82
+ return this;
83
+ }
84
+ setURL(url) {
85
+ assertString(url, "url", 512);
86
+ new URL(url);
87
+ this.#data.style = 5 /* Link */;
88
+ this.#data.url = url;
89
+ delete this.#data.custom_id;
90
+ delete this.#data.sku_id;
91
+ return this;
92
+ }
93
+ setSkuId(skuId) {
94
+ assertString(skuId, "skuId", 32);
95
+ this.#data.style = 6 /* Premium */;
96
+ this.#data.sku_id = skuId;
97
+ delete this.#data.custom_id;
98
+ delete this.#data.url;
99
+ return this;
100
+ }
101
+ setDisabled(disabled = true) {
102
+ this.#data.disabled = disabled;
103
+ return this;
104
+ }
105
+ toJSON() {
106
+ const style = this.#data.style ?? 1 /* Primary */;
107
+ if (this.#data.label === void 0 && this.#data.emoji === void 0 && style !== 6 /* Premium */) {
108
+ throw new TypeError("label or emoji must be set");
109
+ }
110
+ if (style === 5 /* Link */ && this.#data.url === void 0) throw new TypeError("url must be set for link buttons");
111
+ if (style === 6 /* Premium */ && this.#data.sku_id === void 0) throw new TypeError("skuId must be set for premium buttons");
112
+ if (style <= 4 /* Danger */ && this.#data.custom_id === void 0) throw new TypeError("customId must be set");
113
+ if (style === 5 /* Link */ && (this.#data.custom_id !== void 0 || this.#data.sku_id !== void 0)) {
114
+ throw new TypeError("link buttons cannot have a customId or skuId");
115
+ }
116
+ if (style === 6 /* Premium */ && (this.#data.custom_id !== void 0 || this.#data.url !== void 0 || this.#data.label !== void 0 || this.#data.emoji !== void 0)) {
117
+ throw new TypeError("premium buttons cannot have a customId, url, label, or emoji");
118
+ }
119
+ if (style <= 4 /* Danger */ && (this.#data.url !== void 0 || this.#data.sku_id !== void 0)) {
120
+ throw new TypeError("interactive buttons cannot have a url or skuId");
121
+ }
122
+ return frozen({ type: 2 /* Button */, ...this.#data, style });
123
+ }
124
+ };
125
+ var StringSelectOptionBuilder = class {
126
+ #data = {};
127
+ setLabel(label) {
128
+ assertString(label, "label", 100);
129
+ this.#data.label = label;
130
+ return this;
131
+ }
132
+ setValue(value) {
133
+ assertString(value, "value", 100);
134
+ this.#data.value = value;
135
+ return this;
136
+ }
137
+ setDescription(description) {
138
+ assertString(description, "description", 100);
139
+ this.#data.description = description;
140
+ return this;
141
+ }
142
+ setEmoji(emoji) {
143
+ if (!emoji.id && !emoji.name) throw new TypeError("emoji must have an id or name");
144
+ this.#data.emoji = frozen({ ...emoji });
145
+ return this;
146
+ }
147
+ setDefault(isDefault = true) {
148
+ this.#data.default = isDefault;
149
+ return this;
150
+ }
151
+ toJSON() {
152
+ if (this.#data.label === void 0) throw new TypeError("label must be set");
153
+ if (this.#data.value === void 0) throw new TypeError("value must be set");
154
+ return frozen({ ...this.#data });
155
+ }
156
+ };
157
+ var SelectMenuBuilderBase = class {
158
+ data = {};
159
+ setCustomId(customId) {
160
+ assertString(customId, "customId", 100);
161
+ this.data.custom_id = customId;
162
+ return this;
163
+ }
164
+ setPlaceholder(placeholder) {
165
+ assertString(placeholder, "placeholder", 150);
166
+ this.data.placeholder = placeholder;
167
+ return this;
168
+ }
169
+ setMinValues(minValues) {
170
+ assertInteger(minValues, "minValues", 0, 25);
171
+ this.data.min_values = minValues;
172
+ return this;
173
+ }
174
+ setMaxValues(maxValues) {
175
+ assertInteger(maxValues, "maxValues", 1, 25);
176
+ this.data.max_values = maxValues;
177
+ return this;
178
+ }
179
+ setRequired(required = true) {
180
+ this.data.required = required;
181
+ return this;
182
+ }
183
+ setDisabled(disabled = true) {
184
+ this.data.disabled = disabled;
185
+ return this;
186
+ }
187
+ validate() {
188
+ if (this.data.custom_id === void 0) throw new TypeError("customId must be set");
189
+ if ((this.data.min_values ?? 1) > (this.data.max_values ?? 1)) {
190
+ throw new RangeError("minValues must not exceed maxValues");
191
+ }
192
+ }
193
+ };
194
+ var StringSelectMenuBuilder = class extends SelectMenuBuilderBase {
195
+ #options = [];
196
+ addOptions(...options) {
197
+ if (this.#options.length + options.length > 25) throw new RangeError("select menus support at most 25 options");
198
+ this.#options.push(...options.map((option) => jsonOf(option)));
199
+ return this;
200
+ }
201
+ setOptions(...options) {
202
+ this.#options.length = 0;
203
+ return this.addOptions(...options);
204
+ }
205
+ toJSON() {
206
+ this.validate();
207
+ if (this.#options.length === 0) throw new TypeError("at least one option must be set");
208
+ return frozen({
209
+ type: 3 /* StringSelect */,
210
+ ...this.data,
211
+ options: Object.freeze(this.#options.map((option) => frozen({ ...option })))
212
+ });
213
+ }
214
+ };
215
+ var EntitySelectMenuBuilder = class extends SelectMenuBuilderBase {
216
+ toJSON() {
217
+ this.validate();
218
+ return frozen({ type: this.componentType, ...this.data });
219
+ }
220
+ };
221
+ var UserSelectMenuBuilder = class extends EntitySelectMenuBuilder {
222
+ componentType = 5 /* UserSelect */;
223
+ };
224
+ var RoleSelectMenuBuilder = class extends EntitySelectMenuBuilder {
225
+ componentType = 6 /* RoleSelect */;
226
+ };
227
+ var MentionableSelectMenuBuilder = class extends EntitySelectMenuBuilder {
228
+ componentType = 7 /* MentionableSelect */;
229
+ };
230
+ var ChannelSelectMenuBuilder = class extends EntitySelectMenuBuilder {
231
+ componentType = 8 /* ChannelSelect */;
232
+ #channelTypes = [];
233
+ setChannelTypes(...channelTypes) {
234
+ for (const channelType of channelTypes) assertInteger(channelType, "channelType", 0, 255);
235
+ this.#channelTypes.length = 0;
236
+ this.#channelTypes.push(...channelTypes);
237
+ return this;
238
+ }
239
+ toJSON() {
240
+ const data = super.toJSON();
241
+ return this.#channelTypes.length === 0 ? data : frozen({ ...data, channel_types: Object.freeze([...this.#channelTypes]) });
242
+ }
243
+ };
244
+ var TextInputBuilder = class {
245
+ #data = { style: 1 /* Short */ };
246
+ setCustomId(customId) {
247
+ assertString(customId, "customId", 100);
248
+ this.#data.custom_id = customId;
249
+ return this;
250
+ }
251
+ setStyle(style) {
252
+ assertInteger(style, "style", 1 /* Short */, 2 /* Paragraph */);
253
+ this.#data.style = style;
254
+ return this;
255
+ }
256
+ setPlaceholder(placeholder) {
257
+ assertString(placeholder, "placeholder", 100);
258
+ this.#data.placeholder = placeholder;
259
+ return this;
260
+ }
261
+ setValue(value) {
262
+ if (value.length > 4e3) throw new RangeError("value must be at most 4000 characters");
263
+ this.#data.value = value;
264
+ return this;
265
+ }
266
+ setMinLength(minLength) {
267
+ assertInteger(minLength, "minLength", 0, 4e3);
268
+ this.#data.min_length = minLength;
269
+ return this;
270
+ }
271
+ setMaxLength(maxLength) {
272
+ assertInteger(maxLength, "maxLength", 1, 4e3);
273
+ this.#data.max_length = maxLength;
274
+ return this;
275
+ }
276
+ setRequired(required = true) {
277
+ this.#data.required = required;
278
+ return this;
279
+ }
280
+ toJSON() {
281
+ if (this.#data.custom_id === void 0) throw new TypeError("customId must be set");
282
+ if ((this.#data.min_length ?? 0) > (this.#data.max_length ?? 4e3)) {
283
+ throw new RangeError("minLength must not exceed maxLength");
284
+ }
285
+ return frozen({ type: 4 /* TextInput */, ...this.#data });
286
+ }
287
+ };
288
+ var TextDisplayBuilder = class {
289
+ #content;
290
+ setContent(content) {
291
+ if (content.trim().length === 0) throw new TypeError("content must not be empty");
292
+ this.#content = content;
293
+ return this;
294
+ }
295
+ toJSON() {
296
+ if (this.#content === void 0) throw new TypeError("content must be set");
297
+ return frozen({ type: 10 /* TextDisplay */, content: this.#content });
298
+ }
299
+ };
300
+ var UnfurledMediaItemBuilder = class {
301
+ #url;
302
+ setURL(url) {
303
+ if (url.trim().length === 0) throw new TypeError("url must not be empty");
304
+ if (!url.startsWith("attachment://")) new URL(url);
305
+ this.#url = url;
306
+ return this;
307
+ }
308
+ toJSON() {
309
+ if (this.#url === void 0) throw new TypeError("url must be set");
310
+ return frozen({ url: this.#url });
311
+ }
312
+ };
313
+ var ThumbnailBuilder = class {
314
+ #data = {};
315
+ setMedia(media) {
316
+ this.#data.media = jsonOf(media);
317
+ return this;
318
+ }
319
+ setDescription(description) {
320
+ assertString(description, "description", 1024);
321
+ this.#data.description = description;
322
+ return this;
323
+ }
324
+ setSpoiler(spoiler = true) {
325
+ this.#data.spoiler = spoiler;
326
+ return this;
327
+ }
328
+ toJSON() {
329
+ if (this.#data.media === void 0) throw new TypeError("media must be set");
330
+ return frozen({ type: 11 /* Thumbnail */, ...this.#data });
331
+ }
332
+ };
333
+ var MediaGalleryItemBuilder = class {
334
+ #data = {};
335
+ setMedia(media) {
336
+ this.#data.media = jsonOf(media);
337
+ return this;
338
+ }
339
+ setDescription(description) {
340
+ assertString(description, "description", 1024);
341
+ this.#data.description = description;
342
+ return this;
343
+ }
344
+ setSpoiler(spoiler = true) {
345
+ this.#data.spoiler = spoiler;
346
+ return this;
347
+ }
348
+ toJSON() {
349
+ if (this.#data.media === void 0) throw new TypeError("media must be set");
350
+ return frozen({ ...this.#data });
351
+ }
352
+ };
353
+ var MediaGalleryBuilder = class {
354
+ #items = [];
355
+ addItems(...items) {
356
+ if (this.#items.length + items.length > 10) throw new RangeError("media galleries support at most 10 items");
357
+ this.#items.push(...items.map((item) => jsonOf(item)));
358
+ return this;
359
+ }
360
+ setItems(...items) {
361
+ this.#items.length = 0;
362
+ return this.addItems(...items);
363
+ }
364
+ toJSON() {
365
+ if (this.#items.length === 0) throw new TypeError("at least one item must be set");
366
+ return frozen({
367
+ type: 12 /* MediaGallery */,
368
+ items: Object.freeze(this.#items.map((item) => frozen({ ...item })))
369
+ });
370
+ }
371
+ };
372
+ var FileBuilder = class {
373
+ #data = {};
374
+ setFile(file) {
375
+ const resolved = jsonOf(file);
376
+ if (!resolved.url.startsWith("attachment://")) {
377
+ throw new TypeError("file url must use the attachment:// protocol");
378
+ }
379
+ this.#data.file = resolved;
380
+ return this;
381
+ }
382
+ setSpoiler(spoiler = true) {
383
+ this.#data.spoiler = spoiler;
384
+ return this;
385
+ }
386
+ toJSON() {
387
+ if (this.#data.file === void 0) throw new TypeError("file must be set");
388
+ return frozen({ type: 13 /* File */, ...this.#data });
389
+ }
390
+ };
391
+ var SeparatorBuilder = class {
392
+ #data = {};
393
+ setDivider(divider = true) {
394
+ this.#data.divider = divider;
395
+ return this;
396
+ }
397
+ setSpacing(spacing) {
398
+ assertInteger(spacing, "spacing", 1 /* Small */, 2 /* Large */);
399
+ this.#data.spacing = spacing;
400
+ return this;
401
+ }
402
+ toJSON() {
403
+ return frozen({ type: 14 /* Separator */, ...this.#data });
404
+ }
405
+ };
406
+ var SectionBuilder = class {
407
+ #components = [];
408
+ #accessory;
409
+ addComponents(...components) {
410
+ if (this.#components.length + components.length > 3) throw new RangeError("sections support at most 3 components");
411
+ this.#components.push(...components.map((component) => jsonOf(component)));
412
+ return this;
413
+ }
414
+ setAccessory(accessory) {
415
+ this.#accessory = jsonOf(accessory);
416
+ return this;
417
+ }
418
+ toJSON() {
419
+ if (this.#components.length === 0) throw new TypeError("at least one component must be set");
420
+ if (this.#accessory === void 0) throw new TypeError("accessory must be set");
421
+ return frozen({
422
+ type: 9 /* Section */,
423
+ components: Object.freeze([...this.#components]),
424
+ accessory: this.#accessory
425
+ });
426
+ }
427
+ };
428
+ var ContainerBuilder = class {
429
+ #data = {};
430
+ #components = [];
431
+ addComponents(...components) {
432
+ this.#components.push(...components.map((component) => jsonOf(component)));
433
+ return this;
434
+ }
435
+ setAccentColor(accentColor) {
436
+ assertInteger(accentColor, "accentColor", 0, 16777215);
437
+ this.#data.accent_color = accentColor;
438
+ return this;
439
+ }
440
+ setSpoiler(spoiler = true) {
441
+ this.#data.spoiler = spoiler;
442
+ return this;
443
+ }
444
+ toJSON() {
445
+ if (this.#components.length === 0) throw new TypeError("at least one component must be set");
446
+ return frozen({
447
+ type: 17 /* Container */,
448
+ ...this.#data,
449
+ components: Object.freeze([...this.#components])
450
+ });
451
+ }
452
+ };
453
+ var FileUploadBuilder = class {
454
+ #data = {};
455
+ setCustomId(customId) {
456
+ assertString(customId, "customId", 100);
457
+ this.#data.custom_id = customId;
458
+ return this;
459
+ }
460
+ setMinValues(minValues) {
461
+ assertInteger(minValues, "minValues", 0, 10);
462
+ this.#data.min_values = minValues;
463
+ return this;
464
+ }
465
+ setMaxValues(maxValues) {
466
+ assertInteger(maxValues, "maxValues", 1, 10);
467
+ this.#data.max_values = maxValues;
468
+ return this;
469
+ }
470
+ setRequired(required = true) {
471
+ this.#data.required = required;
472
+ return this;
473
+ }
474
+ toJSON() {
475
+ if (this.#data.custom_id === void 0) throw new TypeError("customId must be set");
476
+ if ((this.#data.min_values ?? 1) > (this.#data.max_values ?? 1)) {
477
+ throw new RangeError("minValues must not exceed maxValues");
478
+ }
479
+ if ((this.#data.required ?? true) && this.#data.min_values === 0) {
480
+ throw new RangeError("minValues must be at least 1 when required is true");
481
+ }
482
+ return frozen({ type: 19 /* FileUpload */, ...this.#data });
483
+ }
484
+ };
485
+ var GroupOptionBuilderBase = class {
486
+ #data = {};
487
+ setValue(value) {
488
+ assertString(value, "value", 100);
489
+ this.#data.value = value;
490
+ return this;
491
+ }
492
+ setLabel(label) {
493
+ assertString(label, "label", 100);
494
+ this.#data.label = label;
495
+ return this;
496
+ }
497
+ setDescription(description) {
498
+ assertString(description, "description", 100);
499
+ this.#data.description = description;
500
+ return this;
501
+ }
502
+ setDefault(isDefault = true) {
503
+ this.#data.default = isDefault;
504
+ return this;
505
+ }
506
+ toJSON() {
507
+ if (this.#data.value === void 0) throw new TypeError("value must be set");
508
+ if (this.#data.label === void 0) throw new TypeError("label must be set");
509
+ return frozen({ ...this.#data });
510
+ }
511
+ };
512
+ var RadioGroupOptionBuilder = class extends GroupOptionBuilderBase {
513
+ };
514
+ var CheckboxGroupOptionBuilder = class extends GroupOptionBuilderBase {
515
+ };
516
+ var RadioGroupBuilder = class {
517
+ #data = {};
518
+ #options = [];
519
+ setCustomId(customId) {
520
+ assertString(customId, "customId", 100);
521
+ this.#data.custom_id = customId;
522
+ return this;
523
+ }
524
+ addOptions(...options) {
525
+ if (this.#options.length + options.length > 10) throw new RangeError("radio groups support at most 10 options");
526
+ this.#options.push(...options.map((option) => jsonOf(option)));
527
+ return this;
528
+ }
529
+ setOptions(...options) {
530
+ this.#options.length = 0;
531
+ return this.addOptions(...options);
532
+ }
533
+ setRequired(required = true) {
534
+ this.#data.required = required;
535
+ return this;
536
+ }
537
+ toJSON() {
538
+ if (this.#data.custom_id === void 0) throw new TypeError("customId must be set");
539
+ if (this.#options.length < 2) throw new RangeError("radio groups require at least 2 options");
540
+ if (this.#options.filter((option) => option.default).length > 1) {
541
+ throw new TypeError("radio groups support at most one default option");
542
+ }
543
+ return frozen({
544
+ type: 21 /* RadioGroup */,
545
+ ...this.#data,
546
+ options: Object.freeze(this.#options.map((option) => frozen({ ...option })))
547
+ });
548
+ }
549
+ };
550
+ var CheckboxGroupBuilder = class {
551
+ #data = {};
552
+ #options = [];
553
+ setCustomId(customId) {
554
+ assertString(customId, "customId", 100);
555
+ this.#data.custom_id = customId;
556
+ return this;
557
+ }
558
+ addOptions(...options) {
559
+ if (this.#options.length + options.length > 10) throw new RangeError("checkbox groups support at most 10 options");
560
+ this.#options.push(...options.map((option) => jsonOf(option)));
561
+ return this;
562
+ }
563
+ setOptions(...options) {
564
+ this.#options.length = 0;
565
+ return this.addOptions(...options);
566
+ }
567
+ setMinValues(minValues) {
568
+ assertInteger(minValues, "minValues", 0, 10);
569
+ this.#data.min_values = minValues;
570
+ return this;
571
+ }
572
+ setMaxValues(maxValues) {
573
+ assertInteger(maxValues, "maxValues", 1, 10);
574
+ this.#data.max_values = maxValues;
575
+ return this;
576
+ }
577
+ setRequired(required = true) {
578
+ this.#data.required = required;
579
+ return this;
580
+ }
581
+ toJSON() {
582
+ if (this.#data.custom_id === void 0) throw new TypeError("customId must be set");
583
+ if (this.#options.length === 0) throw new RangeError("checkbox groups require at least 1 option");
584
+ const minValues = this.#data.min_values ?? 1;
585
+ const maxValues = this.#data.max_values ?? this.#options.length;
586
+ if (minValues > maxValues) throw new RangeError("minValues must not exceed maxValues");
587
+ if (maxValues > this.#options.length) throw new RangeError("maxValues must not exceed the option count");
588
+ if ((this.#data.required ?? true) && this.#data.min_values === 0) {
589
+ throw new RangeError("minValues must be at least 1 when required is true");
590
+ }
591
+ if (this.#options.filter((option) => option.default).length > maxValues) {
592
+ throw new RangeError("default option count must not exceed maxValues");
593
+ }
594
+ return frozen({
595
+ type: 22 /* CheckboxGroup */,
596
+ ...this.#data,
597
+ options: Object.freeze(this.#options.map((option) => frozen({ ...option })))
598
+ });
599
+ }
600
+ };
601
+ var CheckboxBuilder = class {
602
+ #data = {};
603
+ setCustomId(customId) {
604
+ assertString(customId, "customId", 100);
605
+ this.#data.custom_id = customId;
606
+ return this;
607
+ }
608
+ setDefault(isDefault = true) {
609
+ this.#data.default = isDefault;
610
+ return this;
611
+ }
612
+ toJSON() {
613
+ if (this.#data.custom_id === void 0) throw new TypeError("customId must be set");
614
+ return frozen({ type: 23 /* Checkbox */, ...this.#data });
615
+ }
616
+ };
617
+ var LabelBuilder = class {
618
+ #data = {};
619
+ setLabel(label) {
620
+ assertString(label, "label", 45);
621
+ this.#data.label = label;
622
+ return this;
623
+ }
624
+ setDescription(description) {
625
+ assertString(description, "description", 100);
626
+ this.#data.description = description;
627
+ return this;
628
+ }
629
+ setComponent(component) {
630
+ this.#data.component = jsonOf(component);
631
+ return this;
632
+ }
633
+ toJSON() {
634
+ if (this.#data.label === void 0) throw new TypeError("label must be set");
635
+ if (this.#data.component === void 0) throw new TypeError("component must be set");
636
+ return frozen({ type: 18 /* Label */, ...this.#data });
637
+ }
638
+ };
639
+ var ActionRowBuilder = class {
640
+ #components = [];
641
+ addComponents(...components) {
642
+ const next = [...this.#components, ...components.map((component) => jsonOf(component))];
643
+ if (next.length > 5) throw new RangeError("action rows support at most 5 components");
644
+ if (next.some((component) => component.type !== 2 /* Button */) && next.length > 1) {
645
+ throw new TypeError("select menus and text inputs must be the only component in an action row");
646
+ }
647
+ this.#components.push(...next.slice(this.#components.length));
648
+ return this;
649
+ }
650
+ toJSON() {
651
+ if (this.#components.length === 0) throw new TypeError("at least one component must be set");
652
+ return frozen({ type: 1 /* ActionRow */, components: Object.freeze([...this.#components]) });
653
+ }
654
+ };
655
+ var ModalBuilder = class {
656
+ #data = {};
657
+ #components = [];
658
+ setCustomId(customId) {
659
+ assertString(customId, "customId", 100);
660
+ this.#data.custom_id = customId;
661
+ return this;
662
+ }
663
+ setTitle(title) {
664
+ assertString(title, "title", 45);
665
+ this.#data.title = title;
666
+ return this;
667
+ }
668
+ addComponents(...components) {
669
+ if (this.#components.length + components.length > 5) throw new RangeError("modals support at most 5 components");
670
+ this.#components.push(...components.map((component) => jsonOf(component)));
671
+ return this;
672
+ }
673
+ toJSON() {
674
+ if (this.#data.custom_id === void 0) throw new TypeError("customId must be set");
675
+ if (this.#data.title === void 0) throw new TypeError("title must be set");
676
+ if (this.#components.length === 0) throw new TypeError("at least one component must be set");
677
+ return frozen({ ...this.#data, components: Object.freeze([...this.#components]) });
678
+ }
679
+ };
680
+
681
+ export { ActionRowBuilder, ButtonBuilder, ButtonStyle, ChannelSelectMenuBuilder, CheckboxBuilder, CheckboxGroupBuilder, CheckboxGroupOptionBuilder, ComponentType, ContainerBuilder, FileBuilder, FileUploadBuilder, LabelBuilder, MediaGalleryBuilder, MediaGalleryItemBuilder, MentionableSelectMenuBuilder, ModalBuilder, RadioGroupBuilder, RadioGroupOptionBuilder, RoleSelectMenuBuilder, SectionBuilder, SeparatorBuilder, SeparatorSpacing, StringSelectMenuBuilder, StringSelectOptionBuilder, TextDisplayBuilder, TextInputBuilder, TextInputStyle, ThumbnailBuilder, UnfurledMediaItemBuilder, UserSelectMenuBuilder };
682
+ //# sourceMappingURL=index.js.map
683
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"names":["ComponentType","ButtonStyle","TextInputStyle","SeparatorSpacing"],"mappings":"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","file":"index.js","sourcesContent":["export enum ComponentType {\n ActionRow = 1,\n Button = 2,\n StringSelect = 3,\n TextInput = 4,\n UserSelect = 5,\n RoleSelect = 6,\n MentionableSelect = 7,\n ChannelSelect = 8,\n Section = 9,\n TextDisplay = 10,\n Thumbnail = 11,\n MediaGallery = 12,\n File = 13,\n Separator = 14,\n Container = 17,\n Label = 18,\n FileUpload = 19,\n RadioGroup = 21,\n CheckboxGroup = 22,\n Checkbox = 23,\n}\n\nexport enum ButtonStyle {\n Primary = 1,\n Secondary = 2,\n Success = 3,\n Danger = 4,\n Link = 5,\n Premium = 6,\n}\n\nexport enum TextInputStyle {\n Short = 1,\n Paragraph = 2,\n}\n\nexport enum SeparatorSpacing {\n Small = 1,\n Large = 2,\n}\n\nexport interface ComponentBuilder<T> {\n toJSON(): T;\n}\n\nexport interface ComponentEmoji {\n id?: string;\n name?: string;\n animated?: boolean;\n}\n\nexport interface ButtonData {\n type: ComponentType.Button;\n style: ButtonStyle;\n label?: string;\n emoji?: ComponentEmoji;\n custom_id?: string;\n url?: string;\n sku_id?: string;\n disabled?: boolean;\n}\n\nfunction assertString(value: string, field: string, maxLength: number): void {\n const length = value.trim().length;\n if (length === 0) throw new TypeError(`${field} must not be empty`);\n if (value.length > maxLength) throw new RangeError(`${field} must be at most ${maxLength} characters`);\n}\n\nfunction assertInteger(value: number, field: string, minimum: number, maximum: number): void {\n if (!Number.isInteger(value) || value < minimum || value > maximum) {\n throw new RangeError(`${field} must be an integer between ${minimum} and ${maximum}`);\n }\n}\n\nfunction jsonOf<T>(value: T | ComponentBuilder<T>): T {\n return typeof value === \"object\" && value !== null && \"toJSON\" in value\n ? (value as ComponentBuilder<T>).toJSON()\n : value;\n}\n\nfunction frozen<T extends object>(value: T): T {\n return Object.freeze(value);\n}\n\nexport class ButtonBuilder implements ComponentBuilder<ButtonData> {\n readonly #data: Partial<Omit<ButtonData, \"type\">> = { style: ButtonStyle.Primary };\n\n public setCustomId(customId: string): this {\n assertString(customId, \"customId\", 100);\n this.#data.custom_id = customId;\n delete this.#data.url;\n delete this.#data.sku_id;\n return this;\n }\n\n public setLabel(label: string): this {\n assertString(label, \"label\", 80);\n this.#data.label = label;\n return this;\n }\n\n public setStyle(style: ButtonStyle): this {\n assertInteger(style, \"style\", ButtonStyle.Primary, ButtonStyle.Premium);\n this.#data.style = style;\n return this;\n }\n\n public setEmoji(emoji: ComponentEmoji): this {\n if (!emoji.id && !emoji.name) throw new TypeError(\"emoji must have an id or name\");\n this.#data.emoji = frozen({ ...emoji });\n return this;\n }\n\n public setURL(url: string): this {\n assertString(url, \"url\", 512);\n new URL(url);\n this.#data.style = ButtonStyle.Link;\n this.#data.url = url;\n delete this.#data.custom_id;\n delete this.#data.sku_id;\n return this;\n }\n\n public setSkuId(skuId: string): this {\n assertString(skuId, \"skuId\", 32);\n this.#data.style = ButtonStyle.Premium;\n this.#data.sku_id = skuId;\n delete this.#data.custom_id;\n delete this.#data.url;\n return this;\n }\n\n public setDisabled(disabled = true): this {\n this.#data.disabled = disabled;\n return this;\n }\n\n public toJSON(): ButtonData {\n const style = this.#data.style ?? ButtonStyle.Primary;\n if (this.#data.label === undefined && this.#data.emoji === undefined && style !== ButtonStyle.Premium) {\n throw new TypeError(\"label or emoji must be set\");\n }\n if (style === ButtonStyle.Link && this.#data.url === undefined) throw new TypeError(\"url must be set for link buttons\");\n if (style === ButtonStyle.Premium && this.#data.sku_id === undefined) throw new TypeError(\"skuId must be set for premium buttons\");\n if (style <= ButtonStyle.Danger && this.#data.custom_id === undefined) throw new TypeError(\"customId must be set\");\n if (style === ButtonStyle.Link && (this.#data.custom_id !== undefined || this.#data.sku_id !== undefined)) {\n throw new TypeError(\"link buttons cannot have a customId or skuId\");\n }\n if (style === ButtonStyle.Premium && (\n this.#data.custom_id !== undefined || this.#data.url !== undefined\n || this.#data.label !== undefined || this.#data.emoji !== undefined\n )) {\n throw new TypeError(\"premium buttons cannot have a customId, url, label, or emoji\");\n }\n if (style <= ButtonStyle.Danger && (this.#data.url !== undefined || this.#data.sku_id !== undefined)) {\n throw new TypeError(\"interactive buttons cannot have a url or skuId\");\n }\n return frozen({ type: ComponentType.Button, ...this.#data, style } as ButtonData);\n }\n}\n\nexport interface StringSelectOptionData {\n label: string;\n value: string;\n description?: string;\n emoji?: ComponentEmoji;\n default?: boolean;\n}\n\nexport class StringSelectOptionBuilder implements ComponentBuilder<StringSelectOptionData> {\n readonly #data: Partial<StringSelectOptionData> = {};\n\n public setLabel(label: string): this {\n assertString(label, \"label\", 100);\n this.#data.label = label;\n return this;\n }\n\n public setValue(value: string): this {\n assertString(value, \"value\", 100);\n this.#data.value = value;\n return this;\n }\n\n public setDescription(description: string): this {\n assertString(description, \"description\", 100);\n this.#data.description = description;\n return this;\n }\n\n public setEmoji(emoji: ComponentEmoji): this {\n if (!emoji.id && !emoji.name) throw new TypeError(\"emoji must have an id or name\");\n this.#data.emoji = frozen({ ...emoji });\n return this;\n }\n\n public setDefault(isDefault = true): this {\n this.#data.default = isDefault;\n return this;\n }\n\n public toJSON(): StringSelectOptionData {\n if (this.#data.label === undefined) throw new TypeError(\"label must be set\");\n if (this.#data.value === undefined) throw new TypeError(\"value must be set\");\n return frozen({ ...this.#data } as StringSelectOptionData);\n }\n}\n\ninterface SelectMenuFields {\n custom_id: string;\n placeholder?: string;\n min_values?: number;\n max_values?: number;\n required?: boolean;\n disabled?: boolean;\n}\n\nexport interface StringSelectMenuData extends SelectMenuFields {\n type: ComponentType.StringSelect;\n options: readonly StringSelectOptionData[];\n}\n\nabstract class SelectMenuBuilderBase<TData extends SelectMenuFields> implements ComponentBuilder<TData> {\n protected readonly data: Partial<SelectMenuFields> = {};\n\n public setCustomId(customId: string): this {\n assertString(customId, \"customId\", 100);\n this.data.custom_id = customId;\n return this;\n }\n\n public setPlaceholder(placeholder: string): this {\n assertString(placeholder, \"placeholder\", 150);\n this.data.placeholder = placeholder;\n return this;\n }\n\n public setMinValues(minValues: number): this {\n assertInteger(minValues, \"minValues\", 0, 25);\n this.data.min_values = minValues;\n return this;\n }\n\n public setMaxValues(maxValues: number): this {\n assertInteger(maxValues, \"maxValues\", 1, 25);\n this.data.max_values = maxValues;\n return this;\n }\n\n public setRequired(required = true): this {\n this.data.required = required;\n return this;\n }\n\n public setDisabled(disabled = true): this {\n this.data.disabled = disabled;\n return this;\n }\n\n protected validate(): void {\n if (this.data.custom_id === undefined) throw new TypeError(\"customId must be set\");\n if ((this.data.min_values ?? 1) > (this.data.max_values ?? 1)) {\n throw new RangeError(\"minValues must not exceed maxValues\");\n }\n }\n\n public abstract toJSON(): TData;\n}\n\nexport class StringSelectMenuBuilder extends SelectMenuBuilderBase<StringSelectMenuData> {\n readonly #options: StringSelectOptionData[] = [];\n\n public addOptions(...options: Array<StringSelectOptionData | ComponentBuilder<StringSelectOptionData>>): this {\n if (this.#options.length + options.length > 25) throw new RangeError(\"select menus support at most 25 options\");\n this.#options.push(...options.map((option) => jsonOf(option)));\n return this;\n }\n\n public setOptions(...options: Array<StringSelectOptionData | ComponentBuilder<StringSelectOptionData>>): this {\n this.#options.length = 0;\n return this.addOptions(...options);\n }\n\n public toJSON(): StringSelectMenuData {\n this.validate();\n if (this.#options.length === 0) throw new TypeError(\"at least one option must be set\");\n return frozen({\n type: ComponentType.StringSelect,\n ...this.data,\n options: Object.freeze(this.#options.map((option) => frozen({ ...option }))),\n } as StringSelectMenuData);\n }\n}\n\nexport interface EntitySelectMenuData extends SelectMenuFields {\n type: ComponentType.UserSelect | ComponentType.RoleSelect | ComponentType.MentionableSelect | ComponentType.ChannelSelect;\n channel_types?: readonly number[];\n}\n\nabstract class EntitySelectMenuBuilder extends SelectMenuBuilderBase<EntitySelectMenuData> {\n protected abstract readonly componentType: EntitySelectMenuData[\"type\"];\n\n public toJSON(): EntitySelectMenuData {\n this.validate();\n return frozen({ type: this.componentType, ...this.data } as EntitySelectMenuData);\n }\n}\n\nexport class UserSelectMenuBuilder extends EntitySelectMenuBuilder {\n protected readonly componentType = ComponentType.UserSelect;\n}\n\nexport class RoleSelectMenuBuilder extends EntitySelectMenuBuilder {\n protected readonly componentType = ComponentType.RoleSelect;\n}\n\nexport class MentionableSelectMenuBuilder extends EntitySelectMenuBuilder {\n protected readonly componentType = ComponentType.MentionableSelect;\n}\n\nexport class ChannelSelectMenuBuilder extends EntitySelectMenuBuilder {\n protected readonly componentType = ComponentType.ChannelSelect;\n readonly #channelTypes: number[] = [];\n\n public setChannelTypes(...channelTypes: number[]): this {\n for (const channelType of channelTypes) assertInteger(channelType, \"channelType\", 0, 255);\n this.#channelTypes.length = 0;\n this.#channelTypes.push(...channelTypes);\n return this;\n }\n\n public override toJSON(): EntitySelectMenuData {\n const data = super.toJSON();\n return this.#channelTypes.length === 0\n ? data\n : frozen({ ...data, channel_types: Object.freeze([...this.#channelTypes]) });\n }\n}\n\nexport interface TextInputData {\n type: ComponentType.TextInput;\n custom_id: string;\n style: TextInputStyle;\n placeholder?: string;\n value?: string;\n min_length?: number;\n max_length?: number;\n required?: boolean;\n}\n\nexport class TextInputBuilder implements ComponentBuilder<TextInputData> {\n readonly #data: Partial<Omit<TextInputData, \"type\">> = { style: TextInputStyle.Short };\n\n public setCustomId(customId: string): this {\n assertString(customId, \"customId\", 100);\n this.#data.custom_id = customId;\n return this;\n }\n\n public setStyle(style: TextInputStyle): this {\n assertInteger(style, \"style\", TextInputStyle.Short, TextInputStyle.Paragraph);\n this.#data.style = style;\n return this;\n }\n\n public setPlaceholder(placeholder: string): this {\n assertString(placeholder, \"placeholder\", 100);\n this.#data.placeholder = placeholder;\n return this;\n }\n\n public setValue(value: string): this {\n if (value.length > 4000) throw new RangeError(\"value must be at most 4000 characters\");\n this.#data.value = value;\n return this;\n }\n\n public setMinLength(minLength: number): this {\n assertInteger(minLength, \"minLength\", 0, 4000);\n this.#data.min_length = minLength;\n return this;\n }\n\n public setMaxLength(maxLength: number): this {\n assertInteger(maxLength, \"maxLength\", 1, 4000);\n this.#data.max_length = maxLength;\n return this;\n }\n\n public setRequired(required = true): this {\n this.#data.required = required;\n return this;\n }\n\n public toJSON(): TextInputData {\n if (this.#data.custom_id === undefined) throw new TypeError(\"customId must be set\");\n if ((this.#data.min_length ?? 0) > (this.#data.max_length ?? 4000)) {\n throw new RangeError(\"minLength must not exceed maxLength\");\n }\n return frozen({ type: ComponentType.TextInput, ...this.#data } as TextInputData);\n }\n}\n\nexport interface TextDisplayData {\n type: ComponentType.TextDisplay;\n content: string;\n}\n\nexport class TextDisplayBuilder implements ComponentBuilder<TextDisplayData> {\n #content?: string;\n\n public setContent(content: string): this {\n if (content.trim().length === 0) throw new TypeError(\"content must not be empty\");\n this.#content = content;\n return this;\n }\n\n public toJSON(): TextDisplayData {\n if (this.#content === undefined) throw new TypeError(\"content must be set\");\n return frozen({ type: ComponentType.TextDisplay, content: this.#content });\n }\n}\n\nexport interface UnfurledMediaItemData {\n url: string;\n}\n\nexport class UnfurledMediaItemBuilder implements ComponentBuilder<UnfurledMediaItemData> {\n #url?: string;\n\n public setURL(url: string): this {\n if (url.trim().length === 0) throw new TypeError(\"url must not be empty\");\n if (!url.startsWith(\"attachment://\")) new URL(url);\n this.#url = url;\n return this;\n }\n\n public toJSON(): UnfurledMediaItemData {\n if (this.#url === undefined) throw new TypeError(\"url must be set\");\n return frozen({ url: this.#url });\n }\n}\n\nexport interface ThumbnailData {\n type: ComponentType.Thumbnail;\n media: UnfurledMediaItemData;\n description?: string;\n spoiler?: boolean;\n}\n\nexport class ThumbnailBuilder implements ComponentBuilder<ThumbnailData> {\n readonly #data: Partial<Omit<ThumbnailData, \"type\">> = {};\n\n public setMedia(media: UnfurledMediaItemData | ComponentBuilder<UnfurledMediaItemData>): this {\n this.#data.media = jsonOf(media);\n return this;\n }\n\n public setDescription(description: string): this {\n assertString(description, \"description\", 1024);\n this.#data.description = description;\n return this;\n }\n\n public setSpoiler(spoiler = true): this {\n this.#data.spoiler = spoiler;\n return this;\n }\n\n public toJSON(): ThumbnailData {\n if (this.#data.media === undefined) throw new TypeError(\"media must be set\");\n return frozen({ type: ComponentType.Thumbnail, ...this.#data } as ThumbnailData);\n }\n}\n\nexport interface MediaGalleryItemData {\n media: UnfurledMediaItemData;\n description?: string;\n spoiler?: boolean;\n}\n\nexport class MediaGalleryItemBuilder implements ComponentBuilder<MediaGalleryItemData> {\n readonly #data: Partial<MediaGalleryItemData> = {};\n\n public setMedia(media: UnfurledMediaItemData | ComponentBuilder<UnfurledMediaItemData>): this {\n this.#data.media = jsonOf(media);\n return this;\n }\n\n public setDescription(description: string): this {\n assertString(description, \"description\", 1024);\n this.#data.description = description;\n return this;\n }\n\n public setSpoiler(spoiler = true): this {\n this.#data.spoiler = spoiler;\n return this;\n }\n\n public toJSON(): MediaGalleryItemData {\n if (this.#data.media === undefined) throw new TypeError(\"media must be set\");\n return frozen({ ...this.#data } as MediaGalleryItemData);\n }\n}\n\nexport interface MediaGalleryData {\n type: ComponentType.MediaGallery;\n items: readonly MediaGalleryItemData[];\n}\n\nexport class MediaGalleryBuilder implements ComponentBuilder<MediaGalleryData> {\n readonly #items: MediaGalleryItemData[] = [];\n\n public addItems(...items: Array<MediaGalleryItemData | ComponentBuilder<MediaGalleryItemData>>): this {\n if (this.#items.length + items.length > 10) throw new RangeError(\"media galleries support at most 10 items\");\n this.#items.push(...items.map((item) => jsonOf(item)));\n return this;\n }\n\n public setItems(...items: Array<MediaGalleryItemData | ComponentBuilder<MediaGalleryItemData>>): this {\n this.#items.length = 0;\n return this.addItems(...items);\n }\n\n public toJSON(): MediaGalleryData {\n if (this.#items.length === 0) throw new TypeError(\"at least one item must be set\");\n return frozen({\n type: ComponentType.MediaGallery,\n items: Object.freeze(this.#items.map((item) => frozen({ ...item }))),\n });\n }\n}\n\nexport interface FileData {\n type: ComponentType.File;\n file: UnfurledMediaItemData;\n spoiler?: boolean;\n}\n\nexport class FileBuilder implements ComponentBuilder<FileData> {\n readonly #data: Partial<Omit<FileData, \"type\">> = {};\n\n public setFile(file: UnfurledMediaItemData | ComponentBuilder<UnfurledMediaItemData>): this {\n const resolved = jsonOf(file);\n if (!resolved.url.startsWith(\"attachment://\")) {\n throw new TypeError(\"file url must use the attachment:// protocol\");\n }\n this.#data.file = resolved;\n return this;\n }\n\n public setSpoiler(spoiler = true): this {\n this.#data.spoiler = spoiler;\n return this;\n }\n\n public toJSON(): FileData {\n if (this.#data.file === undefined) throw new TypeError(\"file must be set\");\n return frozen({ type: ComponentType.File, ...this.#data } as FileData);\n }\n}\n\nexport interface SeparatorData {\n type: ComponentType.Separator;\n divider?: boolean;\n spacing?: SeparatorSpacing;\n}\n\nexport class SeparatorBuilder implements ComponentBuilder<SeparatorData> {\n readonly #data: Omit<SeparatorData, \"type\"> = {};\n\n public setDivider(divider = true): this {\n this.#data.divider = divider;\n return this;\n }\n\n public setSpacing(spacing: SeparatorSpacing): this {\n assertInteger(spacing, \"spacing\", SeparatorSpacing.Small, SeparatorSpacing.Large);\n this.#data.spacing = spacing;\n return this;\n }\n\n public toJSON(): SeparatorData {\n return frozen({ type: ComponentType.Separator, ...this.#data });\n }\n}\n\nexport interface SectionData {\n type: ComponentType.Section;\n components: readonly TextDisplayData[];\n accessory: ButtonData | ThumbnailData;\n}\n\nexport class SectionBuilder implements ComponentBuilder<SectionData> {\n readonly #components: TextDisplayData[] = [];\n #accessory?: ButtonData | ThumbnailData;\n\n public addComponents(...components: Array<TextDisplayData | ComponentBuilder<TextDisplayData>>): this {\n if (this.#components.length + components.length > 3) throw new RangeError(\"sections support at most 3 components\");\n this.#components.push(...components.map((component) => jsonOf(component)));\n return this;\n }\n\n public setAccessory(accessory: ButtonData | ThumbnailData | ComponentBuilder<ButtonData | ThumbnailData>): this {\n this.#accessory = jsonOf(accessory);\n return this;\n }\n\n public toJSON(): SectionData {\n if (this.#components.length === 0) throw new TypeError(\"at least one component must be set\");\n if (this.#accessory === undefined) throw new TypeError(\"accessory must be set\");\n return frozen({\n type: ComponentType.Section,\n components: Object.freeze([...this.#components]),\n accessory: this.#accessory,\n });\n }\n}\n\nexport type ContainerChild = ActionRowData | TextDisplayData | SectionData | MediaGalleryData | SeparatorData | FileData;\n\nexport interface ContainerData {\n type: ComponentType.Container;\n components: readonly ContainerChild[];\n accent_color?: number;\n spoiler?: boolean;\n}\n\nexport class ContainerBuilder implements ComponentBuilder<ContainerData> {\n readonly #data: Partial<Pick<ContainerData, \"accent_color\" | \"spoiler\">> = {};\n readonly #components: ContainerChild[] = [];\n\n public addComponents(...components: Array<ContainerChild | ComponentBuilder<ContainerChild>>): this {\n this.#components.push(...components.map((component) => jsonOf(component)));\n return this;\n }\n\n public setAccentColor(accentColor: number): this {\n assertInteger(accentColor, \"accentColor\", 0x000000, 0xFFFFFF);\n this.#data.accent_color = accentColor;\n return this;\n }\n\n public setSpoiler(spoiler = true): this {\n this.#data.spoiler = spoiler;\n return this;\n }\n\n public toJSON(): ContainerData {\n if (this.#components.length === 0) throw new TypeError(\"at least one component must be set\");\n return frozen({\n type: ComponentType.Container,\n ...this.#data,\n components: Object.freeze([...this.#components]),\n });\n }\n}\n\nexport interface FileUploadData {\n type: ComponentType.FileUpload;\n custom_id: string;\n min_values?: number;\n max_values?: number;\n required?: boolean;\n}\n\nexport class FileUploadBuilder implements ComponentBuilder<FileUploadData> {\n readonly #data: Partial<Omit<FileUploadData, \"type\">> = {};\n\n public setCustomId(customId: string): this {\n assertString(customId, \"customId\", 100);\n this.#data.custom_id = customId;\n return this;\n }\n\n public setMinValues(minValues: number): this {\n assertInteger(minValues, \"minValues\", 0, 10);\n this.#data.min_values = minValues;\n return this;\n }\n\n public setMaxValues(maxValues: number): this {\n assertInteger(maxValues, \"maxValues\", 1, 10);\n this.#data.max_values = maxValues;\n return this;\n }\n\n public setRequired(required = true): this {\n this.#data.required = required;\n return this;\n }\n\n public toJSON(): FileUploadData {\n if (this.#data.custom_id === undefined) throw new TypeError(\"customId must be set\");\n if ((this.#data.min_values ?? 1) > (this.#data.max_values ?? 1)) {\n throw new RangeError(\"minValues must not exceed maxValues\");\n }\n if ((this.#data.required ?? true) && this.#data.min_values === 0) {\n throw new RangeError(\"minValues must be at least 1 when required is true\");\n }\n return frozen({ type: ComponentType.FileUpload, ...this.#data } as FileUploadData);\n }\n}\n\nexport interface GroupOptionData {\n value: string;\n label: string;\n description?: string;\n default?: boolean;\n}\n\nabstract class GroupOptionBuilderBase implements ComponentBuilder<GroupOptionData> {\n readonly #data: Partial<GroupOptionData> = {};\n\n public setValue(value: string): this {\n assertString(value, \"value\", 100);\n this.#data.value = value;\n return this;\n }\n\n public setLabel(label: string): this {\n assertString(label, \"label\", 100);\n this.#data.label = label;\n return this;\n }\n\n public setDescription(description: string): this {\n assertString(description, \"description\", 100);\n this.#data.description = description;\n return this;\n }\n\n public setDefault(isDefault = true): this {\n this.#data.default = isDefault;\n return this;\n }\n\n public toJSON(): GroupOptionData {\n if (this.#data.value === undefined) throw new TypeError(\"value must be set\");\n if (this.#data.label === undefined) throw new TypeError(\"label must be set\");\n return frozen({ ...this.#data } as GroupOptionData);\n }\n}\n\nexport class RadioGroupOptionBuilder extends GroupOptionBuilderBase {}\nexport class CheckboxGroupOptionBuilder extends GroupOptionBuilderBase {}\n\nexport interface RadioGroupData {\n type: ComponentType.RadioGroup;\n custom_id: string;\n options: readonly GroupOptionData[];\n required?: boolean;\n}\n\nexport class RadioGroupBuilder implements ComponentBuilder<RadioGroupData> {\n readonly #data: Partial<Omit<RadioGroupData, \"type\" | \"options\">> = {};\n readonly #options: GroupOptionData[] = [];\n\n public setCustomId(customId: string): this {\n assertString(customId, \"customId\", 100);\n this.#data.custom_id = customId;\n return this;\n }\n\n public addOptions(...options: Array<GroupOptionData | ComponentBuilder<GroupOptionData>>): this {\n if (this.#options.length + options.length > 10) throw new RangeError(\"radio groups support at most 10 options\");\n this.#options.push(...options.map((option) => jsonOf(option)));\n return this;\n }\n\n public setOptions(...options: Array<GroupOptionData | ComponentBuilder<GroupOptionData>>): this {\n this.#options.length = 0;\n return this.addOptions(...options);\n }\n\n public setRequired(required = true): this {\n this.#data.required = required;\n return this;\n }\n\n public toJSON(): RadioGroupData {\n if (this.#data.custom_id === undefined) throw new TypeError(\"customId must be set\");\n if (this.#options.length < 2) throw new RangeError(\"radio groups require at least 2 options\");\n if (this.#options.filter((option) => option.default).length > 1) {\n throw new TypeError(\"radio groups support at most one default option\");\n }\n return frozen({\n type: ComponentType.RadioGroup,\n ...this.#data,\n options: Object.freeze(this.#options.map((option) => frozen({ ...option }))),\n } as RadioGroupData);\n }\n}\n\nexport interface CheckboxGroupData {\n type: ComponentType.CheckboxGroup;\n custom_id: string;\n options: readonly GroupOptionData[];\n min_values?: number;\n max_values?: number;\n required?: boolean;\n}\n\nexport class CheckboxGroupBuilder implements ComponentBuilder<CheckboxGroupData> {\n readonly #data: Partial<Omit<CheckboxGroupData, \"type\" | \"options\">> = {};\n readonly #options: GroupOptionData[] = [];\n\n public setCustomId(customId: string): this {\n assertString(customId, \"customId\", 100);\n this.#data.custom_id = customId;\n return this;\n }\n\n public addOptions(...options: Array<GroupOptionData | ComponentBuilder<GroupOptionData>>): this {\n if (this.#options.length + options.length > 10) throw new RangeError(\"checkbox groups support at most 10 options\");\n this.#options.push(...options.map((option) => jsonOf(option)));\n return this;\n }\n\n public setOptions(...options: Array<GroupOptionData | ComponentBuilder<GroupOptionData>>): this {\n this.#options.length = 0;\n return this.addOptions(...options);\n }\n\n public setMinValues(minValues: number): this {\n assertInteger(minValues, \"minValues\", 0, 10);\n this.#data.min_values = minValues;\n return this;\n }\n\n public setMaxValues(maxValues: number): this {\n assertInteger(maxValues, \"maxValues\", 1, 10);\n this.#data.max_values = maxValues;\n return this;\n }\n\n public setRequired(required = true): this {\n this.#data.required = required;\n return this;\n }\n\n public toJSON(): CheckboxGroupData {\n if (this.#data.custom_id === undefined) throw new TypeError(\"customId must be set\");\n if (this.#options.length === 0) throw new RangeError(\"checkbox groups require at least 1 option\");\n const minValues = this.#data.min_values ?? 1;\n const maxValues = this.#data.max_values ?? this.#options.length;\n if (minValues > maxValues) throw new RangeError(\"minValues must not exceed maxValues\");\n if (maxValues > this.#options.length) throw new RangeError(\"maxValues must not exceed the option count\");\n if ((this.#data.required ?? true) && this.#data.min_values === 0) {\n throw new RangeError(\"minValues must be at least 1 when required is true\");\n }\n if (this.#options.filter((option) => option.default).length > maxValues) {\n throw new RangeError(\"default option count must not exceed maxValues\");\n }\n return frozen({\n type: ComponentType.CheckboxGroup,\n ...this.#data,\n options: Object.freeze(this.#options.map((option) => frozen({ ...option }))),\n } as CheckboxGroupData);\n }\n}\n\nexport interface CheckboxData {\n type: ComponentType.Checkbox;\n custom_id: string;\n default?: boolean;\n}\n\nexport class CheckboxBuilder implements ComponentBuilder<CheckboxData> {\n readonly #data: Partial<Omit<CheckboxData, \"type\">> = {};\n\n public setCustomId(customId: string): this {\n assertString(customId, \"customId\", 100);\n this.#data.custom_id = customId;\n return this;\n }\n\n public setDefault(isDefault = true): this {\n this.#data.default = isDefault;\n return this;\n }\n\n public toJSON(): CheckboxData {\n if (this.#data.custom_id === undefined) throw new TypeError(\"customId must be set\");\n return frozen({ type: ComponentType.Checkbox, ...this.#data } as CheckboxData);\n }\n}\n\nexport interface LabelData {\n type: ComponentType.Label;\n label: string;\n description?: string;\n component: TextInputData | StringSelectMenuData | EntitySelectMenuData | FileUploadData\n | RadioGroupData | CheckboxGroupData | CheckboxData;\n}\n\nexport class LabelBuilder implements ComponentBuilder<LabelData> {\n readonly #data: Partial<Omit<LabelData, \"type\">> = {};\n\n public setLabel(label: string): this {\n assertString(label, \"label\", 45);\n this.#data.label = label;\n return this;\n }\n\n public setDescription(description: string): this {\n assertString(description, \"description\", 100);\n this.#data.description = description;\n return this;\n }\n\n public setComponent(component: LabelData[\"component\"] | ComponentBuilder<LabelData[\"component\"]>): this {\n this.#data.component = jsonOf(component);\n return this;\n }\n\n public toJSON(): LabelData {\n if (this.#data.label === undefined) throw new TypeError(\"label must be set\");\n if (this.#data.component === undefined) throw new TypeError(\"component must be set\");\n return frozen({ type: ComponentType.Label, ...this.#data } as LabelData);\n }\n}\n\nexport type ActionRowChild = ButtonData | StringSelectMenuData | EntitySelectMenuData | TextInputData;\n\nexport interface ActionRowData {\n type: ComponentType.ActionRow;\n components: readonly ActionRowChild[];\n}\n\nexport class ActionRowBuilder implements ComponentBuilder<ActionRowData> {\n readonly #components: ActionRowChild[] = [];\n\n public addComponents(...components: Array<ActionRowChild | ComponentBuilder<ActionRowChild>>): this {\n const next = [...this.#components, ...components.map((component) => jsonOf(component))];\n if (next.length > 5) throw new RangeError(\"action rows support at most 5 components\");\n if (next.some((component) => component.type !== ComponentType.Button) && next.length > 1) {\n throw new TypeError(\"select menus and text inputs must be the only component in an action row\");\n }\n this.#components.push(...next.slice(this.#components.length));\n return this;\n }\n\n public toJSON(): ActionRowData {\n if (this.#components.length === 0) throw new TypeError(\"at least one component must be set\");\n return frozen({ type: ComponentType.ActionRow, components: Object.freeze([...this.#components]) });\n }\n}\n\nexport interface ModalData {\n custom_id: string;\n title: string;\n components: readonly (ActionRowData | LabelData | TextDisplayData)[];\n}\n\nexport class ModalBuilder implements ComponentBuilder<ModalData> {\n readonly #data: Partial<Omit<ModalData, \"components\">> = {};\n readonly #components: Array<ActionRowData | LabelData | TextDisplayData> = [];\n\n public setCustomId(customId: string): this {\n assertString(customId, \"customId\", 100);\n this.#data.custom_id = customId;\n return this;\n }\n\n public setTitle(title: string): this {\n assertString(title, \"title\", 45);\n this.#data.title = title;\n return this;\n }\n\n public addComponents(\n ...components: Array<ActionRowData | LabelData | TextDisplayData | ComponentBuilder<ActionRowData | LabelData | TextDisplayData>>\n ): this {\n if (this.#components.length + components.length > 5) throw new RangeError(\"modals support at most 5 components\");\n this.#components.push(...components.map((component) => jsonOf(component)));\n return this;\n }\n\n public toJSON(): ModalData {\n if (this.#data.custom_id === undefined) throw new TypeError(\"customId must be set\");\n if (this.#data.title === undefined) throw new TypeError(\"title must be set\");\n if (this.#components.length === 0) throw new TypeError(\"at least one component must be set\");\n return frozen({ ...this.#data, components: Object.freeze([...this.#components]) } as ModalData);\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "mini-interactions-builders",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "sideEffects": false,
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ },
14
+ "./package.json": "./package.json"
15
+ },
16
+ "scripts": {
17
+ "build": "tsup",
18
+ "dev": "tsup --watch",
19
+ "typecheck": "tsc --noEmit",
20
+ "test": "vitest run",
21
+ "clean": "rm -rf dist"
22
+ }
23
+ }