discord-bot-shared 0.14.0 → 0.14.2

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.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023 adamhl8
3
+ Copyright (c) 2025 adamhl8
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -13,7 +13,7 @@ A small package that makes creating [discord.js](https://github.com/discordjs/di
13
13
  - [Unregistering commands](#unregistering-commands)
14
14
  - [Global Command Hook](#global-command-hook)
15
15
  - [Events](#events)
16
- - [Listening for event](#listening-for-event)
16
+ - [Listening for events](#listening-for-events)
17
17
  - [Adding and registering events](#adding-and-registering-events)
18
18
  - [Error Handling](#error-handling)
19
19
  - [Commands](#commands-1)
@@ -52,6 +52,7 @@ In **`index.ts`:**
52
52
  ```ts
53
53
  import Bot from "discord-bot-shared"
54
54
  import { ClientOptions, GatewayIntentBits } from "discord.js"
55
+
55
56
  import ping from "./ping"
56
57
 
57
58
  // Get applicationId and token from environment variables
@@ -173,7 +174,7 @@ It's intended that you throw an error in the case you don't want the command to
173
174
 
174
175
  ## Events
175
176
 
176
- ### Listening for event
177
+ ### Listening for events
177
178
 
178
179
  You can create an `Event` object that will be added to the bot later.
179
180
 
package/dist/bot.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Client, Events, REST } from "discord.js";
2
- import CommandManager from "./command-manager.js";
3
- import EventManager from "./event-manager.js";
2
+ import { CommandManager } from "./command-manager.js";
3
+ import { EventManager } from "./event-manager.js";
4
4
  class Bot {
5
5
  #discord;
6
6
  commands;
@@ -24,5 +24,5 @@ class Bot {
24
24
  await this.#discord.client.login(this.#discord.token);
25
25
  }
26
26
  }
27
- export default Bot;
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2JvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFpQixNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ2hFLE9BQU8sY0FBYyxNQUFNLHNCQUFzQixDQUFBO0FBQ2pELE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFBO0FBZTdDLE1BQU0sR0FBRztJQUNQLFFBQVEsQ0FBZ0I7SUFFZixRQUFRLENBQWdCO0lBQ3hCLE1BQU0sQ0FBYztJQUU3QixZQUFZLE9BQW1CO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWE7WUFDcEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3BCLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1lBQ3pDLElBQUksRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQ3pDLENBQUE7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNqRCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7WUFDakQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO1FBQ2pDLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkQsQ0FBQztDQUNGO0FBRUQsZUFBZSxHQUFHLENBQUEifQ==
27
+ export { Bot };
28
+ //# sourceMappingURL=bot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bot.js","sourceRoot":"","sources":["../src/bot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAsB,MAAM,YAAY,CAAA;AAErE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAejD,MAAM,GAAG;IACE,QAAQ,CAAgB;IAEjB,QAAQ,CAAgB;IACxB,MAAM,CAAc;IAEpC,YAAmB,OAAmB;QACpC,IAAI,CAAC,QAAQ,GAAG;YACd,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC;YACzC,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;SACzC,CAAA;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACjD,IAAI,CAAC,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC/C,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE;YACjD,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAA;QACvB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;QACrB,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvD,CAAC;CACF;AAED,OAAO,EAAE,GAAG,EAAE,CAAA"}
@@ -1,5 +1,5 @@
1
- import { Collection, Events, Routes, } from "discord.js";
2
- import { UserError, throwUserError } from "./util.js";
1
+ import { Collection, Events, MessageFlags, Routes, } from "discord.js";
2
+ import { throwUserError, UserError } from "./util.js";
3
3
  class CommandManager {
4
4
  #commands = new Collection();
5
5
  #globalCommandHook;
@@ -20,17 +20,13 @@ class CommandManager {
20
20
  const payload = this.#commands.map((c) => c.command);
21
21
  const route = Routes.applicationCommands(this.#discord.applicationId);
22
22
  await this.#discord.rest.put(route, { body: payload });
23
- console.log(`Registered ${this.#commands.size} (/) commands.`);
23
+ console.log(`Registered ${this.#commands.size.toString()} (/) commands.`);
24
24
  }
25
25
  async unregisterGuildCommands() {
26
- if (this.#discord.client.readyAt) {
27
- await this._unregisterGuildCommands().catch(console.error);
28
- }
29
- else {
30
- this.#discord.client.once(Events.ClientReady, async () => {
31
- await this._unregisterGuildCommands().catch(console.error);
32
- });
33
- }
26
+ if (this.#discord.client.readyAt)
27
+ await this._unregisterGuildCommands();
28
+ else
29
+ this.#discord.client.once(Events.ClientReady, () => void this._unregisterGuildCommands());
34
30
  }
35
31
  async _unregisterGuildCommands() {
36
32
  let guilds;
@@ -41,11 +37,16 @@ class CommandManager {
41
37
  console.error("Unable to unregister guild commands. Failed to fetch guilds.");
42
38
  throw error;
43
39
  }
40
+ const unregisterPromises = [];
44
41
  for (const guild of guilds.values()) {
45
42
  const route = Routes.applicationGuildCommands(this.#discord.applicationId, guild.id);
46
- await this.#discord.rest.put(route, { body: [] });
47
- console.log(`Unregistered commands from guild: ${guild.name}`);
43
+ const unregisterGuildCommands = async () => {
44
+ await this.#discord.rest.put(route, { body: [] });
45
+ console.log(`Unregistered commands from guild: ${guild.name}`);
46
+ };
47
+ unregisterPromises.push(unregisterGuildCommands());
48
48
  }
49
+ await Promise.all(unregisterPromises);
49
50
  }
50
51
  async unregisterApplicationCommands() {
51
52
  const route = Routes.applicationCommands(this.#discord.applicationId);
@@ -53,7 +54,7 @@ class CommandManager {
53
54
  console.log("Unregistered application commands.");
54
55
  }
55
56
  _listen() {
56
- this.#discord.client.on(Events.InteractionCreate, async (interaction) => {
57
+ const listen = async (interaction) => {
57
58
  if (!interaction.isChatInputCommand())
58
59
  return;
59
60
  if (!interaction.guildId)
@@ -61,16 +62,16 @@ class CommandManager {
61
62
  if (!interaction.inCachedGuild())
62
63
  await interaction.client.guilds.fetch(interaction.guildId).catch(console.error);
63
64
  if (!interaction.inCachedGuild()) {
64
- this.interactionReply(interaction, "Guild is not cached. Try again.");
65
+ CommandManager.interactionReply(interaction, "Guild is not cached. Try again.");
65
66
  return;
66
67
  }
67
68
  const command = this.#commands.get(interaction.commandName);
68
69
  if (!command) {
69
- this.interactionReply(interaction, `Failed to get command with name: ${interaction.commandName}`);
70
+ CommandManager.interactionReply(interaction, `Failed to get command with name: ${interaction.commandName}`);
70
71
  return;
71
72
  }
72
- if (!(await this.checkRoles(command, interaction))) {
73
- this.interactionReply(interaction, "You do not have one of the required roles to run this command.");
73
+ if (!(await CommandManager.checkRoles(command, interaction))) {
74
+ CommandManager.interactionReply(interaction, "You do not have one of the required roles to run this command.");
74
75
  return;
75
76
  }
76
77
  try {
@@ -80,12 +81,13 @@ class CommandManager {
80
81
  await command.run(interaction);
81
82
  }
82
83
  catch (error) {
83
- this.interactionReply(interaction, error);
84
+ CommandManager.interactionReply(interaction, error);
84
85
  }
85
- });
86
+ };
87
+ this.#discord.client.on(Events.InteractionCreate, (interaction) => void listen(interaction));
86
88
  console.log("Listening for commands.");
87
89
  }
88
- async checkRoles(command, interaction) {
90
+ static async checkRoles(command, interaction) {
89
91
  if (!command.requiredRoles)
90
92
  return true;
91
93
  if (command.requiredRoles.length > 0) {
@@ -96,8 +98,8 @@ class CommandManager {
96
98
  }
97
99
  return false;
98
100
  }
99
- interactionReply(interaction, error) {
100
- let errorMessage = "";
101
+ static interactionReply(interaction, error) {
102
+ let errorMessage;
101
103
  if (error instanceof UserError)
102
104
  errorMessage = error.message;
103
105
  else if (error instanceof Error && error.stack)
@@ -105,10 +107,13 @@ class CommandManager {
105
107
  else
106
108
  errorMessage = String(error);
107
109
  const message = `There was an error while running this command.\n\`\`\`${errorMessage}\`\`\``;
108
- interaction.deferred
109
- ? void interaction.editReply(message).catch(console.error)
110
- : void interaction.reply({ content: message, ephemeral: true }).catch(console.error);
110
+ const handleInteractionReply = async () => {
111
+ await (interaction.deferred
112
+ ? interaction.editReply(message).catch(console.error)
113
+ : interaction.reply({ content: message, flags: MessageFlags.Ephemeral }).catch(console.error));
114
+ };
115
+ void handleInteractionReply();
111
116
  }
112
117
  }
113
- export default CommandManager;
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWFuZC1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1hbmQtbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsVUFBVSxFQUNWLE1BQU0sRUFFTixNQUFNLEdBQ1AsTUFBTSxZQUFZLENBQUE7QUFFbkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFVckQsTUFBTSxjQUFjO0lBQ2xCLFNBQVMsR0FBRyxJQUFJLFVBQVUsRUFBbUIsQ0FBQTtJQUM3QyxrQkFBa0IsQ0FBYztJQUNoQyxRQUFRLENBQWdCO0lBRXhCLFlBQVksT0FBdUI7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUE7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsR0FBRyxDQUFDLE9BQWdCO1FBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ25ELENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxXQUF3QjtRQUMzQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsV0FBVyxDQUFBO0lBQ3ZDLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNaLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDcEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUE7UUFDckUsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFFdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxj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
118
+ export { CommandManager };
119
+ //# sourceMappingURL=command-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-manager.js","sourceRoot":"","sources":["../src/command-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,MAAM,EACN,YAAY,EACZ,MAAM,GAIP,MAAM,YAAY,CAAA;AAGnB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAUrD,MAAM,cAAc;IACT,SAAS,GAAG,IAAI,UAAU,EAAmB,CAAA;IACtD,kBAAkB,CAAc;IACvB,QAAQ,CAAgB;IAEjC,YAAmB,OAAuB;QACxC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;IACzB,CAAC;IAED;;OAEG;IACI,GAAG,CAAC,OAAgB;QACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACnD,CAAC;IAEM,oBAAoB,CAAC,WAAwB;QAClD,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAA;IACvC,CAAC;IAEM,KAAK,CAAC,QAAQ;QACnB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;QACpD,MAAM,KAAK,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;QACrE,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QAEtD,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA;IAC3E,CAAC;IAEM,KAAK,CAAC,uBAAuB;QAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO;YAAE,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAA;;YAClE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAA;IAChG,CAAC;IAEO,KAAK,CAAC,wBAAwB;QACpC,IAAI,MAAM,CAAA;QACV,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAA;YAC7E,MAAM,KAAK,CAAA;QACb,CAAC;QAED,MAAM,kBAAkB,GAAG,EAAE,CAAA;QAC7B,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,CAAA;YACpF,MAAM,uBAAuB,GAAG,KAAK,IAAI,EAAE;gBACzC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;gBACjD,OAAO,CAAC,GAAG,CAAC,qCAAqC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;YAChE,CAAC,CAAA;YACD,kBAAkB,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAA;QACpD,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;IACvC,CAAC;IAEM,KAAK,CAAC,6BAA6B;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;QACrE,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAA;QACjD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAA;IACnD,CAAC;IAEM,OAAO;QACZ,MAAM,MAAM,GAAG,KAAK,EAAE,WAAwB,EAAE,EAAE;YAChD,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE;gBAAE,OAAM;YAC7C,IAAI,CAAC,WAAW,CAAC,OAAO;gBAAE,OAAM;YAChC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;gBAAE,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACjH,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,EAAE,CAAC;gBACjC,cAAc,CAAC,gBAAgB,CAAC,WAAW,EAAE,iCAAiC,CAAC,CAAA;gBAC/E,OAAM;YACR,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;YAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,cAAc,CAAC,gBAAgB,CAAC,WAAW,EAAE,oCAAoC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAA;gBAC3G,OAAM;YACR,CAAC;YAED,IAAI,CAAC,CAAC,MAAM,cAAc,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;gBAC7D,cAAc,CAAC,gBAAgB,CAAC,WAAW,EAAE,gEAAgE,CAAC,CAAA;gBAC9G,OAAM;YACR,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;gBAClG,IAAI,CAAC,cAAc;oBAAE,cAAc,CAAC,yCAAyC,CAAC,CAAA;gBAE9E,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YAChC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,cAAc,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;YACrD,CAAC;QACH,CAAC,CAAA;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,WAAW,CAAC,CAAC,CAAA;QAC5F,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAA;IACxC,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,OAAgB,EAAE,WAAkD;QAClG,IAAI,CAAC,OAAO,CAAC,aAAa;YAAE,OAAO,IAAI,CAAA;QAEvC,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAC3F,IAAI,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAA;YAEzB,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACtC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAC1E,CAAA;QACH,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,WAAwC,EAAE,KAAc;QACtF,IAAI,YAAoB,CAAA;QACxB,IAAI,KAAK,YAAY,SAAS;YAAE,YAAY,GAAG,KAAK,CAAC,OAAO,CAAA;aACvD,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK;YAAE,YAAY,GAAG,KAAK,CAAC,KAAK,CAAA;;YACrE,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;QAEjC,MAAM,OAAO,GAAG,yDAAyD,YAAY,QAAQ,CAAA;QAC7F,MAAM,sBAAsB,GAAG,KAAK,IAAI,EAAE;YACxC,MAAM,CAAC,WAAW,CAAC,QAAQ;gBACzB,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACrD,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;QAClG,CAAC,CAAA;QACD,KAAK,sBAAsB,EAAE,CAAA;IAC/B,CAAC;CACF;AAED,OAAO,EAAE,cAAc,EAAE,CAAA"}
@@ -12,17 +12,20 @@ class EventManager {
12
12
  }
13
13
  _listen() {
14
14
  for (const event of this.#events) {
15
- this.#discord.client.on(event.event, async (...args) => {
15
+ const listen = async (...args) => {
16
16
  try {
17
+ // TS Error: Expression produces a union type that is too complex to represent.
18
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
17
19
  await event.handler(this.#discord.client, ...args);
18
20
  }
19
21
  catch (error) {
20
22
  console.error(error);
21
23
  }
22
- });
24
+ };
25
+ this.#discord.client.on(event.event, (...args) => void listen(...args));
23
26
  }
24
- console.log(`Listening for (${this.#events.length}) events.`);
27
+ console.log(`Listening for (${this.#events.length.toString()}) events.`);
25
28
  }
26
29
  }
27
- export default EventManager;
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ldmVudC1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQSxNQUFNLFlBQVk7SUFDaEIsT0FBTyxHQUFrQixFQUFFLENBQUE7SUFDM0IsUUFBUSxDQUFnQjtJQUV4QixZQUFZLE9BQXVCO1FBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFBO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILEdBQUcsQ0FBd0IsS0FBcUI7UUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDMUIsQ0FBQztJQUVELE9BQU87UUFDTCxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxFQUFFLEVBQUU7Z0JBQ3JELElBQUk7b0JBQ0YsTUFBTyxLQUFLLENBQUMsT0FBd0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFBO2lCQUNyRTtnQkFBQyxPQUFPLEtBQUssRUFBRTtvQkFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO2lCQUNyQjtZQUNILENBQUMsQ0FBQyxDQUFBO1NBQ0g7UUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sV0FBVyxDQUFDLENBQUE7SUFDL0QsQ0FBQztDQUNGO0FBTUQsZUFBZSxZQUFZLENBQUEifQ==
30
+ export { EventManager };
31
+ //# sourceMappingURL=event-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-manager.js","sourceRoot":"","sources":["../src/event-manager.ts"],"names":[],"mappings":"AAoBA,MAAM,YAAY;IACP,OAAO,GAAkB,EAAE,CAAA;IAC3B,QAAQ,CAAgB;IAEjC,YAAmB,OAAuB;QACxC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;IACzB,CAAC;IAED;;OAEG;IACI,GAAG,CAAwB,KAAqB;QACrD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC1B,CAAC;IAEM,OAAO;QACZ,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,KAAK,EAAE,GAAG,IAAsC,EAAE,EAAE;gBACjE,IAAI,CAAC;oBACH,+EAA+E;oBAC/E,uEAAuE;oBACvE,MAAO,KAAK,CAAC,OAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAA;gBACtE,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBACtB,CAAC;YACH,CAAC,CAAA;YAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QACzE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAA;IAC1E,CAAC;CACF;AAMD,OAAO,EAAE,YAAY,EAAE,CAAA"}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { default } from "./bot.js";
1
+ export { Bot } from "./bot.js";
2
2
  export { getChannel, throwError, throwUserError } from "./util.js";
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQUdsQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUEifQ==
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAG9B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA"}
@@ -1,6 +1,6 @@
1
- import { Client, ClientOptions, REST } from "discord.js";
2
- import CommandManager from "./command-manager.js";
3
- import EventManager from "./event-manager.js";
1
+ import { Client, REST, type ClientOptions } from "discord.js";
2
+ import { CommandManager } from "./command-manager.js";
3
+ import { EventManager } from "./event-manager.js";
4
4
  interface BotOptions {
5
5
  applicationId: string;
6
6
  token: string;
@@ -19,5 +19,5 @@ declare class Bot {
19
19
  constructor(options: BotOptions);
20
20
  login(): Promise<void>;
21
21
  }
22
- export default Bot;
22
+ export { Bot };
23
23
  export type { BotOptions, DiscordContext };
@@ -1,5 +1,5 @@
1
- import { ChatInputCommandInteraction, RESTPostAPIChatInputApplicationCommandsJSONBody } from "discord.js";
2
- import { DiscordContext } from "./bot.js";
1
+ import { type ChatInputCommandInteraction, type RESTPostAPIChatInputApplicationCommandsJSONBody } from "discord.js";
2
+ import type { DiscordContext } from "./bot.js";
3
3
  interface Command {
4
4
  requiredRoles?: string[];
5
5
  command: RESTPostAPIChatInputApplicationCommandsJSONBody;
@@ -16,8 +16,8 @@ declare class CommandManager {
16
16
  private _unregisterGuildCommands;
17
17
  unregisterApplicationCommands(): Promise<void>;
18
18
  _listen(): void;
19
- private checkRoles;
20
- private interactionReply;
19
+ private static checkRoles;
20
+ private static interactionReply;
21
21
  }
22
- export default CommandManager;
22
+ export { CommandManager };
23
23
  export type { Command, CommandHook };
@@ -1,6 +1,6 @@
1
- import { Client, ClientEvents, Events } from "discord.js";
2
- import { DiscordContext } from "./bot.js";
3
- type ValidEvents = Exclude<Events, Events.VoiceServerUpdate | Events.Raw>;
1
+ import type { Client, ClientEvents } from "discord.js";
2
+ import type { DiscordContext } from "./bot.js";
3
+ type ValidEvents = keyof ClientEvents;
4
4
  type EventHandler<E extends ValidEvents = ValidEvents> = (client: Client, ...args: ClientEvents[E]) => void | Promise<void>;
5
5
  type EventHandlerMap = {
6
6
  [E in ValidEvents]: EventHandler<E>;
@@ -18,5 +18,5 @@ declare class EventManager {
18
18
  type Event = {
19
19
  [E in ValidEvents]: SingleEvent<E>;
20
20
  }[ValidEvents];
21
- export default EventManager;
21
+ export { EventManager };
22
22
  export type { Event };
@@ -1,4 +1,4 @@
1
- export { default } from "./bot.js";
1
+ export { Bot } from "./bot.js";
2
2
  export type { Command, CommandHook } from "./command-manager.js";
3
3
  export type { Event } from "./event-manager.js";
4
4
  export { getChannel, throwError, throwUserError } from "./util.js";
@@ -1,4 +1,4 @@
1
- import { CategoryChannel, ChannelType, ForumChannel, Guild, NewsChannel, StageChannel, TextChannel, VoiceChannel } from "discord.js";
1
+ import type { CategoryChannel, ChannelType, ForumChannel, Guild, NewsChannel, StageChannel, TextChannel, VoiceChannel } from "discord.js";
2
2
  interface ChannelTypeToChannelMap {
3
3
  [ChannelType.GuildCategory]: CategoryChannel;
4
4
  [ChannelType.GuildAnnouncement]: NewsChannel;
@@ -7,8 +7,38 @@ interface ChannelTypeToChannelMap {
7
7
  [ChannelType.GuildVoice]: VoiceChannel;
8
8
  [ChannelType.GuildForum]: ForumChannel;
9
9
  }
10
+ /**
11
+ * Returns the guild channel of the given name/ID and type, otherwise throws.
12
+ *
13
+ * @param guild The Guild to fetch the channel from
14
+ * @param channelNameOrId The name or ID of the channel to fetch
15
+ * @param channelType The type of channel to fetch
16
+ * @returns The channel of the given name/ID and type
17
+ * @example
18
+ * ```ts
19
+ * import { getChannel } from "discord-bot-shared"
20
+ * import { ChannelType } from "discord.js"
21
+ *
22
+ * // guild is of type Guild from discord.js
23
+ * const someTextChannel = await getChannel(guild, "some-text-channel", ChannelType.GuildText)
24
+ * ```
25
+ *
26
+ * Getting a properly typed channel with discord.js can be a bit of a pain, so this is an alternative.
27
+ */
10
28
  declare function getChannel<T extends keyof ChannelTypeToChannelMap>(guild: Guild, channelNameOrId: string, channelType: T): Promise<ChannelTypeToChannelMap[T]>;
29
+ /**
30
+ * Throws an error with the given message.
31
+ *
32
+ * @param message The message to throw
33
+ * @throws Error
34
+ */
11
35
  declare function throwError(message: string): never;
36
+ /**
37
+ * Throws a UserError with the given message.
38
+ *
39
+ * @param message The message to throw
40
+ * @throws UserError
41
+ */
12
42
  declare function throwUserError(message: string): never;
13
43
  declare class UserError extends Error {
14
44
  constructor(message: string);
package/dist/util.js CHANGED
@@ -1,27 +1,58 @@
1
- import { ChannelType, } from "discord.js";
1
+ /**
2
+ * Returns the guild channel of the given name/ID and type, otherwise throws.
3
+ *
4
+ * @param guild The Guild to fetch the channel from
5
+ * @param channelNameOrId The name or ID of the channel to fetch
6
+ * @param channelType The type of channel to fetch
7
+ * @returns The channel of the given name/ID and type
8
+ * @example
9
+ * ```ts
10
+ * import { getChannel } from "discord-bot-shared"
11
+ * import { ChannelType } from "discord.js"
12
+ *
13
+ * // guild is of type Guild from discord.js
14
+ * const someTextChannel = await getChannel(guild, "some-text-channel", ChannelType.GuildText)
15
+ * ```
16
+ *
17
+ * Getting a properly typed channel with discord.js can be a bit of a pain, so this is an alternative.
18
+ */
2
19
  async function getChannel(guild, channelNameOrId, channelType) {
3
20
  const channels = await guild.channels.fetch();
4
21
  let channel;
5
- channel = channels.find((channel) => (channel ? channel.name === channelNameOrId : false));
22
+ channel = channels.find((chan) => (chan ? chan.name === channelNameOrId : false));
23
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
6
24
  if (channel && channel.type === channelType)
7
25
  return channel;
8
26
  channel = channels.get(channelNameOrId);
27
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
9
28
  if (channel && channel.type === channelType)
10
29
  return channel;
11
30
  throwError(`Failed to get channel: ${channelNameOrId}`);
12
31
  }
32
+ /**
33
+ * Throws an error with the given message.
34
+ *
35
+ * @param message The message to throw
36
+ * @throws Error
37
+ */
13
38
  function throwError(message) {
14
39
  throw new Error(message);
15
40
  }
41
+ /**
42
+ * Throws a UserError with the given message.
43
+ *
44
+ * @param message The message to throw
45
+ * @throws UserError
46
+ */
16
47
  function throwUserError(message) {
17
48
  throw new UserError(message);
18
49
  }
19
50
  class UserError extends Error {
20
51
  constructor(message) {
21
52
  super(message);
22
- this.name = this.constructor.name;
53
+ this.name = "UserError";
23
54
  Object.setPrototypeOf(this, new.target.prototype);
24
55
  }
25
56
  }
26
57
  export { UserError, getChannel, throwError, throwUserError };
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxXQUFXLEdBUVosTUFBTSxZQUFZLENBQUE7QUFXbkIsS0FBSyxVQUFVLFVBQVUsQ0FDdkIsS0FBWSxFQUNaLGVBQXVCLEVBQ3ZCLFdBQWM7SUFFZCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUE7SUFFN0MsSUFBSSxPQUFzRCxDQUFBO0lBQzFELE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDMUYsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXO1FBQUUsT0FBTyxPQUFxQyxDQUFBO0lBRXpGLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQ3ZDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssV0FBVztRQUFFLE9BQU8sT0FBcUMsQ0FBQTtJQUV6RixVQUFVLENBQUMsMEJBQTBCLGVBQWUsRUFBRSxDQUFDLENBQUE7QUFDekQsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLE9BQWU7SUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUMxQixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsT0FBZTtJQUNyQyxNQUFNLElBQUksU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQzlCLENBQUM7QUFFRCxNQUFNLFNBQVUsU0FBUSxLQUFLO0lBQzNCLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFBO1FBRWpDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDbkQsQ0FBQztDQUNGO0FBRUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxDQUFBIn0=
58
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAqBA;;;;;;;;;;;;;;;;;GAiBG;AACH,KAAK,UAAU,UAAU,CACvB,KAAY,EACZ,eAAuB,EACvB,WAAc;IAEd,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IAE7C,IAAI,OAAsD,CAAA;IAC1D,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAA;IACjF,uEAAuE;IACvE,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,OAAqC,CAAA;IAEzF,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;IACvC,uEAAuE;IACvE,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,OAAqC,CAAA;IAEzF,UAAU,CAAC,0BAA0B,eAAe,EAAE,CAAC,CAAA;AACzD,CAAC;AAED;;;;;GAKG;AACH,SAAS,UAAU,CAAC,OAAe;IACjC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA;AAC1B,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,OAAe;IACrC,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,CAAA;AAC9B,CAAC;AAED,MAAM,SAAU,SAAQ,KAAK;IAC3B,YAAmB,OAAe;QAChC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,WAAW,CAAA;QAEvB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACnD,CAAC;CACF;AAED,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,CAAA"}
package/package.json CHANGED
@@ -1,40 +1,47 @@
1
1
  {
2
2
  "name": "discord-bot-shared",
3
- "version": "0.14.0",
3
+ "version": "0.14.2",
4
4
  "type": "module",
5
5
  "description": "Modules for creating discord bots.",
6
- "repository": "github:adamhl8/discord-bot-shared",
7
- "author": "adamhl8",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/adamhl8/discord-bot-shared"
9
+ },
10
+ "homepage": "https://github.com/adamhl8/discord-bot-shared",
11
+ "bugs": {
12
+ "url": "https://github.com/adamhl8/discord-bot-shared/issues"
13
+ },
14
+ "author": {
15
+ "email": "adamhl@pm.me",
16
+ "name": "Adam Langbert",
17
+ "url": "https://github.com/adamhl8"
18
+ },
8
19
  "license": "MIT",
9
- "main": "dist/index.js",
10
- "types": "dist/types/index.d.ts",
20
+ "exports": {
21
+ ".": {
22
+ "import": "./dist/index.js",
23
+ "types": "./dist/types/index.d.ts"
24
+ }
25
+ },
11
26
  "files": [
12
- "dist/",
13
- "README.md",
14
- "LICENSE"
27
+ "dist/"
15
28
  ],
29
+ "scripts": {
30
+ "bundle": "bun lint && rm -rf ./dist && tsc -p ./tsconfig.build.json",
31
+ "lint": "tsc --noEmit && prettier --write . && eslint .",
32
+ "prepare": "find .githooks -type f -exec ln -srf {} .git/hooks/ \\;",
33
+ "prepublish": "bun bundle"
34
+ },
16
35
  "peerDependencies": {
17
36
  "discord.js": "^14.0.0"
18
37
  },
19
38
  "devDependencies": {
20
- "@types/node": "^20.6.2",
21
- "@typescript-eslint/eslint-plugin": "^6.7.0",
22
- "@typescript-eslint/parser": "^6.7.0",
23
- "discord.js": "^14.13.0",
24
- "eslint": "^8.49.0",
25
- "eslint-config-prettier": "^9.0.0",
26
- "eslint-plugin-sonarjs": "^0.21.0",
27
- "eslint-plugin-unicorn": "^48.0.1",
28
- "prettier": "^3.0.3",
29
- "prettier-plugin-organize-imports": "^3.2.3",
30
- "prettier-plugin-pkg": "^0.18.0",
31
- "prettier-plugin-sh": "^0.13.1",
32
- "typescript": "^5.2.2"
33
- },
34
- "scripts": {
35
- "build": "rm -rf dist && tsc",
36
- "format": "prettier --write .",
37
- "lint": "tsc --noEmit && eslint ./src/",
38
- "prepublish": "pnpm build"
39
+ "@types/bun": "^1.2.17",
40
+ "discord.js": "^14.21.0",
41
+ "eslint": "^9.29.0",
42
+ "eslint-config-builder": "^0.21.2",
43
+ "prettier": "^3.6.1",
44
+ "typescript": "^5.8.3",
45
+ "typescript-eslint": "^8.35.0"
39
46
  }
40
- }
47
+ }