baff.js 0.0.0-stage → 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.
Files changed (262) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/LICENSE +7 -0
  3. package/README.md +244 -3
  4. package/dist/cjs/builders/EmbedBuilder.d.ts +51 -0
  5. package/dist/cjs/builders/EmbedBuilder.js +150 -0
  6. package/dist/cjs/builders/SlashCommandBuilder.d.ts +69 -0
  7. package/dist/cjs/builders/SlashCommandBuilder.js +185 -0
  8. package/dist/cjs/builders/components/ActionRowBuilder.d.ts +14 -0
  9. package/dist/cjs/builders/components/ActionRowBuilder.js +45 -0
  10. package/dist/cjs/builders/components/ButtonBuilder.d.ts +19 -0
  11. package/dist/cjs/builders/components/ButtonBuilder.js +69 -0
  12. package/dist/cjs/builders/components/LayoutBuilders.d.ts +63 -0
  13. package/dist/cjs/builders/components/LayoutBuilders.js +179 -0
  14. package/dist/cjs/builders/components/ModalBuilder.d.ts +36 -0
  15. package/dist/cjs/builders/components/ModalBuilder.js +118 -0
  16. package/dist/cjs/builders/components/SelectMenuBuilder.d.ts +80 -0
  17. package/dist/cjs/builders/components/SelectMenuBuilder.js +192 -0
  18. package/dist/cjs/builders/components/shared.d.ts +16 -0
  19. package/dist/cjs/builders/components/shared.js +32 -0
  20. package/dist/cjs/builders/messagePayload.d.ts +35 -0
  21. package/dist/cjs/builders/messagePayload.js +88 -0
  22. package/dist/cjs/builders/validate.d.ts +12 -0
  23. package/dist/cjs/builders/validate.js +54 -0
  24. package/dist/cjs/client/Client.d.ts +63 -0
  25. package/dist/cjs/client/Client.js +152 -0
  26. package/dist/cjs/client/dispatch.d.ts +2 -0
  27. package/dist/cjs/client/dispatch.js +224 -0
  28. package/dist/cjs/client/events.d.ts +129 -0
  29. package/dist/cjs/client/events.js +2 -0
  30. package/dist/cjs/collectors/Collector.d.ts +37 -0
  31. package/dist/cjs/collectors/Collector.js +84 -0
  32. package/dist/cjs/collectors/InteractionCollector.d.ts +21 -0
  33. package/dist/cjs/collectors/InteractionCollector.js +44 -0
  34. package/dist/cjs/collectors/MessageCollector.d.ts +14 -0
  35. package/dist/cjs/collectors/MessageCollector.js +23 -0
  36. package/dist/cjs/errors/BaffError.d.ts +26 -0
  37. package/dist/cjs/errors/BaffError.js +39 -0
  38. package/dist/cjs/gateway/Gateway.d.ts +53 -0
  39. package/dist/cjs/gateway/Gateway.js +128 -0
  40. package/dist/cjs/http/handler.d.ts +11 -0
  41. package/dist/cjs/http/handler.js +72 -0
  42. package/dist/cjs/http/verify.d.ts +11 -0
  43. package/dist/cjs/http/verify.js +28 -0
  44. package/dist/cjs/index.d.ts +51 -0
  45. package/dist/cjs/index.js +185 -0
  46. package/dist/cjs/managers/CachedManager.d.ts +16 -0
  47. package/dist/cjs/managers/CachedManager.js +18 -0
  48. package/dist/cjs/managers/ChannelManager.d.ts +23 -0
  49. package/dist/cjs/managers/ChannelManager.js +85 -0
  50. package/dist/cjs/managers/CommandManager.d.ts +32 -0
  51. package/dist/cjs/managers/CommandManager.js +72 -0
  52. package/dist/cjs/managers/EventManager.d.ts +15 -0
  53. package/dist/cjs/managers/EventManager.js +36 -0
  54. package/dist/cjs/managers/ExpressionManagers.d.ts +36 -0
  55. package/dist/cjs/managers/ExpressionManagers.js +73 -0
  56. package/dist/cjs/managers/InviteManager.d.ts +17 -0
  57. package/dist/cjs/managers/InviteManager.js +26 -0
  58. package/dist/cjs/managers/MemberManager.d.ts +31 -0
  59. package/dist/cjs/managers/MemberManager.js +62 -0
  60. package/dist/cjs/managers/MessageManager.d.ts +32 -0
  61. package/dist/cjs/managers/MessageManager.js +79 -0
  62. package/dist/cjs/managers/RoleManager.d.ts +22 -0
  63. package/dist/cjs/managers/RoleManager.js +73 -0
  64. package/dist/cjs/managers/ServerChannelManager.d.ts +20 -0
  65. package/dist/cjs/managers/ServerChannelManager.js +30 -0
  66. package/dist/cjs/managers/ServerManager.d.ts +12 -0
  67. package/dist/cjs/managers/ServerManager.js +62 -0
  68. package/dist/cjs/managers/ThreadManager.d.ts +12 -0
  69. package/dist/cjs/managers/ThreadManager.js +20 -0
  70. package/dist/cjs/managers/UserManager.d.ts +11 -0
  71. package/dist/cjs/managers/UserManager.js +38 -0
  72. package/dist/cjs/managers/VoiceManager.d.ts +8 -0
  73. package/dist/cjs/managers/VoiceManager.js +17 -0
  74. package/dist/cjs/package.json +1 -0
  75. package/dist/cjs/rest/REST.d.ts +58 -0
  76. package/dist/cjs/rest/REST.js +193 -0
  77. package/dist/cjs/rest/Routes.d.ts +54 -0
  78. package/dist/cjs/rest/Routes.js +58 -0
  79. package/dist/cjs/rest/files.d.ts +19 -0
  80. package/dist/cjs/rest/files.js +37 -0
  81. package/dist/cjs/structures/Base.d.ts +13 -0
  82. package/dist/cjs/structures/Base.js +30 -0
  83. package/dist/cjs/structures/Message.d.ts +91 -0
  84. package/dist/cjs/structures/Message.js +200 -0
  85. package/dist/cjs/structures/Role.d.ts +34 -0
  86. package/dist/cjs/structures/Role.js +84 -0
  87. package/dist/cjs/structures/ScheduledEvent.d.ts +37 -0
  88. package/dist/cjs/structures/ScheduledEvent.js +73 -0
  89. package/dist/cjs/structures/Server.d.ts +68 -0
  90. package/dist/cjs/structures/Server.js +124 -0
  91. package/dist/cjs/structures/ServerAssets.d.ts +48 -0
  92. package/dist/cjs/structures/ServerAssets.js +104 -0
  93. package/dist/cjs/structures/ServerMember.d.ts +47 -0
  94. package/dist/cjs/structures/ServerMember.js +138 -0
  95. package/dist/cjs/structures/User.d.ts +35 -0
  96. package/dist/cjs/structures/User.js +87 -0
  97. package/dist/cjs/structures/Webhook.d.ts +30 -0
  98. package/dist/cjs/structures/Webhook.js +68 -0
  99. package/dist/cjs/structures/channels/BaseChannel.d.ts +49 -0
  100. package/dist/cjs/structures/channels/BaseChannel.js +81 -0
  101. package/dist/cjs/structures/channels/DMChannel.d.ts +9 -0
  102. package/dist/cjs/structures/channels/DMChannel.js +21 -0
  103. package/dist/cjs/structures/channels/ServerChannels.d.ts +57 -0
  104. package/dist/cjs/structures/channels/ServerChannels.js +138 -0
  105. package/dist/cjs/structures/channels/TextBasedChannel.d.ts +25 -0
  106. package/dist/cjs/structures/channels/TextBasedChannel.js +53 -0
  107. package/dist/cjs/structures/interactions/BaseInteraction.d.ts +74 -0
  108. package/dist/cjs/structures/interactions/BaseInteraction.js +221 -0
  109. package/dist/cjs/structures/interactions/CommandInteraction.d.ts +44 -0
  110. package/dist/cjs/structures/interactions/CommandInteraction.js +109 -0
  111. package/dist/cjs/structures/interactions/ComponentInteraction.d.ts +44 -0
  112. package/dist/cjs/structures/interactions/ComponentInteraction.js +64 -0
  113. package/dist/cjs/structures/interactions/ModalSubmitInteraction.d.ts +29 -0
  114. package/dist/cjs/structures/interactions/ModalSubmitInteraction.js +42 -0
  115. package/dist/cjs/structures/interactions/createInteraction.d.ts +4 -0
  116. package/dist/cjs/structures/interactions/createInteraction.js +34 -0
  117. package/dist/cjs/types.d.ts +369 -0
  118. package/dist/cjs/types.js +2 -0
  119. package/dist/cjs/util/Collection.d.ts +32 -0
  120. package/dist/cjs/util/Collection.js +145 -0
  121. package/dist/cjs/util/Permissions.d.ts +87 -0
  122. package/dist/cjs/util/Permissions.js +113 -0
  123. package/dist/cjs/util/Snowflake.d.ts +20 -0
  124. package/dist/cjs/util/Snowflake.js +40 -0
  125. package/dist/cjs/util/TypedEmitter.d.ts +17 -0
  126. package/dist/cjs/util/TypedEmitter.js +5 -0
  127. package/dist/cjs/util/constants.d.ts +78 -0
  128. package/dist/cjs/util/constants.js +81 -0
  129. package/dist/cjs/util/emoji.d.ts +8 -0
  130. package/dist/cjs/util/emoji.js +10 -0
  131. package/dist/cjs/util/formatters.d.ts +29 -0
  132. package/dist/cjs/util/formatters.js +55 -0
  133. package/dist/esm/builders/EmbedBuilder.d.ts +51 -0
  134. package/dist/esm/builders/EmbedBuilder.js +145 -0
  135. package/dist/esm/builders/SlashCommandBuilder.d.ts +69 -0
  136. package/dist/esm/builders/SlashCommandBuilder.js +170 -0
  137. package/dist/esm/builders/components/ActionRowBuilder.d.ts +14 -0
  138. package/dist/esm/builders/components/ActionRowBuilder.js +41 -0
  139. package/dist/esm/builders/components/ButtonBuilder.d.ts +19 -0
  140. package/dist/esm/builders/components/ButtonBuilder.js +65 -0
  141. package/dist/esm/builders/components/LayoutBuilders.d.ts +63 -0
  142. package/dist/esm/builders/components/LayoutBuilders.js +169 -0
  143. package/dist/esm/builders/components/ModalBuilder.d.ts +36 -0
  144. package/dist/esm/builders/components/ModalBuilder.js +113 -0
  145. package/dist/esm/builders/components/SelectMenuBuilder.d.ts +80 -0
  146. package/dist/esm/builders/components/SelectMenuBuilder.js +183 -0
  147. package/dist/esm/builders/components/shared.d.ts +16 -0
  148. package/dist/esm/builders/components/shared.js +26 -0
  149. package/dist/esm/builders/messagePayload.d.ts +35 -0
  150. package/dist/esm/builders/messagePayload.js +83 -0
  151. package/dist/esm/builders/validate.d.ts +12 -0
  152. package/dist/esm/builders/validate.js +46 -0
  153. package/dist/esm/client/Client.d.ts +63 -0
  154. package/dist/esm/client/Client.js +147 -0
  155. package/dist/esm/client/dispatch.d.ts +2 -0
  156. package/dist/esm/client/dispatch.js +221 -0
  157. package/dist/esm/client/events.d.ts +129 -0
  158. package/dist/esm/client/events.js +1 -0
  159. package/dist/esm/collectors/Collector.d.ts +37 -0
  160. package/dist/esm/collectors/Collector.js +78 -0
  161. package/dist/esm/collectors/InteractionCollector.d.ts +21 -0
  162. package/dist/esm/collectors/InteractionCollector.js +40 -0
  163. package/dist/esm/collectors/MessageCollector.d.ts +14 -0
  164. package/dist/esm/collectors/MessageCollector.js +19 -0
  165. package/dist/esm/errors/BaffError.d.ts +26 -0
  166. package/dist/esm/errors/BaffError.js +33 -0
  167. package/dist/esm/gateway/Gateway.d.ts +53 -0
  168. package/dist/esm/gateway/Gateway.js +124 -0
  169. package/dist/esm/http/handler.d.ts +11 -0
  170. package/dist/esm/http/handler.js +68 -0
  171. package/dist/esm/http/verify.d.ts +11 -0
  172. package/dist/esm/http/verify.js +22 -0
  173. package/dist/esm/index.d.ts +51 -0
  174. package/dist/esm/index.js +49 -0
  175. package/dist/esm/managers/CachedManager.d.ts +16 -0
  176. package/dist/esm/managers/CachedManager.js +14 -0
  177. package/dist/esm/managers/ChannelManager.d.ts +23 -0
  178. package/dist/esm/managers/ChannelManager.js +81 -0
  179. package/dist/esm/managers/CommandManager.d.ts +32 -0
  180. package/dist/esm/managers/CommandManager.js +67 -0
  181. package/dist/esm/managers/EventManager.d.ts +15 -0
  182. package/dist/esm/managers/EventManager.js +32 -0
  183. package/dist/esm/managers/ExpressionManagers.d.ts +36 -0
  184. package/dist/esm/managers/ExpressionManagers.js +68 -0
  185. package/dist/esm/managers/InviteManager.d.ts +17 -0
  186. package/dist/esm/managers/InviteManager.js +22 -0
  187. package/dist/esm/managers/MemberManager.d.ts +31 -0
  188. package/dist/esm/managers/MemberManager.js +58 -0
  189. package/dist/esm/managers/MessageManager.d.ts +32 -0
  190. package/dist/esm/managers/MessageManager.js +75 -0
  191. package/dist/esm/managers/RoleManager.d.ts +22 -0
  192. package/dist/esm/managers/RoleManager.js +69 -0
  193. package/dist/esm/managers/ServerChannelManager.d.ts +20 -0
  194. package/dist/esm/managers/ServerChannelManager.js +26 -0
  195. package/dist/esm/managers/ServerManager.d.ts +12 -0
  196. package/dist/esm/managers/ServerManager.js +58 -0
  197. package/dist/esm/managers/ThreadManager.d.ts +12 -0
  198. package/dist/esm/managers/ThreadManager.js +16 -0
  199. package/dist/esm/managers/UserManager.d.ts +11 -0
  200. package/dist/esm/managers/UserManager.js +34 -0
  201. package/dist/esm/managers/VoiceManager.d.ts +8 -0
  202. package/dist/esm/managers/VoiceManager.js +13 -0
  203. package/dist/esm/package.json +1 -0
  204. package/dist/esm/rest/REST.d.ts +58 -0
  205. package/dist/esm/rest/REST.js +188 -0
  206. package/dist/esm/rest/Routes.d.ts +54 -0
  207. package/dist/esm/rest/Routes.js +55 -0
  208. package/dist/esm/rest/files.d.ts +19 -0
  209. package/dist/esm/rest/files.js +31 -0
  210. package/dist/esm/structures/Base.d.ts +13 -0
  211. package/dist/esm/structures/Base.js +25 -0
  212. package/dist/esm/structures/Message.d.ts +91 -0
  213. package/dist/esm/structures/Message.js +194 -0
  214. package/dist/esm/structures/Role.d.ts +34 -0
  215. package/dist/esm/structures/Role.js +79 -0
  216. package/dist/esm/structures/ScheduledEvent.d.ts +37 -0
  217. package/dist/esm/structures/ScheduledEvent.js +68 -0
  218. package/dist/esm/structures/Server.d.ts +68 -0
  219. package/dist/esm/structures/Server.js +120 -0
  220. package/dist/esm/structures/ServerAssets.d.ts +48 -0
  221. package/dist/esm/structures/ServerAssets.js +98 -0
  222. package/dist/esm/structures/ServerMember.d.ts +47 -0
  223. package/dist/esm/structures/ServerMember.js +133 -0
  224. package/dist/esm/structures/User.d.ts +35 -0
  225. package/dist/esm/structures/User.js +82 -0
  226. package/dist/esm/structures/Webhook.d.ts +30 -0
  227. package/dist/esm/structures/Webhook.js +63 -0
  228. package/dist/esm/structures/channels/BaseChannel.d.ts +49 -0
  229. package/dist/esm/structures/channels/BaseChannel.js +77 -0
  230. package/dist/esm/structures/channels/DMChannel.d.ts +9 -0
  231. package/dist/esm/structures/channels/DMChannel.js +17 -0
  232. package/dist/esm/structures/channels/ServerChannels.d.ts +57 -0
  233. package/dist/esm/structures/channels/ServerChannels.js +129 -0
  234. package/dist/esm/structures/channels/TextBasedChannel.d.ts +25 -0
  235. package/dist/esm/structures/channels/TextBasedChannel.js +49 -0
  236. package/dist/esm/structures/interactions/BaseInteraction.d.ts +74 -0
  237. package/dist/esm/structures/interactions/BaseInteraction.js +217 -0
  238. package/dist/esm/structures/interactions/CommandInteraction.d.ts +44 -0
  239. package/dist/esm/structures/interactions/CommandInteraction.js +104 -0
  240. package/dist/esm/structures/interactions/ComponentInteraction.d.ts +44 -0
  241. package/dist/esm/structures/interactions/ComponentInteraction.js +53 -0
  242. package/dist/esm/structures/interactions/ModalSubmitInteraction.d.ts +29 -0
  243. package/dist/esm/structures/interactions/ModalSubmitInteraction.js +37 -0
  244. package/dist/esm/structures/interactions/createInteraction.d.ts +4 -0
  245. package/dist/esm/structures/interactions/createInteraction.js +31 -0
  246. package/dist/esm/types.d.ts +369 -0
  247. package/dist/esm/types.js +1 -0
  248. package/dist/esm/util/Collection.d.ts +32 -0
  249. package/dist/esm/util/Collection.js +141 -0
  250. package/dist/esm/util/Permissions.d.ts +87 -0
  251. package/dist/esm/util/Permissions.js +109 -0
  252. package/dist/esm/util/Snowflake.d.ts +20 -0
  253. package/dist/esm/util/Snowflake.js +37 -0
  254. package/dist/esm/util/TypedEmitter.d.ts +17 -0
  255. package/dist/esm/util/TypedEmitter.js +2 -0
  256. package/dist/esm/util/constants.d.ts +78 -0
  257. package/dist/esm/util/constants.js +78 -0
  258. package/dist/esm/util/emoji.d.ts +8 -0
  259. package/dist/esm/util/emoji.js +7 -0
  260. package/dist/esm/util/formatters.d.ts +29 -0
  261. package/dist/esm/util/formatters.js +34 -0
  262. package/package.json +58 -6
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PrefixCommandBuilder = exports.SlashCommandBuilder = exports.SubcommandGroupBuilder = exports.SubcommandBuilder = exports.RoleOption = exports.ChannelOption = exports.UserOption = exports.BooleanOption = exports.NumberOption = exports.IntegerOption = exports.StringOption = exports.OptionBuilder = void 0;
4
+ const validate_js_1 = require("./validate.js");
5
+ const code = 'INVALID_COMMAND';
6
+ const NAME = /^[a-z0-9_-]{1,32}$/;
7
+ const MAX_OPTIONS = 25;
8
+ function checkName(path, name) {
9
+ if (typeof name !== 'string' || !NAME.test(name))
10
+ return (0, validate_js_1.fail)(code, `${path}.name`, 'must be 1-32 lowercase letters, numbers, - or _.');
11
+ return name;
12
+ }
13
+ class Named {
14
+ name;
15
+ description;
16
+ setName(name) {
17
+ this.name = name;
18
+ return this;
19
+ }
20
+ setDescription(description) {
21
+ this.description = description;
22
+ return this;
23
+ }
24
+ header(path) {
25
+ return { name: checkName(path, this.name), description: (0, validate_js_1.text)(code, `${path}.description`, this.description, 100) };
26
+ }
27
+ }
28
+ class OptionBuilder extends Named {
29
+ required = false;
30
+ setRequired(required = true) {
31
+ this.required = required;
32
+ return this;
33
+ }
34
+ toJSON(path = 'option') {
35
+ return { ...this.header(path), type: this.type, required: this.required };
36
+ }
37
+ }
38
+ exports.OptionBuilder = OptionBuilder;
39
+ class StringOption extends OptionBuilder {
40
+ type = 'string';
41
+ }
42
+ exports.StringOption = StringOption;
43
+ class IntegerOption extends OptionBuilder {
44
+ type = 'integer';
45
+ }
46
+ exports.IntegerOption = IntegerOption;
47
+ class NumberOption extends OptionBuilder {
48
+ type = 'number';
49
+ }
50
+ exports.NumberOption = NumberOption;
51
+ class BooleanOption extends OptionBuilder {
52
+ type = 'boolean';
53
+ }
54
+ exports.BooleanOption = BooleanOption;
55
+ class UserOption extends OptionBuilder {
56
+ type = 'user';
57
+ }
58
+ exports.UserOption = UserOption;
59
+ class ChannelOption extends OptionBuilder {
60
+ type = 'channel';
61
+ }
62
+ exports.ChannelOption = ChannelOption;
63
+ class RoleOption extends OptionBuilder {
64
+ type = 'role';
65
+ }
66
+ exports.RoleOption = RoleOption;
67
+ function build(input, make) {
68
+ return typeof input === 'function' ? input(make()) : input;
69
+ }
70
+ function checkPlain(path, options) {
71
+ if (options.length > MAX_OPTIONS)
72
+ (0, validate_js_1.fail)(code, path, `can have up to ${MAX_OPTIONS} options.`);
73
+ const names = new Set();
74
+ let optionalSeen = false;
75
+ return options.map((option, i) => {
76
+ const json = option.toJSON(`${path}.options[${i}]`);
77
+ if (names.has(json.name))
78
+ (0, validate_js_1.fail)(code, `${path}.options[${i}]`, `name "${json.name}" is used twice.`);
79
+ names.add(json.name);
80
+ if (json.required && optionalSeen)
81
+ (0, validate_js_1.fail)(code, `${path}.options[${i}]`, `is required, so it must come before the optional options.`);
82
+ optionalSeen ||= !json.required;
83
+ return json;
84
+ });
85
+ }
86
+ class OptionHolder extends Named {
87
+ plain = [];
88
+ addStringOption(option) {
89
+ this.plain.push(build(option, () => new StringOption()));
90
+ return this;
91
+ }
92
+ addIntegerOption(option) {
93
+ this.plain.push(build(option, () => new IntegerOption()));
94
+ return this;
95
+ }
96
+ addNumberOption(option) {
97
+ this.plain.push(build(option, () => new NumberOption()));
98
+ return this;
99
+ }
100
+ addBooleanOption(option) {
101
+ this.plain.push(build(option, () => new BooleanOption()));
102
+ return this;
103
+ }
104
+ addUserOption(option) {
105
+ this.plain.push(build(option, () => new UserOption()));
106
+ return this;
107
+ }
108
+ addChannelOption(option) {
109
+ this.plain.push(build(option, () => new ChannelOption()));
110
+ return this;
111
+ }
112
+ addRoleOption(option) {
113
+ this.plain.push(build(option, () => new RoleOption()));
114
+ return this;
115
+ }
116
+ }
117
+ class SubcommandBuilder extends OptionHolder {
118
+ toJSON(path = 'subcommand') {
119
+ const options = checkPlain(path, this.plain);
120
+ return { ...this.header(path), type: 'subcommand', options };
121
+ }
122
+ }
123
+ exports.SubcommandBuilder = SubcommandBuilder;
124
+ class SubcommandGroupBuilder extends Named {
125
+ subcommands = [];
126
+ addSubcommand(sub) {
127
+ this.subcommands.push(build(sub, () => new SubcommandBuilder()));
128
+ return this;
129
+ }
130
+ toJSON(path = 'group') {
131
+ if (!this.subcommands.length)
132
+ (0, validate_js_1.fail)(code, path, 'needs at least one subcommand.');
133
+ return { ...this.header(path), type: 'subcommand_group', options: checkNested(path, this.subcommands) };
134
+ }
135
+ }
136
+ exports.SubcommandGroupBuilder = SubcommandGroupBuilder;
137
+ function checkNested(path, list) {
138
+ if (list.length > MAX_OPTIONS)
139
+ (0, validate_js_1.fail)(code, path, `can have up to ${MAX_OPTIONS} options.`);
140
+ const names = new Set();
141
+ return list.map((item, i) => {
142
+ const json = item.toJSON(`${path}.options[${i}]`);
143
+ if (names.has(json.name))
144
+ (0, validate_js_1.fail)(code, `${path}.options[${i}]`, `name "${json.name}" is used twice.`);
145
+ names.add(json.name);
146
+ return json;
147
+ });
148
+ }
149
+ class SlashCommandBuilder extends OptionHolder {
150
+ nested = [];
151
+ addSubcommand(sub) {
152
+ this.nested.push(build(sub, () => new SubcommandBuilder()));
153
+ return this;
154
+ }
155
+ addSubcommandGroup(group) {
156
+ this.nested.push(build(group, () => new SubcommandGroupBuilder()));
157
+ return this;
158
+ }
159
+ toJSON() {
160
+ const path = `command "${this.name ?? ''}"`;
161
+ const header = this.header('command');
162
+ if (this.nested.length && this.plain.length)
163
+ (0, validate_js_1.fail)(code, path, 'has both subcommands and plain options: use one or the other.');
164
+ const options = this.nested.length ? checkNested(path, this.nested) : checkPlain(path, this.plain);
165
+ return { ...header, kind: 'slash', options };
166
+ }
167
+ }
168
+ exports.SlashCommandBuilder = SlashCommandBuilder;
169
+ class PrefixCommandBuilder extends Named {
170
+ prefix;
171
+ setPrefix(prefix) {
172
+ this.prefix = prefix;
173
+ return this;
174
+ }
175
+ toJSON() {
176
+ const prefix = this.prefix;
177
+ if (!prefix || [...prefix].length > 5 || /\s/.test(prefix))
178
+ (0, validate_js_1.fail)(code, 'command.prefix', 'must be 1-5 characters with no spaces.');
179
+ if (!this.name || [...this.name].length > 32 || /\s/.test(this.name))
180
+ (0, validate_js_1.fail)(code, 'command.name', 'must be 1-32 characters with no spaces.');
181
+ const description = (0, validate_js_1.text)(code, 'command.description', this.description, 100, { optional: true }) ?? '';
182
+ return { kind: 'prefix', prefix, name: this.name, description };
183
+ }
184
+ }
185
+ exports.PrefixCommandBuilder = PrefixCommandBuilder;
@@ -0,0 +1,14 @@
1
+ import type { APIComponent } from '../../types.js';
2
+ import { type Serializable } from '../validate.js';
3
+ import { ComponentBuilder } from './shared.js';
4
+ export declare class ActionRowBuilder<T extends Serializable = Serializable> extends ComponentBuilder {
5
+ components: (T | APIComponent)[];
6
+ constructor(data?: {
7
+ components?: (T | APIComponent)[];
8
+ });
9
+ addComponents(...components: (T | APIComponent)[]): this;
10
+ setComponents(...components: (T | APIComponent)[]): this;
11
+ toJSON(): APIComponent;
12
+ toModalJSON(): APIComponent;
13
+ private render;
14
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ActionRowBuilder = void 0;
4
+ const constants_js_1 = require("../../util/constants.js");
5
+ const validate_js_1 = require("../validate.js");
6
+ const shared_js_1 = require("./shared.js");
7
+ class ActionRowBuilder extends shared_js_1.ComponentBuilder {
8
+ components;
9
+ constructor(data = {}) {
10
+ super();
11
+ this.components = [...(data.components ?? [])];
12
+ }
13
+ addComponents(...components) {
14
+ this.components.push(...components);
15
+ return this;
16
+ }
17
+ setComponents(...components) {
18
+ this.components = [...components];
19
+ return this;
20
+ }
21
+ toJSON() {
22
+ return this.render(false);
23
+ }
24
+ toModalJSON() {
25
+ return this.render(true);
26
+ }
27
+ render(modal) {
28
+ const children = this.components.map((c) => (0, validate_js_1.resolveJSON)(c));
29
+ const kinds = children.map((c) => c.type);
30
+ const code = 'INVALID_COMPONENT';
31
+ if (modal) {
32
+ if (kinds.length !== 1 || kinds[0] !== constants_js_1.ComponentType.TextInput)
33
+ (0, validate_js_1.fail)(code, 'modal row', 'needs exactly one text input.');
34
+ }
35
+ else if (kinds[0] === constants_js_1.ComponentType.Button) {
36
+ if (kinds.length > 5 || kinds.some((k) => k !== constants_js_1.ComponentType.Button))
37
+ (0, validate_js_1.fail)(code, 'action row', 'can hold up to 5 buttons, all buttons.');
38
+ }
39
+ else if (kinds.length !== 1 || kinds[0] === constants_js_1.ComponentType.TextInput || kinds[0] === undefined) {
40
+ (0, validate_js_1.fail)(code, 'action row', 'needs 1-5 buttons, or exactly one select menu.');
41
+ }
42
+ return { ...this.base(constants_js_1.ComponentType.ActionRow), components: children };
43
+ }
44
+ }
45
+ exports.ActionRowBuilder = ActionRowBuilder;
@@ -0,0 +1,19 @@
1
+ import type { APIComponent } from '../../types.js';
2
+ import { ComponentBuilder, type EmojiInput } from './shared.js';
3
+ type StyleName = 'primary' | 'secondary' | 'success' | 'danger' | 'link';
4
+ export declare class ButtonBuilder extends ComponentBuilder {
5
+ private customId?;
6
+ private label?;
7
+ private style?;
8
+ private emoji?;
9
+ private link?;
10
+ private disabled;
11
+ setCustomId(customId: string): this;
12
+ setLabel(label: string): this;
13
+ setStyle(style: number | StyleName): this;
14
+ setEmoji(emoji: EmojiInput): this;
15
+ setURL(link: string): this;
16
+ setDisabled(disabled?: boolean): this;
17
+ toJSON(): APIComponent;
18
+ }
19
+ export {};
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ButtonBuilder = void 0;
4
+ const constants_js_1 = require("../../util/constants.js");
5
+ const validate_js_1 = require("../validate.js");
6
+ const shared_js_1 = require("./shared.js");
7
+ const STYLE_NUMBERS = { primary: 1, secondary: 2, success: 3, danger: 4, link: 5 };
8
+ class ButtonBuilder extends shared_js_1.ComponentBuilder {
9
+ customId;
10
+ label;
11
+ style;
12
+ emoji;
13
+ link;
14
+ disabled = false;
15
+ setCustomId(customId) {
16
+ this.customId = customId;
17
+ return this;
18
+ }
19
+ setLabel(label) {
20
+ this.label = label;
21
+ return this;
22
+ }
23
+ setStyle(style) {
24
+ const value = typeof style === 'string' ? STYLE_NUMBERS[style] : style;
25
+ if (!Number.isInteger(value) || value < 1 || value > 5)
26
+ (0, validate_js_1.fail)('INVALID_COMPONENT', 'button.style', 'must be 1 (primary), 2 (secondary), 3 (success), 4 (danger) or 5 (link).');
27
+ this.style = value;
28
+ return this;
29
+ }
30
+ setEmoji(emoji) {
31
+ this.emoji = emoji;
32
+ return this;
33
+ }
34
+ setURL(link) {
35
+ this.link = link;
36
+ return this;
37
+ }
38
+ setDisabled(disabled = true) {
39
+ this.disabled = disabled;
40
+ return this;
41
+ }
42
+ toJSON() {
43
+ const code = 'INVALID_COMPONENT';
44
+ const style = this.style ?? (this.link ? constants_js_1.ButtonStyle.Link : constants_js_1.ButtonStyle.Primary);
45
+ const out = this.base(constants_js_1.ComponentType.Button);
46
+ out.style = style;
47
+ const label = (0, validate_js_1.text)(code, 'button.label', this.label, 80, { optional: true });
48
+ const emoji = (0, shared_js_1.emojiJSON)('button.emoji', this.emoji);
49
+ if (label !== undefined)
50
+ out.label = label;
51
+ if (emoji)
52
+ out.emoji = emoji;
53
+ if (label === undefined && !emoji)
54
+ (0, validate_js_1.fail)(code, 'button', 'needs a label (1-80 characters) or an emoji.');
55
+ if (style === constants_js_1.ButtonStyle.Link) {
56
+ if (this.customId !== undefined)
57
+ (0, validate_js_1.fail)(code, 'button', 'is a link button: it has a url and no custom id.');
58
+ out.url = (0, validate_js_1.url)(code, 'button.url', this.link, false);
59
+ }
60
+ else {
61
+ if (this.link !== undefined)
62
+ (0, validate_js_1.fail)(code, 'button', 'has a url, so its style must be Link.');
63
+ out.custom_id = (0, validate_js_1.text)(code, 'button.customId', this.customId, 100);
64
+ }
65
+ out.disabled = this.disabled;
66
+ return out;
67
+ }
68
+ }
69
+ exports.ButtonBuilder = ButtonBuilder;
@@ -0,0 +1,63 @@
1
+ import type { APIComponent } from '../../types.js';
2
+ import { type ColorResolvable } from '../EmbedBuilder.js';
3
+ import { ButtonBuilder } from './ButtonBuilder.js';
4
+ import { ComponentBuilder, type ComponentInput } from './shared.js';
5
+ export declare class TextDisplayBuilder extends ComponentBuilder {
6
+ private content?;
7
+ constructor(content?: string);
8
+ setContent(content: string): this;
9
+ toJSON(): APIComponent;
10
+ }
11
+ export declare class ThumbnailBuilder extends ComponentBuilder {
12
+ private media?;
13
+ private description?;
14
+ private spoiler;
15
+ setURL(mediaUrl: string): this;
16
+ setDescription(description: string): this;
17
+ setSpoiler(spoiler?: boolean): this;
18
+ toJSON(): APIComponent;
19
+ }
20
+ export declare class MediaGalleryItemBuilder {
21
+ private media?;
22
+ private description?;
23
+ private spoiler;
24
+ setURL(mediaUrl: string): this;
25
+ setDescription(description: string): this;
26
+ setSpoiler(spoiler?: boolean): this;
27
+ toJSON(path?: string): Record<string, unknown>;
28
+ }
29
+ export declare class MediaGalleryBuilder extends ComponentBuilder {
30
+ private items;
31
+ addItems(...items: (MediaGalleryItemBuilder | {
32
+ media: {
33
+ url: string;
34
+ };
35
+ description?: string;
36
+ spoiler?: boolean;
37
+ })[]): this;
38
+ toJSON(): APIComponent;
39
+ }
40
+ export declare class SeparatorBuilder extends ComponentBuilder {
41
+ private divider;
42
+ private spacing;
43
+ setDivider(divider?: boolean): this;
44
+ setSpacing(spacing: number): this;
45
+ toJSON(): APIComponent;
46
+ }
47
+ export declare class SectionBuilder extends ComponentBuilder {
48
+ private texts;
49
+ private accessory?;
50
+ addTextDisplayComponents(...texts: (TextDisplayBuilder | string)[]): this;
51
+ setThumbnailAccessory(thumbnail: ThumbnailBuilder): this;
52
+ setButtonAccessory(button: ButtonBuilder): this;
53
+ toJSON(): APIComponent;
54
+ }
55
+ export declare class ContainerBuilder extends ComponentBuilder {
56
+ private children;
57
+ private accent?;
58
+ private spoiler;
59
+ addComponents(...components: ComponentInput[]): this;
60
+ setAccentColor(color: ColorResolvable | null): this;
61
+ setSpoiler(spoiler?: boolean): this;
62
+ toJSON(): APIComponent;
63
+ }
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContainerBuilder = exports.SectionBuilder = exports.SeparatorBuilder = exports.MediaGalleryBuilder = exports.MediaGalleryItemBuilder = exports.ThumbnailBuilder = exports.TextDisplayBuilder = void 0;
4
+ const constants_js_1 = require("../../util/constants.js");
5
+ const EmbedBuilder_js_1 = require("../EmbedBuilder.js");
6
+ const validate_js_1 = require("../validate.js");
7
+ const shared_js_1 = require("./shared.js");
8
+ const code = 'INVALID_COMPONENT';
9
+ class TextDisplayBuilder extends shared_js_1.ComponentBuilder {
10
+ content;
11
+ constructor(content) {
12
+ super();
13
+ this.content = content;
14
+ }
15
+ setContent(content) {
16
+ this.content = content;
17
+ return this;
18
+ }
19
+ toJSON() {
20
+ return { ...this.base(constants_js_1.ComponentType.TextDisplay), content: (0, validate_js_1.text)(code, 'textDisplay.content', this.content, 4000) };
21
+ }
22
+ }
23
+ exports.TextDisplayBuilder = TextDisplayBuilder;
24
+ class ThumbnailBuilder extends shared_js_1.ComponentBuilder {
25
+ media;
26
+ description;
27
+ spoiler = false;
28
+ setURL(mediaUrl) {
29
+ this.media = mediaUrl;
30
+ return this;
31
+ }
32
+ setDescription(description) {
33
+ this.description = description;
34
+ return this;
35
+ }
36
+ setSpoiler(spoiler = true) {
37
+ this.spoiler = spoiler;
38
+ return this;
39
+ }
40
+ toJSON() {
41
+ const out = this.base(constants_js_1.ComponentType.Thumbnail);
42
+ out.media = { url: (0, validate_js_1.url)(code, 'thumbnail.url', this.media, false) };
43
+ const description = (0, validate_js_1.text)(code, 'thumbnail.description', this.description, 1024, { optional: true });
44
+ if (description !== undefined)
45
+ out.description = description;
46
+ out.spoiler = this.spoiler;
47
+ return out;
48
+ }
49
+ }
50
+ exports.ThumbnailBuilder = ThumbnailBuilder;
51
+ class MediaGalleryItemBuilder {
52
+ media;
53
+ description;
54
+ spoiler = false;
55
+ setURL(mediaUrl) {
56
+ this.media = mediaUrl;
57
+ return this;
58
+ }
59
+ setDescription(description) {
60
+ this.description = description;
61
+ return this;
62
+ }
63
+ setSpoiler(spoiler = true) {
64
+ this.spoiler = spoiler;
65
+ return this;
66
+ }
67
+ toJSON(path = 'mediaGallery.items[0]') {
68
+ const out = { media: { url: (0, validate_js_1.url)(code, `${path}.url`, this.media, false) } };
69
+ const description = (0, validate_js_1.text)(code, `${path}.description`, this.description, 1024, { optional: true });
70
+ if (description !== undefined)
71
+ out.description = description;
72
+ out.spoiler = this.spoiler;
73
+ return out;
74
+ }
75
+ }
76
+ exports.MediaGalleryItemBuilder = MediaGalleryItemBuilder;
77
+ class MediaGalleryBuilder extends shared_js_1.ComponentBuilder {
78
+ items = [];
79
+ addItems(...items) {
80
+ this.items.push(...items);
81
+ return this;
82
+ }
83
+ toJSON() {
84
+ if (!this.items.length || this.items.length > 10)
85
+ (0, validate_js_1.fail)(code, 'mediaGallery.items', 'needs 1-10 items.');
86
+ const items = this.items.map((item, i) => {
87
+ const path = `mediaGallery.items[${i}]`;
88
+ if (item instanceof MediaGalleryItemBuilder)
89
+ return item.toJSON(path);
90
+ const built = new MediaGalleryItemBuilder().setURL(item.media.url);
91
+ if (item.description)
92
+ built.setDescription(item.description);
93
+ if (item.spoiler)
94
+ built.setSpoiler();
95
+ return built.toJSON(path);
96
+ });
97
+ return { ...this.base(constants_js_1.ComponentType.MediaGallery), items };
98
+ }
99
+ }
100
+ exports.MediaGalleryBuilder = MediaGalleryBuilder;
101
+ class SeparatorBuilder extends shared_js_1.ComponentBuilder {
102
+ divider = true;
103
+ spacing = constants_js_1.SeparatorSpacing.Small;
104
+ setDivider(divider = true) {
105
+ this.divider = divider;
106
+ return this;
107
+ }
108
+ setSpacing(spacing) {
109
+ this.spacing = spacing;
110
+ return this;
111
+ }
112
+ toJSON() {
113
+ if (this.spacing !== 1 && this.spacing !== 2)
114
+ (0, validate_js_1.fail)(code, 'separator.spacing', 'must be Small (1) or Large (2).');
115
+ return { ...this.base(constants_js_1.ComponentType.Separator), divider: this.divider, spacing: this.spacing };
116
+ }
117
+ }
118
+ exports.SeparatorBuilder = SeparatorBuilder;
119
+ class SectionBuilder extends shared_js_1.ComponentBuilder {
120
+ texts = [];
121
+ accessory;
122
+ addTextDisplayComponents(...texts) {
123
+ this.texts.push(...texts);
124
+ return this;
125
+ }
126
+ setThumbnailAccessory(thumbnail) {
127
+ this.accessory = thumbnail;
128
+ return this;
129
+ }
130
+ setButtonAccessory(button) {
131
+ this.accessory = button;
132
+ return this;
133
+ }
134
+ toJSON() {
135
+ if (!this.texts.length || this.texts.length > 3)
136
+ (0, validate_js_1.fail)(code, 'section.components', 'needs 1-3 text displays.');
137
+ if (!this.accessory)
138
+ (0, validate_js_1.fail)(code, 'section.accessory', 'is required: a thumbnail or a button.');
139
+ return {
140
+ ...this.base(constants_js_1.ComponentType.Section),
141
+ components: this.texts.map((t) => (typeof t === 'string' ? new TextDisplayBuilder(t) : t).toJSON()),
142
+ accessory: this.accessory.toJSON()
143
+ };
144
+ }
145
+ }
146
+ exports.SectionBuilder = SectionBuilder;
147
+ class ContainerBuilder extends shared_js_1.ComponentBuilder {
148
+ children = [];
149
+ accent;
150
+ spoiler = false;
151
+ addComponents(...components) {
152
+ this.children.push(...components);
153
+ return this;
154
+ }
155
+ setAccentColor(color) {
156
+ this.accent = color === null ? undefined : (0, EmbedBuilder_js_1.resolveColor)(color);
157
+ return this;
158
+ }
159
+ setSpoiler(spoiler = true) {
160
+ this.spoiler = spoiler;
161
+ return this;
162
+ }
163
+ toJSON() {
164
+ if (!this.children.length)
165
+ (0, validate_js_1.fail)(code, 'container.components', 'needs at least one component.');
166
+ const allowed = [constants_js_1.ComponentType.ActionRow, constants_js_1.ComponentType.Section, constants_js_1.ComponentType.TextDisplay, constants_js_1.ComponentType.MediaGallery, constants_js_1.ComponentType.Separator];
167
+ const components = this.children.map((child, i) => {
168
+ const json = (0, validate_js_1.resolveJSON)(child);
169
+ if (!allowed.includes(json.type))
170
+ (0, validate_js_1.fail)(code, `container.components[${i}]`, 'can be an action row, section, text display, media gallery or separator.');
171
+ return json;
172
+ });
173
+ const out = { ...this.base(constants_js_1.ComponentType.Container), components, spoiler: this.spoiler };
174
+ if (this.accent !== undefined)
175
+ out.accent_color = (0, validate_js_1.range)(code, 'container.accentColor', this.accent, 0, 0xffffff);
176
+ return out;
177
+ }
178
+ }
179
+ exports.ContainerBuilder = ContainerBuilder;
@@ -0,0 +1,36 @@
1
+ import type { APIComponent } from '../../types.js';
2
+ import { ActionRowBuilder } from './ActionRowBuilder.js';
3
+ import { ComponentBuilder } from './shared.js';
4
+ export declare class TextInputBuilder extends ComponentBuilder {
5
+ private customId?;
6
+ private label?;
7
+ private style;
8
+ private placeholder?;
9
+ private minLength;
10
+ private maxLength;
11
+ private required;
12
+ private value?;
13
+ setCustomId(customId: string): this;
14
+ setLabel(label: string): this;
15
+ setStyle(style: number | 'short' | 'paragraph'): this;
16
+ setPlaceholder(placeholder: string): this;
17
+ setMinLength(length: number): this;
18
+ setMaxLength(length: number): this;
19
+ setRequired(required?: boolean): this;
20
+ setValue(value: string): this;
21
+ toJSON(): APIComponent;
22
+ }
23
+ export declare class ModalBuilder {
24
+ private customId?;
25
+ private title?;
26
+ private rows;
27
+ setCustomId(customId: string): this;
28
+ setTitle(title: string): this;
29
+ addComponents(...rows: (ActionRowBuilder | TextInputBuilder)[]): this;
30
+ setComponents(...rows: (ActionRowBuilder | TextInputBuilder)[]): this;
31
+ toJSON(): {
32
+ title: string;
33
+ custom_id: string;
34
+ components: APIComponent[];
35
+ };
36
+ }