lunibee 0.1.7 → 0.2.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 (78) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +225 -223
  3. package/dist/builders/commands.d.ts +6 -4
  4. package/dist/builders/components.d.ts +23 -0
  5. package/dist/builders/index.d.ts +2 -2
  6. package/dist/builders/index.js +120 -24
  7. package/dist/builders/index.js.map +9 -8
  8. package/dist/collection/index.d.ts +68 -1
  9. package/dist/collection/index.js +335 -1
  10. package/dist/collection/index.js.map +4 -4
  11. package/dist/core/collector.d.ts +13 -0
  12. package/dist/core/events.d.ts +112 -2
  13. package/dist/core/index.d.ts +30 -93
  14. package/dist/core/index.js +3386 -957
  15. package/dist/core/index.js.map +48 -24
  16. package/dist/core/permissions.d.ts +48 -0
  17. package/dist/formatters/index.js.map +1 -1
  18. package/dist/handlers/index.js.map +1 -1
  19. package/dist/index.d.ts +1 -1
  20. package/dist/index.js +3806 -1193
  21. package/dist/index.js.map +64 -43
  22. package/dist/managers/advanced.d.ts +116 -0
  23. package/dist/managers/base.d.ts +13 -2
  24. package/dist/managers/emoji.d.ts +1 -1
  25. package/dist/managers/guild-resources.d.ts +109 -0
  26. package/dist/managers/guild.d.ts +33 -2
  27. package/dist/managers/index.d.ts +44 -6
  28. package/dist/managers/index.js +1186 -150
  29. package/dist/managers/index.js.map +27 -21
  30. package/dist/managers/message.d.ts +10 -1
  31. package/dist/rest/decoder.d.ts +23 -0
  32. package/dist/rest/errors.d.ts +53 -0
  33. package/dist/rest/index.d.ts +21 -17
  34. package/dist/rest/index.js +526 -264
  35. package/dist/rest/index.js.map +14 -8
  36. package/dist/rest/limiter.d.ts +42 -0
  37. package/dist/rest/redis.d.ts +18 -1
  38. package/dist/rest/route.d.ts +31 -0
  39. package/dist/rest/routes.d.ts +22 -0
  40. package/dist/rest/scheduler.d.ts +42 -0
  41. package/dist/rest/store.d.ts +29 -0
  42. package/dist/rest/transport.d.ts +40 -0
  43. package/dist/sharding/bus.d.ts +31 -0
  44. package/dist/sharding/cluster.d.ts +10 -0
  45. package/dist/sharding/index.d.ts +39 -2
  46. package/dist/sharding/index.js +1105 -404
  47. package/dist/sharding/index.js.map +18 -8
  48. package/dist/structures/base.d.ts +10 -0
  49. package/dist/structures/channels.d.ts +56 -0
  50. package/dist/structures/index.d.ts +1 -0
  51. package/dist/structures/index.js +305 -311
  52. package/dist/structures/index.js.map +18 -14
  53. package/dist/structures/interactions.d.ts +38 -52
  54. package/dist/structures/options.d.ts +55 -0
  55. package/dist/structures/resources.d.ts +3 -3
  56. package/dist/types/gateway-events.d.ts +132 -0
  57. package/dist/types/gateway.d.ts +197 -0
  58. package/dist/types/index.d.ts +53 -260
  59. package/dist/types/index.js +44 -2
  60. package/dist/types/index.js.map +5 -4
  61. package/dist/utils/index.js.map +1 -1
  62. package/dist/voice/index.d.ts +32 -1
  63. package/dist/voice/index.js +73 -7
  64. package/dist/voice/index.js.map +3 -3
  65. package/dist/ws/close-codes.d.ts +23 -0
  66. package/dist/ws/decoder.d.ts +58 -0
  67. package/dist/ws/heartbeat.d.ts +87 -0
  68. package/dist/ws/index.d.ts +18 -65
  69. package/dist/ws/index.js +911 -385
  70. package/dist/ws/index.js.map +15 -5
  71. package/dist/ws/opcodes.d.ts +14 -0
  72. package/dist/ws/protocol.d.ts +110 -0
  73. package/dist/ws/reconnect.d.ts +108 -0
  74. package/dist/ws/send-budget.d.ts +17 -0
  75. package/dist/ws/session.d.ts +100 -0
  76. package/dist/ws/state.d.ts +27 -0
  77. package/dist/ws/transport.d.ts +80 -0
  78. package/package.json +21 -20
