@magicyan/discord 1.6.0 → 1.6.1

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.
@@ -6,7 +6,18 @@ const discord_js = require('discord.js');
6
6
  function modalFieldsToRecord(data, parse) {
7
7
  const collection = "fields" in data ? "fields" in data.fields ? data.fields.fields : data.fields : data;
8
8
  const record = collection.reduce((acc, data2) => {
9
- acc[data2.customId] = data2.type === discord_js.ComponentType.TextInput ? data2.value : Array.from(data2.values ?? []);
9
+ if (data2.type === discord_js.ComponentType.TextInput) {
10
+ acc[data2.customId] = data2.value;
11
+ return acc;
12
+ }
13
+ if (data2.type === discord_js.ComponentType.FileUpload) {
14
+ const attachments = data2.attachments;
15
+ acc[data2.customId] = Array.from(
16
+ attachments.mapValues((data3) => data3.url).values()
17
+ );
18
+ return acc;
19
+ }
20
+ acc[data2.customId] = Array.from(data2.values ?? []);
10
21
  return acc;
11
22
  }, {});
12
23
  return parse ? parse(record) : record;
@@ -4,7 +4,18 @@ import { ComponentType } from 'discord.js';
4
4
  function modalFieldsToRecord(data, parse) {
5
5
  const collection = "fields" in data ? "fields" in data.fields ? data.fields.fields : data.fields : data;
6
6
  const record = collection.reduce((acc, data2) => {
7
- acc[data2.customId] = data2.type === ComponentType.TextInput ? data2.value : Array.from(data2.values ?? []);
7
+ if (data2.type === ComponentType.TextInput) {
8
+ acc[data2.customId] = data2.value;
9
+ return acc;
10
+ }
11
+ if (data2.type === ComponentType.FileUpload) {
12
+ const attachments = data2.attachments;
13
+ acc[data2.customId] = Array.from(
14
+ attachments.mapValues((data3) => data3.url).values()
15
+ );
16
+ return acc;
17
+ }
18
+ acc[data2.customId] = Array.from(data2.values ?? []);
8
19
  return acc;
9
20
  }, {});
10
21
  return parse ? parse(record) : record;
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ const discord_js = require('discord.js');
4
+
5
+ function createFileUpload(arg) {
6
+ if (typeof arg === "string")
7
+ return new discord_js.FileUploadBuilder({
8
+ custom_id: arg
9
+ });
10
+ const { customId, maxValues, minValues, ...data } = arg;
11
+ return new discord_js.FileUploadBuilder({
12
+ custom_id: customId,
13
+ max_values: maxValues,
14
+ min_values: minValues,
15
+ ...data
16
+ });
17
+ }
18
+
19
+ exports.createFileUpload = createFileUpload;
@@ -0,0 +1,17 @@
1
+ import { FileUploadBuilder } from 'discord.js';
2
+
3
+ function createFileUpload(arg) {
4
+ if (typeof arg === "string")
5
+ return new FileUploadBuilder({
6
+ custom_id: arg
7
+ });
8
+ const { customId, maxValues, minValues, ...data } = arg;
9
+ return new FileUploadBuilder({
10
+ custom_id: customId,
11
+ max_values: maxValues,
12
+ min_values: minValues,
13
+ ...data
14
+ });
15
+ }
16
+
17
+ export { createFileUpload };
package/dist/index.cjs CHANGED
@@ -27,6 +27,7 @@ const separator$1 = require('./functions/components/separator.cjs');
27
27
  const text = require('./functions/components/text.cjs');
28
28
  const thumbarea = require('./functions/components/thumbarea.cjs');
29
29
  const thumbnail = require('./functions/components/thumbnail.cjs');
30
+ const upload = require('./functions/components/upload.cjs');
30
31
  const assets = require('./functions/embeds/assets.cjs');
31
32
  const author = require('./functions/embeds/author.cjs');
32
33
  const embedplus = require('./functions/embeds/embedplus.cjs');
@@ -84,6 +85,7 @@ exports.createSeparator = separator$1.createSeparator;
84
85
  exports.createTextDisplay = text.createTextDisplay;
85
86
  exports.createThumbArea = thumbarea.createThumbArea;
86
87
  exports.createThumbnail = thumbnail.createThumbnail;
88
+ exports.createFileUpload = upload.createFileUpload;
87
89
  exports.createEmbedAsset = assets.createEmbedAsset;
88
90
  exports.createEmbedAuthor = author.createEmbedAuthor;
89
91
  exports.EmbedPlusBuilder = embedplus.EmbedPlusBuilder;
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as discord_js from 'discord.js';
2
- import { GatewayIntentBits, Partials, ChannelType, Guild, CommandInteractionOption, Client, ApplicationCommand, GuildEmoji, GuildMember, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, ComponentEmojiResolvable, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, Attachment, AttachmentBuilder, MessageActionRowComponentBuilder, TextDisplayBuilder, SeparatorBuilder, FileBuilder, SectionBuilder, MediaGalleryBuilder, ContainerBuilder, ContainerComponentBuilder as ContainerComponentBuilder$1, ColorResolvable, ComponentType, ContainerComponentData, ContainerComponent, APIUnfurledMediaItem, MediaGalleryItemData, TextInputBuilder, TextInputComponentData, TextInputStyle, LabelBuilderData, LabelBuilder, Collection, ModalData, LabelComponentData, TextDisplayComponentData, AnyComponentBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, EmbedAssetData, User, ClientUser, ImageURLOptions, EmbedFooterData, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, MediaGalleryItemBuilder, ModalBuilder, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
2
+ import { GatewayIntentBits, Partials, ChannelType, Guild, CommandInteractionOption, Client, ApplicationCommand, GuildEmoji, GuildMember, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, ComponentEmojiResolvable, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, Attachment, AttachmentBuilder, MessageActionRowComponentBuilder, TextDisplayBuilder, SeparatorBuilder, FileBuilder, SectionBuilder, MediaGalleryBuilder, ContainerBuilder, ContainerComponentBuilder as ContainerComponentBuilder$1, ColorResolvable, ComponentType, ContainerComponentData, ContainerComponent, APIUnfurledMediaItem, MediaGalleryItemData, TextInputBuilder, TextInputComponentData, TextInputStyle, LabelBuilderData, LabelBuilder, Collection, ModalData, LabelComponentData, TextDisplayComponentData, AnyComponentBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, FileUploadBuilder, EmbedAssetData, User, ClientUser, ImageURLOptions, EmbedFooterData, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, MediaGalleryItemBuilder, ModalBuilder, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
3
3
  export * from '@magicyan/core';
4
4
 
5
5
  declare const chars: {
@@ -437,8 +437,38 @@ type ResolveModalData = {
437
437
  fields: Collection<string, ModalData>;
438
438
  } | Collection<string, ModalData>;
439
439
  type ModalFieldsRecord = Record<string, string | string[]>;
440
- declare function modalFieldsToRecord<T = ModalFieldsRecord>(data: ResolveModalData): ModalFieldsRecord;
441
- declare function modalFieldsToRecord<T = ModalFieldsRecord>(data: ResolveModalData, parse: (record: ModalFieldsRecord) => T): T;
440
+ /**
441
+ * Converts modal submitted fields into a plain record object, mapping each component `customId` to its value.
442
+ *
443
+ * This function supports multiple modal submission data shapes coming from Discord.js,
444
+ * automatically extracting and normalizing values from:
445
+ * - Text input fields (`ComponentType.TextInput`) → string
446
+ * - Select menus & other multi-value components → string[]
447
+ * - File upload fields (`ComponentType.FileUpload`) → string[] of attachment URLs
448
+ *
449
+ * Optionally, a parser callback may be provided to transform the resulting record before returning it.
450
+ *
451
+ * @template T The expected return type after optional parsing.
452
+ * @param {ResolveModalData} data - The modal submission data, usually from an interaction.
453
+ * @param {(record: ModalFieldsRecord) => T} [parse] - Optional transform function applied to the resulting record.
454
+ * @returns {ModalFieldsRecord | T} The processed fields as a record, or the parser result if provided.
455
+ *
456
+ * @example
457
+ * ```ts
458
+ * const fields = modalFieldsToRecord(interaction.fields);
459
+ * console.log(fields.username); // "JohnDoe"
460
+ * ```
461
+ *
462
+ * @example With parsing
463
+ * ```ts
464
+ * const result = modalFieldsToRecord(interaction.fields, fields => ({
465
+ * name: fields.username.trim(),
466
+ * age: Number.parseInt(fields.age),
467
+ * }));
468
+ * ```
469
+ */
470
+ declare function modalFieldsToRecord<const T = ModalFieldsRecord>(data: ResolveModalData): T;
471
+ declare function modalFieldsToRecord<const T = ModalFieldsRecord>(data: ResolveModalData, parse: (record: ModalFieldsRecord) => T): T;
442
472
  type ModalFields = (LabelComponentData | TextDisplayComponentData)[];
443
473
  declare function createModalFields(...components: ModalComponents[]): ModalFields;
444
474
 
@@ -688,6 +718,16 @@ type ThumbAreaData = {
688
718
  declare function createThumbArea(content: string, thumbnail?: ThumbAreaThumbnail): SectionBuilder | TextDisplayBuilder;
689
719
  declare function createThumbArea(data: ThumbAreaData): SectionBuilder | TextDisplayBuilder;
690
720
 
721
+ interface FileUploadData {
722
+ customId?: string;
723
+ minValues?: number;
724
+ maxValues?: number;
725
+ required?: boolean;
726
+ id?: number;
727
+ }
728
+ declare function createFileUpload(data: FileUploadData): FileUploadBuilder;
729
+ declare function createFileUpload(customId: string): FileUploadBuilder;
730
+
691
731
  type EmbedPlusAssetData = string | Attachment | AttachmentBuilder | EmbedAssetData | undefined | null;
692
732
  type EmbedAssetOptions = Omit<EmbedAssetData, "url">;
693
733
  declare function createEmbedAsset(source: EmbedPlusAssetData, options?: EmbedAssetOptions): EmbedAssetData | undefined;
@@ -1095,5 +1135,5 @@ declare function isTextInputBuilder(value: unknown): value is TextInputBuilder;
1095
1135
  */
1096
1136
  declare function isMessage(value: unknown): value is Message;
1097
1137
 
1098
- export { ContainerPlusBuilder, CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createLabel, createLinkButton, createMediaGallery, createModalFields, createModalInput, createRow, createSection, createSeparator, createTextDisplay, createTextInput, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, fetchMessageFromURL, findChannel, findCommand, findEmoji, findMember, findMessage, findRole, getChannelUrlInfo, getMessageURLInfo, isActionRowBuilder, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, isChannelSelectMenuBuilder, isContainerBuilder, isMediaGalleryBuilder, isMediaGalleryItemBuilder, isMentionableSelectMenuBuilder, isMessage, isModalBuilder, isRoleSelectMenuBuilder, isSectionBuilder, isSeparatorBuilder, isStringSelectMenuBuilder, isTextDisplayBuilder, isTextInputBuilder, isUserSelectMenuBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
1099
- export type { AnyEmbedData, AnySelectMenuBuilder, ComponentBuildersData, ComponentData, ComponentInLabelBuilder, ContainerColor, ContainerComponentBuilder, ContainerData, ContainerInComponentType, CreateComponentData, CreateLabelData, EmbedPlusAssetData, EmbedPlusAuthorData, EmbedPlusColorData, EmbedPlusData, EmbedPlusFooterData, EmbedPlusProperty, MagicComponentData, MediaGallerySource, SectionAccessory, SectionAccessoryData, SectionButtonAccessory, SectionData, SectionThumbnailAccessory, SeparatorData, ThumbAreaData, ThumbAreaThumbnail, ThumbnailData };
1138
+ export { ContainerPlusBuilder, CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createFileUpload, createLabel, createLinkButton, createMediaGallery, createModalFields, createModalInput, createRow, createSection, createSeparator, createTextDisplay, createTextInput, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, fetchMessageFromURL, findChannel, findCommand, findEmoji, findMember, findMessage, findRole, getChannelUrlInfo, getMessageURLInfo, isActionRowBuilder, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, isChannelSelectMenuBuilder, isContainerBuilder, isMediaGalleryBuilder, isMediaGalleryItemBuilder, isMentionableSelectMenuBuilder, isMessage, isModalBuilder, isRoleSelectMenuBuilder, isSectionBuilder, isSeparatorBuilder, isStringSelectMenuBuilder, isTextDisplayBuilder, isTextInputBuilder, isUserSelectMenuBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
1139
+ export type { AnyEmbedData, AnySelectMenuBuilder, ComponentBuildersData, ComponentData, ComponentInLabelBuilder, ContainerColor, ContainerComponentBuilder, ContainerData, ContainerInComponentType, CreateComponentData, CreateLabelData, EmbedPlusAssetData, EmbedPlusAuthorData, EmbedPlusColorData, EmbedPlusData, EmbedPlusFooterData, EmbedPlusProperty, FileUploadData, MagicComponentData, MediaGallerySource, SectionAccessory, SectionAccessoryData, SectionButtonAccessory, SectionData, SectionThumbnailAccessory, SeparatorData, ThumbAreaData, ThumbAreaThumbnail, ThumbnailData };
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as discord_js from 'discord.js';
2
- import { GatewayIntentBits, Partials, ChannelType, Guild, CommandInteractionOption, Client, ApplicationCommand, GuildEmoji, GuildMember, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, ComponentEmojiResolvable, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, Attachment, AttachmentBuilder, MessageActionRowComponentBuilder, TextDisplayBuilder, SeparatorBuilder, FileBuilder, SectionBuilder, MediaGalleryBuilder, ContainerBuilder, ContainerComponentBuilder as ContainerComponentBuilder$1, ColorResolvable, ComponentType, ContainerComponentData, ContainerComponent, APIUnfurledMediaItem, MediaGalleryItemData, TextInputBuilder, TextInputComponentData, TextInputStyle, LabelBuilderData, LabelBuilder, Collection, ModalData, LabelComponentData, TextDisplayComponentData, AnyComponentBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, EmbedAssetData, User, ClientUser, ImageURLOptions, EmbedFooterData, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, MediaGalleryItemBuilder, ModalBuilder, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
2
+ import { GatewayIntentBits, Partials, ChannelType, Guild, CommandInteractionOption, Client, ApplicationCommand, GuildEmoji, GuildMember, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, ComponentEmojiResolvable, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, Attachment, AttachmentBuilder, MessageActionRowComponentBuilder, TextDisplayBuilder, SeparatorBuilder, FileBuilder, SectionBuilder, MediaGalleryBuilder, ContainerBuilder, ContainerComponentBuilder as ContainerComponentBuilder$1, ColorResolvable, ComponentType, ContainerComponentData, ContainerComponent, APIUnfurledMediaItem, MediaGalleryItemData, TextInputBuilder, TextInputComponentData, TextInputStyle, LabelBuilderData, LabelBuilder, Collection, ModalData, LabelComponentData, TextDisplayComponentData, AnyComponentBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, FileUploadBuilder, EmbedAssetData, User, ClientUser, ImageURLOptions, EmbedFooterData, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, MediaGalleryItemBuilder, ModalBuilder, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
3
3
  export * from '@magicyan/core';
4
4
 
5
5
  declare const chars: {
@@ -437,8 +437,38 @@ type ResolveModalData = {
437
437
  fields: Collection<string, ModalData>;
438
438
  } | Collection<string, ModalData>;
439
439
  type ModalFieldsRecord = Record<string, string | string[]>;
440
- declare function modalFieldsToRecord<T = ModalFieldsRecord>(data: ResolveModalData): ModalFieldsRecord;
441
- declare function modalFieldsToRecord<T = ModalFieldsRecord>(data: ResolveModalData, parse: (record: ModalFieldsRecord) => T): T;
440
+ /**
441
+ * Converts modal submitted fields into a plain record object, mapping each component `customId` to its value.
442
+ *
443
+ * This function supports multiple modal submission data shapes coming from Discord.js,
444
+ * automatically extracting and normalizing values from:
445
+ * - Text input fields (`ComponentType.TextInput`) → string
446
+ * - Select menus & other multi-value components → string[]
447
+ * - File upload fields (`ComponentType.FileUpload`) → string[] of attachment URLs
448
+ *
449
+ * Optionally, a parser callback may be provided to transform the resulting record before returning it.
450
+ *
451
+ * @template T The expected return type after optional parsing.
452
+ * @param {ResolveModalData} data - The modal submission data, usually from an interaction.
453
+ * @param {(record: ModalFieldsRecord) => T} [parse] - Optional transform function applied to the resulting record.
454
+ * @returns {ModalFieldsRecord | T} The processed fields as a record, or the parser result if provided.
455
+ *
456
+ * @example
457
+ * ```ts
458
+ * const fields = modalFieldsToRecord(interaction.fields);
459
+ * console.log(fields.username); // "JohnDoe"
460
+ * ```
461
+ *
462
+ * @example With parsing
463
+ * ```ts
464
+ * const result = modalFieldsToRecord(interaction.fields, fields => ({
465
+ * name: fields.username.trim(),
466
+ * age: Number.parseInt(fields.age),
467
+ * }));
468
+ * ```
469
+ */
470
+ declare function modalFieldsToRecord<const T = ModalFieldsRecord>(data: ResolveModalData): T;
471
+ declare function modalFieldsToRecord<const T = ModalFieldsRecord>(data: ResolveModalData, parse: (record: ModalFieldsRecord) => T): T;
442
472
  type ModalFields = (LabelComponentData | TextDisplayComponentData)[];
443
473
  declare function createModalFields(...components: ModalComponents[]): ModalFields;
444
474
 
@@ -688,6 +718,16 @@ type ThumbAreaData = {
688
718
  declare function createThumbArea(content: string, thumbnail?: ThumbAreaThumbnail): SectionBuilder | TextDisplayBuilder;
689
719
  declare function createThumbArea(data: ThumbAreaData): SectionBuilder | TextDisplayBuilder;
690
720
 
721
+ interface FileUploadData {
722
+ customId?: string;
723
+ minValues?: number;
724
+ maxValues?: number;
725
+ required?: boolean;
726
+ id?: number;
727
+ }
728
+ declare function createFileUpload(data: FileUploadData): FileUploadBuilder;
729
+ declare function createFileUpload(customId: string): FileUploadBuilder;
730
+
691
731
  type EmbedPlusAssetData = string | Attachment | AttachmentBuilder | EmbedAssetData | undefined | null;
692
732
  type EmbedAssetOptions = Omit<EmbedAssetData, "url">;
693
733
  declare function createEmbedAsset(source: EmbedPlusAssetData, options?: EmbedAssetOptions): EmbedAssetData | undefined;
@@ -1095,5 +1135,5 @@ declare function isTextInputBuilder(value: unknown): value is TextInputBuilder;
1095
1135
  */
1096
1136
  declare function isMessage(value: unknown): value is Message;
1097
1137
 
1098
- export { ContainerPlusBuilder, CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createLabel, createLinkButton, createMediaGallery, createModalFields, createModalInput, createRow, createSection, createSeparator, createTextDisplay, createTextInput, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, fetchMessageFromURL, findChannel, findCommand, findEmoji, findMember, findMessage, findRole, getChannelUrlInfo, getMessageURLInfo, isActionRowBuilder, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, isChannelSelectMenuBuilder, isContainerBuilder, isMediaGalleryBuilder, isMediaGalleryItemBuilder, isMentionableSelectMenuBuilder, isMessage, isModalBuilder, isRoleSelectMenuBuilder, isSectionBuilder, isSeparatorBuilder, isStringSelectMenuBuilder, isTextDisplayBuilder, isTextInputBuilder, isUserSelectMenuBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
1099
- export type { AnyEmbedData, AnySelectMenuBuilder, ComponentBuildersData, ComponentData, ComponentInLabelBuilder, ContainerColor, ContainerComponentBuilder, ContainerData, ContainerInComponentType, CreateComponentData, CreateLabelData, EmbedPlusAssetData, EmbedPlusAuthorData, EmbedPlusColorData, EmbedPlusData, EmbedPlusFooterData, EmbedPlusProperty, MagicComponentData, MediaGallerySource, SectionAccessory, SectionAccessoryData, SectionButtonAccessory, SectionData, SectionThumbnailAccessory, SeparatorData, ThumbAreaData, ThumbAreaThumbnail, ThumbnailData };
1138
+ export { ContainerPlusBuilder, CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createFileUpload, createLabel, createLinkButton, createMediaGallery, createModalFields, createModalInput, createRow, createSection, createSeparator, createTextDisplay, createTextInput, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, fetchMessageFromURL, findChannel, findCommand, findEmoji, findMember, findMessage, findRole, getChannelUrlInfo, getMessageURLInfo, isActionRowBuilder, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, isChannelSelectMenuBuilder, isContainerBuilder, isMediaGalleryBuilder, isMediaGalleryItemBuilder, isMentionableSelectMenuBuilder, isMessage, isModalBuilder, isRoleSelectMenuBuilder, isSectionBuilder, isSeparatorBuilder, isStringSelectMenuBuilder, isTextDisplayBuilder, isTextInputBuilder, isUserSelectMenuBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
1139
+ export type { AnyEmbedData, AnySelectMenuBuilder, ComponentBuildersData, ComponentData, ComponentInLabelBuilder, ContainerColor, ContainerComponentBuilder, ContainerData, ContainerInComponentType, CreateComponentData, CreateLabelData, EmbedPlusAssetData, EmbedPlusAuthorData, EmbedPlusColorData, EmbedPlusData, EmbedPlusFooterData, EmbedPlusProperty, FileUploadData, MagicComponentData, MediaGallerySource, SectionAccessory, SectionAccessoryData, SectionButtonAccessory, SectionData, SectionThumbnailAccessory, SeparatorData, ThumbAreaData, ThumbAreaThumbnail, ThumbnailData };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as discord_js from 'discord.js';
2
- import { GatewayIntentBits, Partials, ChannelType, Guild, CommandInteractionOption, Client, ApplicationCommand, GuildEmoji, GuildMember, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, ComponentEmojiResolvable, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, Attachment, AttachmentBuilder, MessageActionRowComponentBuilder, TextDisplayBuilder, SeparatorBuilder, FileBuilder, SectionBuilder, MediaGalleryBuilder, ContainerBuilder, ContainerComponentBuilder as ContainerComponentBuilder$1, ColorResolvable, ComponentType, ContainerComponentData, ContainerComponent, APIUnfurledMediaItem, MediaGalleryItemData, TextInputBuilder, TextInputComponentData, TextInputStyle, LabelBuilderData, LabelBuilder, Collection, ModalData, LabelComponentData, TextDisplayComponentData, AnyComponentBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, EmbedAssetData, User, ClientUser, ImageURLOptions, EmbedFooterData, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, MediaGalleryItemBuilder, ModalBuilder, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
2
+ import { GatewayIntentBits, Partials, ChannelType, Guild, CommandInteractionOption, Client, ApplicationCommand, GuildEmoji, GuildMember, GuildTextBasedChannel, Message, Role, WebhookClientOptions, WebhookClient, WebhookClientData, ComponentEmojiResolvable, ButtonBuilder, ActionRowBuilder, LinkButtonComponentData, Attachment, AttachmentBuilder, MessageActionRowComponentBuilder, TextDisplayBuilder, SeparatorBuilder, FileBuilder, SectionBuilder, MediaGalleryBuilder, ContainerBuilder, ContainerComponentBuilder as ContainerComponentBuilder$1, ColorResolvable, ComponentType, ContainerComponentData, ContainerComponent, APIUnfurledMediaItem, MediaGalleryItemData, TextInputBuilder, TextInputComponentData, TextInputStyle, LabelBuilderData, LabelBuilder, Collection, ModalData, LabelComponentData, TextDisplayComponentData, AnyComponentBuilder, ThumbnailComponentData, ThumbnailBuilder, ButtonComponentData, FileUploadBuilder, EmbedAssetData, User, ClientUser, ImageURLOptions, EmbedFooterData, APIEmbed, Embed, EmbedData, EmbedBuilder, AttachmentData, MediaGalleryItemBuilder, ModalBuilder, StringSelectMenuBuilder, UserSelectMenuBuilder, RoleSelectMenuBuilder, ChannelSelectMenuBuilder, MentionableSelectMenuBuilder } from 'discord.js';
3
3
  export * from '@magicyan/core';
4
4
 
5
5
  declare const chars: {
@@ -437,8 +437,38 @@ type ResolveModalData = {
437
437
  fields: Collection<string, ModalData>;
438
438
  } | Collection<string, ModalData>;
439
439
  type ModalFieldsRecord = Record<string, string | string[]>;
440
- declare function modalFieldsToRecord<T = ModalFieldsRecord>(data: ResolveModalData): ModalFieldsRecord;
441
- declare function modalFieldsToRecord<T = ModalFieldsRecord>(data: ResolveModalData, parse: (record: ModalFieldsRecord) => T): T;
440
+ /**
441
+ * Converts modal submitted fields into a plain record object, mapping each component `customId` to its value.
442
+ *
443
+ * This function supports multiple modal submission data shapes coming from Discord.js,
444
+ * automatically extracting and normalizing values from:
445
+ * - Text input fields (`ComponentType.TextInput`) → string
446
+ * - Select menus & other multi-value components → string[]
447
+ * - File upload fields (`ComponentType.FileUpload`) → string[] of attachment URLs
448
+ *
449
+ * Optionally, a parser callback may be provided to transform the resulting record before returning it.
450
+ *
451
+ * @template T The expected return type after optional parsing.
452
+ * @param {ResolveModalData} data - The modal submission data, usually from an interaction.
453
+ * @param {(record: ModalFieldsRecord) => T} [parse] - Optional transform function applied to the resulting record.
454
+ * @returns {ModalFieldsRecord | T} The processed fields as a record, or the parser result if provided.
455
+ *
456
+ * @example
457
+ * ```ts
458
+ * const fields = modalFieldsToRecord(interaction.fields);
459
+ * console.log(fields.username); // "JohnDoe"
460
+ * ```
461
+ *
462
+ * @example With parsing
463
+ * ```ts
464
+ * const result = modalFieldsToRecord(interaction.fields, fields => ({
465
+ * name: fields.username.trim(),
466
+ * age: Number.parseInt(fields.age),
467
+ * }));
468
+ * ```
469
+ */
470
+ declare function modalFieldsToRecord<const T = ModalFieldsRecord>(data: ResolveModalData): T;
471
+ declare function modalFieldsToRecord<const T = ModalFieldsRecord>(data: ResolveModalData, parse: (record: ModalFieldsRecord) => T): T;
442
472
  type ModalFields = (LabelComponentData | TextDisplayComponentData)[];
443
473
  declare function createModalFields(...components: ModalComponents[]): ModalFields;
444
474
 
@@ -688,6 +718,16 @@ type ThumbAreaData = {
688
718
  declare function createThumbArea(content: string, thumbnail?: ThumbAreaThumbnail): SectionBuilder | TextDisplayBuilder;
689
719
  declare function createThumbArea(data: ThumbAreaData): SectionBuilder | TextDisplayBuilder;
690
720
 
721
+ interface FileUploadData {
722
+ customId?: string;
723
+ minValues?: number;
724
+ maxValues?: number;
725
+ required?: boolean;
726
+ id?: number;
727
+ }
728
+ declare function createFileUpload(data: FileUploadData): FileUploadBuilder;
729
+ declare function createFileUpload(customId: string): FileUploadBuilder;
730
+
691
731
  type EmbedPlusAssetData = string | Attachment | AttachmentBuilder | EmbedAssetData | undefined | null;
692
732
  type EmbedAssetOptions = Omit<EmbedAssetData, "url">;
693
733
  declare function createEmbedAsset(source: EmbedPlusAssetData, options?: EmbedAssetOptions): EmbedAssetData | undefined;
@@ -1095,5 +1135,5 @@ declare function isTextInputBuilder(value: unknown): value is TextInputBuilder;
1095
1135
  */
1096
1136
  declare function isMessage(value: unknown): value is Message;
1097
1137
 
1098
- export { ContainerPlusBuilder, CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createLabel, createLinkButton, createMediaGallery, createModalFields, createModalInput, createRow, createSection, createSeparator, createTextDisplay, createTextInput, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, fetchMessageFromURL, findChannel, findCommand, findEmoji, findMember, findMessage, findRole, getChannelUrlInfo, getMessageURLInfo, isActionRowBuilder, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, isChannelSelectMenuBuilder, isContainerBuilder, isMediaGalleryBuilder, isMediaGalleryItemBuilder, isMentionableSelectMenuBuilder, isMessage, isModalBuilder, isRoleSelectMenuBuilder, isSectionBuilder, isSeparatorBuilder, isStringSelectMenuBuilder, isTextDisplayBuilder, isTextInputBuilder, isUserSelectMenuBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
1099
- export type { AnyEmbedData, AnySelectMenuBuilder, ComponentBuildersData, ComponentData, ComponentInLabelBuilder, ContainerColor, ContainerComponentBuilder, ContainerData, ContainerInComponentType, CreateComponentData, CreateLabelData, EmbedPlusAssetData, EmbedPlusAuthorData, EmbedPlusColorData, EmbedPlusData, EmbedPlusFooterData, EmbedPlusProperty, MagicComponentData, MediaGallerySource, SectionAccessory, SectionAccessoryData, SectionButtonAccessory, SectionData, SectionThumbnailAccessory, SeparatorData, ThumbAreaData, ThumbAreaThumbnail, ThumbnailData };
1138
+ export { ContainerPlusBuilder, CustomItents, CustomPartials, EmbedLimit, EmbedPlusBuilder, Separator, chars, commandMention, createComponents, createContainer, createEmbed, createEmbedAsset, createEmbedAuthor, createEmbedFiles, createEmbedFooter, createFile, createFileUpload, createLabel, createLinkButton, createMediaGallery, createModalFields, createModalInput, createRow, createSection, createSeparator, createTextDisplay, createTextInput, createThumbArea, createThumbnail, createWebhookClient, extractMentionId, fetchMessageFromURL, findChannel, findCommand, findEmoji, findMember, findMessage, findRole, getChannelUrlInfo, getMessageURLInfo, isActionRowBuilder, isAnySelectMenuBuilder, isAttachment, isButtonBuilder, isChannelSelectMenuBuilder, isContainerBuilder, isMediaGalleryBuilder, isMediaGalleryItemBuilder, isMentionableSelectMenuBuilder, isMessage, isModalBuilder, isRoleSelectMenuBuilder, isSectionBuilder, isSeparatorBuilder, isStringSelectMenuBuilder, isTextDisplayBuilder, isTextInputBuilder, isUserSelectMenuBuilder, modalFieldsToRecord, setMobileStatus, wrapButtons };
1139
+ export type { AnyEmbedData, AnySelectMenuBuilder, ComponentBuildersData, ComponentData, ComponentInLabelBuilder, ContainerColor, ContainerComponentBuilder, ContainerData, ContainerInComponentType, CreateComponentData, CreateLabelData, EmbedPlusAssetData, EmbedPlusAuthorData, EmbedPlusColorData, EmbedPlusData, EmbedPlusFooterData, EmbedPlusProperty, FileUploadData, MagicComponentData, MediaGallerySource, SectionAccessory, SectionAccessoryData, SectionButtonAccessory, SectionData, SectionThumbnailAccessory, SeparatorData, ThumbAreaData, ThumbAreaThumbnail, ThumbnailData };
package/dist/index.mjs CHANGED
@@ -25,6 +25,7 @@ export { createSeparator } from './functions/components/separator.mjs';
25
25
  export { createTextDisplay } from './functions/components/text.mjs';
26
26
  export { createThumbArea } from './functions/components/thumbarea.mjs';
27
27
  export { createThumbnail } from './functions/components/thumbnail.mjs';
28
+ export { createFileUpload } from './functions/components/upload.mjs';
28
29
  export { createEmbedAsset } from './functions/embeds/assets.mjs';
29
30
  export { createEmbedAuthor } from './functions/embeds/author.mjs';
30
31
  export { EmbedPlusBuilder, createEmbed } from './functions/embeds/embedplus.mjs';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@magicyan/discord",
3
- "version": "1.6.0",
3
+ "version": "1.6.1",
4
4
  "description": "Simple functions to facilitate discord bot development",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -39,7 +39,7 @@
39
39
  "test": "vitest"
40
40
  },
41
41
  "peerDependencies": {
42
- "discord.js": "^14.23.2"
42
+ "discord.js": "^14.24.0"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@magicyan/config": "*",
@@ -49,6 +49,7 @@
49
49
  "vitest": "^2.1.9"
50
50
  },
51
51
  "dependencies": {
52
- "@magicyan/core": "^1.1.5"
52
+ "@magicyan/core": "^1.1.5",
53
+ "zod": "^4.1.12"
53
54
  }
54
55
  }