@@ -114,7 +114,7 @@ function url(value, field) {
114
114
  throw new TypeError(`${field} must be a valid URL.`, { cause: error });
115
115
  }
116
116
  }
117
- // packages/types/src/index.ts
117
+ // packages/types/src/gateway.ts
118
118
  var GatewayIntentBits = {
119
119
  Guilds: 1 << 0,
120
120
  GuildMembers: 1 << 1,
@@ -166,6 +166,7 @@ var IntentBits = {
166
166
  guildMessagePolls: 1 << 24,
167
167
  directMessagePolls: 1 << 25
168
168
  };
169
+ // packages/types/src/index.ts
169
170
  var ButtonStyle = {
170
171
  Primary: 1,
171
172
  Secondary: 2,
@@ -211,10 +212,13 @@ class ActionRowBuilder {
211
212
  return this;
212
213
  }
213
214
  toJSON() {
214
- return {
215
- type: ComponentType.ActionRow,
216
- components: this.#components.map((component) => component.toJSON())
217
- };
215
+ const components = this.#components.map((component) => component.toJSON());
216
+ if (components.length === 0)
217
+ throw new RangeError("An action row needs at least one component.");
218
+ const types = components.map((component) => component.type);
219
+ if (types.some((type) => type !== ComponentType.Button) && components.length > 1)
220
+ throw new RangeError("A select menu or text input must be alone in its action row.");
221
+ return { type: ComponentType.ActionRow, components };
218
222
  }
219
223
  }
220
224
 
@@ -269,6 +273,12 @@ class StringSelectBuilder {
269
273
  return this;
270
274
  }
271
275
  toJSON() {
276
+ assertSelect(this.#data);
277
+ const count = this.#data.options?.length ?? 0;
278
+ if (count === 0)
279
+ throw new RangeError("A string select needs at least one option.");
280
+ if ((this.#data.max_values ?? 1) > count)
281
+ throw new RangeError("max_values cannot exceed the number of options.");
272
282
  return structuredClone(this.#data);
273
283
  }
274
284
  }
@@ -279,9 +289,20 @@ class ButtonBuilder {
279
289
  style: ButtonStyle.Secondary
280
290
  };
281
291
  setStyle(style) {
282
- this.#data.style = style;
283
- if (style === ButtonStyle.Link)
284
- delete this.#data.custom_id;
292
+ const data = this.#data;
293
+ data.style = style;
294
+ if (style === ButtonStyle.Link) {
295
+ delete data.custom_id;
296
+ delete data.sku_id;
297
+ } else if (style === ButtonStyle.Premium) {
298
+ delete data.custom_id;
299
+ delete data.url;
300
+ delete data.label;
301
+ delete data.emoji;
302
+ } else {
303
+ delete data.url;
304
+ delete data.sku_id;
305
+ }
285
306
  return this;
286
307
  }
287
308
  setCustomId(value) {
@@ -298,17 +319,22 @@ class ButtonBuilder {
298
319
  }
299
320
  setURL(value) {
300
321
  validateText(value, 512, "Button URL");
301
- let url2;
322
+ let url;
302
323
  try {
303
- url2 = new URL(value);
324
+ url = new URL(value);
304
325
  } catch (error) {
305
326
  throw new TypeError("Button URL must be a valid URL.", {
306
327
  cause: error
307
328
  });
308
329
  }
309
- this.#data.style = ButtonStyle.Link;
310
- delete this.#data.custom_id;
311
- this.#data.url = url2.toString();
330
+ this.setStyle(ButtonStyle.Link);
331
+ this.#data.url = url.toString();
332
+ return this;
333
+ }
334
+ setSKUId(skuId) {
335
+ validateText(skuId, 20, "Button SKU ID");
336
+ this.setStyle(ButtonStyle.Premium);
337
+ this.#data.sku_id = skuId;
312
338
  return this;
313
339
  }
314
340
  setEmoji(emoji) {
@@ -320,7 +346,26 @@ class ButtonBuilder {
320
346
  return this;
321
347
  }
322
348
  toJSON() {
323
- return structuredClone(this.#data);
349
+ const data = this.#data;
350
+ if (data.style === ButtonStyle.Link) {
351
+ if (!data.url)
352
+ throw new TypeError("Link buttons require a URL.");
353
+ if (data.custom_id || data.sku_id)
354
+ throw new TypeError("Link buttons cannot have a custom ID or SKU ID.");
355
+ } else if (data.style === ButtonStyle.Premium) {
356
+ if (!data.sku_id)
357
+ throw new TypeError("Premium buttons require a SKU ID.");
358
+ if (data.custom_id || data.url || data.label || data.emoji)
359
+ throw new TypeError("Premium buttons cannot have a custom ID, URL, label or emoji.");
360
+ } else {
361
+ if (!data.custom_id)
362
+ throw new TypeError("Non-link buttons require a custom ID.");
363
+ if (data.url || data.sku_id)
364
+ throw new TypeError("Only link buttons have a URL and only premium buttons have a SKU ID.");
365
+ }
366
+ if (data.style !== ButtonStyle.Premium && !data.label && !data.emoji)
367
+ throw new TypeError("Buttons require a label or an emoji.");
368
+ return structuredClone(data);
324
369
  }
325
370
  }
326
371
 
@@ -364,6 +409,7 @@ class EntitySelectBuilder {
364
409
  return this;
365
410
  }
366
411
  toJSON() {
412
+ assertSelect(this.#data);
367
413
  return structuredClone(this.#data);
368
414
  }
369
415
  }
@@ -391,6 +437,10 @@ class ModalBuilder {
391
437
  return this;
392
438
  }
393
439
  toJSON() {
440
+ if (!this.#custom_id || !this.#title)
441
+ throw new TypeError("Modals require a custom ID and a title.");
442
+ if (this.#components.length === 0)
443
+ throw new RangeError("Modals require at least one component.");
394
444
  return {
395
445
  type: 9,
396
446
  ...this.#custom_id ? { custom_id: this.#custom_id } : {},
@@ -444,7 +494,12 @@ class TextInputBuilder {
444
494
  return this;
445
495
  }
446
496
  toJSON() {
447
- return structuredClone(this.#data);
497
+ const data = this.#data;
498
+ if (!data.custom_id)
499
+ throw new TypeError("Text inputs require a custom ID.");
500
+ if (data.min_length !== undefined && data.max_length !== undefined && data.min_length > data.max_length)
501
+ throw new RangeError("min_length cannot exceed max_length.");
502
+ return structuredClone(data);
448
503
  }
449
504
  }
450
505
 
@@ -542,9 +597,9 @@ class MediaGalleryBuilder {
542
597
  class FileComponentBuilder {
543
598
  #url = "";
544
599
  #spoiler;
545
- setUrl(url2) {
546
- validateText(url2, 2048, "File component URL");
547
- this.#url = url2;
600
+ setUrl(url) {
601
+ validateText(url, 2048, "File component URL");
602
+ this.#url = url;
548
603
  return this;
549
604
  }
550
605
  setSpoiler(spoiler = true) {
@@ -591,9 +646,9 @@ class ThumbnailBuilder {
591
646
  #url = "";
592
647
  #description;
593
648
  #spoiler;
594
- setUrl(url2) {
595
- validateText(url2, 2048, "Thumbnail URL");
596
- this.#url = url2;
649
+ setUrl(url) {
650
+ validateText(url, 2048, "Thumbnail URL");
651
+ this.#url = url;
597
652
  return this;
598
653
  }
599
654
  setDescription(description) {
@@ -648,6 +703,35 @@ function validateLength(value, field, max = 4000) {
648
703
  if (!Number.isInteger(value) || value < 0 || value > max)
649
704
  throw new RangeError(`${field} must be an integer between 0 and ${max}.`);
650
705
  }
706
+ class UserSelectMenuBuilder extends EntitySelectBuilder {
707
+ constructor() {
708
+ super(ComponentType.UserSelect);
709
+ }
710
+ }
711
+
712
+ class RoleSelectMenuBuilder extends EntitySelectBuilder {
713
+ constructor() {
714
+ super(ComponentType.RoleSelect);
715
+ }
716
+ }
717
+
718
+ class MentionableSelectMenuBuilder extends EntitySelectBuilder {
719
+ constructor() {
720
+ super(ComponentType.MentionableSelect);
721
+ }
722
+ }
723
+
724
+ class ChannelSelectMenuBuilder extends EntitySelectBuilder {
725
+ constructor() {
726
+ super(ComponentType.ChannelSelect);
727
+ }
728
+ }
729
+ function assertSelect(data) {
730
+ if (!data.custom_id)
731
+ throw new TypeError("Select menus require a custom ID.");
732
+ if ((data.min_values ?? 1) > (data.max_values ?? 1))
733
+ throw new RangeError("min_values cannot exceed max_values.");
734
+ }
651
735
  // packages/builders/src/commands.ts
652
736
  var ApplicationCommandOptionType = {
653
737
  Subcommand: 1,
@@ -1006,9 +1090,15 @@ function validateNumberRange(value, minimum, maximum, field, integerOnly = true)
1006
1090
 
1007
1091
  class ContextMenuCommandBuilder {
1008
1092
  data;
1009
- constructor(type) {
1093
+ constructor(type = 2) {
1010
1094
  this.data = { type };
1011
1095
  }
1096
+ setType(type) {
1097
+ if (type !== 2 && type !== 3)
1098
+ throw new RangeError("Context menu command type must be 2 or 3.");
1099
+ this.data.type = type;
1100
+ return this;
1101
+ }
1012
1102
  setName(name) {
1013
1103
  if (typeof name !== "string" || name.trim().length < 1 || name.length > 32)
1014
1104
  throw new RangeError("Command name must contain 1-32 characters.");
@@ -1100,24 +1190,29 @@ export {
1100
1190
  ButtonBuilder,
1101
1191
  ButtonStyle,
1102
1192
  ChannelOptionBuilder,
1193
+ ChannelSelectMenuBuilder,
1103
1194
  ComponentType,
1104
1195
  ContainerBuilder,
1105
1196
  ContentInventoryEntryBuilder,
1197
+ ContextMenuCommandBuilder,
1106
1198
  EmbedBuilder,
1107
1199
  EntitySelectBuilder,
1108
1200
  FileComponentBuilder,
1109
1201
  IntegerOptionBuilder,
1110
1202
  MediaGalleryBuilder,
1111
1203
  MentionableOptionBuilder,
1204
+ MentionableSelectMenuBuilder,
1112
1205
  MessageCommandBuilder,
1113
1206
  ModalBuilder,
1114
1207
  NumberOptionBuilder,
1115
1208
  RoleOptionBuilder,
1209
+ RoleSelectMenuBuilder,
1116
1210
  SectionBuilder,
1117
1211
  SeparatorBuilder,
1118
1212
  SlashCommandBuilder,
1119
1213
  StringOptionBuilder,
1120
1214
  StringSelectBuilder,
1215
+ StringSelectBuilder as StringSelectMenuBuilder,
1121
1216
  SubcommandBuilder,
1122
1217
  SubcommandGroupBuilder,
1123
1218
  TextDisplayBuilder,
@@ -1125,7 +1220,8 @@ export {
1125
1220
  TextInputStyle,
1126
1221
  ThumbnailBuilder,
1127
1222
  UserCommandBuilder,
1128
- UserOptionBuilder
1223
+ UserOptionBuilder,
1224
+ UserSelectMenuBuilder
1129
1225
  };
1130
1226
 
1131
- //# debugId=1FE9A1C7B4113D0264756E2164756E21
1227
+ //# debugId=91BF5BFA3419A2E364756E2164756E21