commandkit 1.2.0-dev.20250819020008 → 1.2.0-dev.20250819125017

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 (117) hide show
  1. package/dist/{EventWorkerContext-C7CG7hIP.d.ts → EventWorkerContext-DiMpRt1P.d.ts} +2 -2
  2. package/dist/analytics/analytics-engine.d.ts +1 -1
  3. package/dist/analytics/analytics-engine.js +1 -1
  4. package/dist/analytics/analytics-provider.d.ts +1 -1
  5. package/dist/analytics/utils.js +1 -1
  6. package/dist/{analytics-engine-nkyqvYAE.d.ts → analytics-engine-Ddw9axi4.d.ts} +82 -10
  7. package/dist/app/commands/AppCommandRunner.d.ts +1 -1
  8. package/dist/app/commands/AppCommandRunner.js +1 -1
  9. package/dist/app/commands/Context.d.ts +1 -1
  10. package/dist/app/commands/Context.js +1 -1
  11. package/dist/app/events/EventWorkerContext.d.ts +2 -2
  12. package/dist/app/handlers/AppCommandHandler.d.ts +1 -1
  13. package/dist/app/handlers/AppCommandHandler.js +1 -1
  14. package/dist/app/handlers/AppEventsHandler.d.ts +1 -1
  15. package/dist/app/handlers/AppEventsHandler.js +1 -1
  16. package/dist/app/index.d.ts +1 -1
  17. package/dist/app/index.js +1 -1
  18. package/dist/app/middlewares/permissions.d.ts +42 -0
  19. package/dist/app/middlewares/permissions.js +38 -0
  20. package/dist/app/register/CommandRegistrar.d.ts +1 -1
  21. package/dist/app/register/CommandRegistrar.js +1 -1
  22. package/dist/{app-process-CjMovpoZ.js → app-process-COBre_uT.js} +2 -2
  23. package/dist/{app-process-CjMovpoZ.js.map → app-process-COBre_uT.js.map} +1 -1
  24. package/dist/{build-BoGqWPIS.js → build-n8Om7nnR.js} +4 -4
  25. package/dist/{build-BoGqWPIS.js.map → build-n8Om7nnR.js.map} +1 -1
  26. package/dist/cli/app-process.js +2 -2
  27. package/dist/cli/build.d.ts +1 -1
  28. package/dist/cli/build.js +4 -4
  29. package/dist/cli/common.d.ts +1 -1
  30. package/dist/cli/development.js +5 -5
  31. package/dist/cli/env.js +1 -1
  32. package/dist/cli/information.js +1 -1
  33. package/dist/cli/init.js +2 -2
  34. package/dist/cli/production.js +6 -6
  35. package/dist/cli/type-checker.js +1 -1
  36. package/dist/cli/utils.js +1 -1
  37. package/dist/{commandkit-5VMG2thU.js → commandkit-C0BuNRSN.js} +185 -29
  38. package/dist/commandkit-C0BuNRSN.js.map +1 -0
  39. package/dist/commandkit.d.ts +1 -1
  40. package/dist/commandkit.js +1 -1
  41. package/dist/components/index.js +1 -1
  42. package/dist/components/v1/button/Button.js +1 -1
  43. package/dist/components/v1/button/ButtonKit.js +1 -1
  44. package/dist/components/v1/modal/Modal.js +1 -1
  45. package/dist/components/v1/modal/ModalKit.js +1 -1
  46. package/dist/components/v1/select-menu/ChannelSelectMenuKit.js +1 -1
  47. package/dist/components/v1/select-menu/MentionableSelectMenuKit.js +1 -1
  48. package/dist/components/v1/select-menu/RoleSelectMenuKit.js +1 -1
  49. package/dist/components/v1/select-menu/SelectMenu.js +1 -1
  50. package/dist/components/v1/select-menu/StringSelectMenuKit.js +1 -1
  51. package/dist/components/v1/select-menu/UserSelectMenuKit.js +1 -1
  52. package/dist/config/config.d.ts +2 -2
  53. package/dist/config/config.js +1 -1
  54. package/dist/config/default.d.ts +1 -1
  55. package/dist/config/default.js +1 -1
  56. package/dist/config/loader.d.ts +1 -1
  57. package/dist/config/loader.js +1 -1
  58. package/dist/config/types.d.ts +1 -1
  59. package/dist/config/utils.d.ts +1 -1
  60. package/dist/{config-C1msSu1G.d.ts → config-C4nHXErw.d.ts} +2 -2
  61. package/dist/{constants-4oxxvaJA.js → constants-_QEzyskw.js} +1 -1
  62. package/dist/{constants-4oxxvaJA.js.map → constants-_QEzyskw.js.map} +1 -1
  63. package/dist/context/async-context.d.ts +1 -1
  64. package/dist/context/async-context.js +1 -1
  65. package/dist/context/environment.d.ts +1 -1
  66. package/dist/context/environment.js +1 -1
  67. package/dist/{dotprops-C_4L7RPD.js → dotprops-HH5qmrql.js} +1 -1
  68. package/dist/{dotprops-C_4L7RPD.js.map → dotprops-HH5qmrql.js.map} +1 -1
  69. package/dist/{env-_68PRRoA.js → env-8yY-6pbC.js} +1 -1
  70. package/dist/{env-_68PRRoA.js.map → env-8yY-6pbC.js.map} +1 -1
  71. package/dist/events/CommandKitEventsChannel.d.ts +1 -1
  72. package/dist/{feature-flags-C44dggkN.js → feature-flags-BZMExGfA.js} +2 -2
  73. package/dist/{feature-flags-C44dggkN.js.map → feature-flags-BZMExGfA.js.map} +1 -1
  74. package/dist/flags/FlagProvider.d.ts +1 -1
  75. package/dist/flags/feature-flags.d.ts +1 -1
  76. package/dist/flags/feature-flags.js +2 -2
  77. package/dist/flags/store.d.ts +1 -1
  78. package/dist/index.d.ts +4 -4
  79. package/dist/index.js +4 -4
  80. package/dist/{init-ZjceQTSt.js → init-D20FhDjn.js} +2 -2
  81. package/dist/{init-ZjceQTSt.js.map → init-D20FhDjn.js.map} +1 -1
  82. package/dist/kv/constants.js +1 -1
  83. package/dist/kv/dotprops.js +1 -1
  84. package/dist/kv/kv.js +3 -3
  85. package/dist/kv/serde.js +2 -2
  86. package/dist/logger/DefaultLogger.js +1 -1
  87. package/dist/logger/Logger.js +1 -1
  88. package/dist/plugins/CompilerPlugin.d.ts +1 -1
  89. package/dist/plugins/PluginCommon.d.ts +1 -1
  90. package/dist/plugins/RuntimePlugin.d.ts +1 -1
  91. package/dist/plugins/index.d.ts +1 -1
  92. package/dist/plugins/index.js +1 -1
  93. package/dist/plugins/plugin-runtime/CommandKitPluginRuntime.d.ts +1 -1
  94. package/dist/plugins/plugin-runtime/CommandKitPluginRuntime.js +1 -1
  95. package/dist/plugins/plugin-runtime/CompilerPluginRuntime.d.ts +1 -1
  96. package/dist/plugins/plugin-runtime/CompilerPluginRuntime.js +1 -1
  97. package/dist/plugins/plugin-runtime/builtin/CommonDirectiveTransformer.d.ts +1 -1
  98. package/dist/plugins/plugin-runtime/builtin/CommonDirectiveTransformer.js +1 -1
  99. package/dist/plugins/plugin-runtime/builtin/MacroPlugin.d.ts +1 -1
  100. package/dist/plugins/plugin-runtime/builtin/MacroPlugin.js +1 -1
  101. package/dist/plugins/plugin-runtime/runtime.d.ts +1 -1
  102. package/dist/plugins/types.d.ts +1 -1
  103. package/dist/{serde-CHySNpFr.js → serde-CrxRqj3u.js} +2 -2
  104. package/dist/{serde-CHySNpFr.js.map → serde-CrxRqj3u.js.map} +1 -1
  105. package/dist/{type-checker-1Iu1jJcy.js → type-checker-BIOeyY9g.js} +1 -1
  106. package/dist/{type-checker-1Iu1jJcy.js.map → type-checker-BIOeyY9g.js.map} +1 -1
  107. package/dist/types.d.ts +2 -2
  108. package/dist/utils/dev-hooks.d.ts +1 -1
  109. package/dist/utils/dev-hooks.js +1 -1
  110. package/dist/utils/utilities.js +1 -1
  111. package/dist/{utils-DCSnVAZ6.js → utils-Bf-3Eevb.js} +1 -1
  112. package/dist/{utils-DCSnVAZ6.js.map → utils-Bf-3Eevb.js.map} +1 -1
  113. package/dist/{version-eRVLZxyL.js → version-CXwQ7AXt.js} +2 -2
  114. package/dist/{version-eRVLZxyL.js.map → version-CXwQ7AXt.js.map} +1 -1
  115. package/dist/version.js +1 -1
  116. package/package.json +2 -2
  117. package/dist/commandkit-5VMG2thU.js.map +0 -1
package/dist/cli/init.js CHANGED
@@ -1,7 +1,7 @@
1
1
  require('../colors-Cd4Oz-r-.js');
2
2
  require('../ActionRow-CmTHbo2t.js');
3
3
  require('../error-codes-C-ViHyu-.js');
4
- require('../commandkit-5VMG2thU.js');
4
+ require('../commandkit-C0BuNRSN.js');
5
5
  require('../common-CcfjYnPG.js');
6
6
  require('../common-vnMIelAE.js');
7
7
  require('../container-z621KfH5.js');
@@ -33,6 +33,6 @@ require('../router-DHnFRADH.js');
33
33
  require('../common-DNADUU3_.js');
34
34
  require('../CommandKitEventsChannel-Bgw0XCOl.js');
35
35
  require('../store-CiqLHedg.js');
36
- const require_init = require('../init-ZjceQTSt.js');
36
+ const require_init = require('../init-D20FhDjn.js');
37
37
 
38
38
  exports.bootstrapCommandkitCLI = require_init.bootstrapCommandkitCLI;
@@ -2,7 +2,7 @@ const require_chunk = require('../chunk-nOFOJqeH.js');
2
2
  require('../colors-Cd4Oz-r-.js');
3
3
  require('../ActionRow-CmTHbo2t.js');
4
4
  require('../error-codes-C-ViHyu-.js');
5
- const require_commandkit = require('../commandkit-5VMG2thU.js');
5
+ const require_commandkit = require('../commandkit-C0BuNRSN.js');
6
6
  require('../common-CcfjYnPG.js');
7
7
  require('../common-vnMIelAE.js');
8
8
  require('../container-z621KfH5.js');
@@ -34,11 +34,11 @@ require('../router-DHnFRADH.js');
34
34
  const require_common$2 = require('../common-DNADUU3_.js');
35
35
  require('../CommandKitEventsChannel-Bgw0XCOl.js');
36
36
  require('../store-CiqLHedg.js');
37
- require('../env-_68PRRoA.js');
38
- const require_app_process = require('../app-process-CjMovpoZ.js');
39
- require('../type-checker-1Iu1jJcy.js');
40
- const require_build = require('../build-BoGqWPIS.js');
41
- const require_utils$1 = require('../utils-DCSnVAZ6.js');
37
+ require('../env-8yY-6pbC.js');
38
+ const require_app_process = require('../app-process-COBre_uT.js');
39
+ require('../type-checker-BIOeyY9g.js');
40
+ const require_build = require('../build-n8Om7nnR.js');
41
+ const require_utils$1 = require('../utils-Bf-3Eevb.js');
42
42
  const fs = require_chunk.__toESM(require("fs"));
43
43
 
44
44
  //#region src/cli/production.ts
@@ -2,6 +2,6 @@ require('../colors-Cd4Oz-r-.js');
2
2
  require('../constants-B5_Ta7PR.js');
3
3
  require('../types-package-DrnIdWLg.js');
4
4
  require('../common-DNADUU3_.js');
5
- const require_type_checker = require('../type-checker-1Iu1jJcy.js');
5
+ const require_type_checker = require('../type-checker-BIOeyY9g.js');
6
6
 
7
7
  exports.performTypeCheck = require_type_checker.performTypeCheck;
package/dist/cli/utils.js CHANGED
@@ -1,3 +1,3 @@
1
- const require_utils = require('../utils-DCSnVAZ6.js');
1
+ const require_utils = require('../utils-Bf-3Eevb.js');
2
2
 
3
3
  exports.createSpinner = require_utils.createSpinner;
@@ -1723,6 +1723,7 @@ const defaultConfig = {
1723
1723
  },
1724
1724
  typedCommands: true,
1725
1725
  disablePrefixCommands: false,
1726
+ disablePermissionsMiddleware: false,
1726
1727
  showUnknownPrefixCommandsWarning: true,
1727
1728
  antiCrashScript: {
1728
1729
  development: true,
@@ -1781,7 +1782,8 @@ function defineConfig(config = {}) {
1781
1782
  antiCrashScript: {
1782
1783
  ...defaultConfig.antiCrashScript,
1783
1784
  ...config.antiCrashScript
1784
- }
1785
+ },
1786
+ disablePermissionsMiddleware: config.disablePermissionsMiddleware ?? defaultConfig.disablePermissionsMiddleware
1785
1787
  };
1786
1788
  return defined;
1787
1789
  }
@@ -2650,20 +2652,26 @@ var CommandRegistrar = class {
2650
2652
  const commands = handler.getCommandsArray();
2651
2653
  return commands.flatMap((cmd) => {
2652
2654
  const json$1 = "toJSON" in cmd.data.command ? cmd.data.command.toJSON() : cmd.data.command;
2653
- const collections = [json$1];
2655
+ const __metadata = cmd.metadata ?? cmd.data.metadata;
2656
+ const collections = [{
2657
+ ...json$1,
2658
+ __metadata
2659
+ }];
2654
2660
  if (cmd.data.userContextMenu && json$1.type !== discord_js.ApplicationCommandType.User) collections.push({
2655
2661
  ...json$1,
2656
2662
  type: discord_js.ApplicationCommandType.User,
2657
2663
  options: void 0,
2658
2664
  description_localizations: void 0,
2659
- description: void 0
2665
+ description: void 0,
2666
+ __metadata
2660
2667
  });
2661
2668
  if (cmd.data.messageContextMenu && json$1.type !== discord_js.ApplicationCommandType.Message) collections.push({
2662
2669
  ...json$1,
2663
2670
  type: discord_js.ApplicationCommandType.Message,
2664
2671
  description_localizations: void 0,
2665
2672
  description: void 0,
2666
- options: void 0
2673
+ options: void 0,
2674
+ __metadata
2667
2675
  });
2668
2676
  return collections;
2669
2677
  });
@@ -2687,18 +2695,18 @@ var CommandRegistrar = class {
2687
2695
  if (preRegistrationPrevented) return;
2688
2696
  if (!this.commandkit.client.isReady()) throw new Error("Cannot register commands before the client is ready");
2689
2697
  const guildCommands = commands.filter((command) => {
2690
- var _command$guilds;
2691
- return (_command$guilds = command.guilds) === null || _command$guilds === void 0 ? void 0 : _command$guilds.filter(Boolean).length;
2698
+ var _command$__metadata;
2699
+ return (_command$__metadata = command.__metadata) === null || _command$__metadata === void 0 || (_command$__metadata = _command$__metadata.guilds) === null || _command$__metadata === void 0 ? void 0 : _command$__metadata.filter(Boolean).length;
2692
2700
  }).map((c) => {
2693
- var _c$guilds;
2701
+ var _c$__metadata;
2694
2702
  return {
2695
2703
  ...c,
2696
- guilds: Array.from(new Set((_c$guilds = c.guilds) === null || _c$guilds === void 0 ? void 0 : _c$guilds.filter(Boolean)))
2704
+ guilds: Array.from(new Set((_c$__metadata = c.__metadata) === null || _c$__metadata === void 0 || (_c$__metadata = _c$__metadata.guilds) === null || _c$__metadata === void 0 ? void 0 : _c$__metadata.filter(Boolean)))
2697
2705
  };
2698
2706
  });
2699
2707
  const globalCommands = commands.filter((command) => {
2700
- var _command$guilds2;
2701
- return !((_command$guilds2 = command.guilds) === null || _command$guilds2 === void 0 ? void 0 : _command$guilds2.filter(Boolean).length);
2708
+ var _command$__metadata2;
2709
+ return !((_command$__metadata2 = command.__metadata) === null || _command$__metadata2 === void 0 || (_command$__metadata2 = _command$__metadata2.guilds) === null || _command$__metadata2 === void 0 ? void 0 : _command$__metadata2.filter(Boolean).length);
2702
2710
  });
2703
2711
  await this.updateGlobalCommands(globalCommands);
2704
2712
  await this.updateGuildCommands(guildCommands);
@@ -2722,7 +2730,7 @@ var CommandRegistrar = class {
2722
2730
  try {
2723
2731
  const data = await this.api.put(discord_js.Routes.applicationCommands(this.commandkit.client.user.id), { body: commands.map((c) => ({
2724
2732
  ...c,
2725
- guilds: void 0
2733
+ __metadata: void 0
2726
2734
  })) });
2727
2735
  Logger.info(`✨ Refreshed ${data.length} global application (/) commands`);
2728
2736
  } catch (e) {
@@ -2749,9 +2757,9 @@ var CommandRegistrar = class {
2749
2757
  try {
2750
2758
  const guildCommandsMap = /* @__PURE__ */ new Map();
2751
2759
  commands.forEach((command) => {
2752
- var _command$guilds3;
2753
- if (!((_command$guilds3 = command.guilds) === null || _command$guilds3 === void 0 ? void 0 : _command$guilds3.length)) return;
2754
- command.guilds.forEach((guild) => {
2760
+ var _command$__metadata3, _command$__metadata4;
2761
+ if (!((_command$__metadata3 = command.__metadata) === null || _command$__metadata3 === void 0 || (_command$__metadata3 = _command$__metadata3.guilds) === null || _command$__metadata3 === void 0 ? void 0 : _command$__metadata3.length)) return;
2762
+ (_command$__metadata4 = command.__metadata) === null || _command$__metadata4 === void 0 || (_command$__metadata4 = _command$__metadata4.guilds) === null || _command$__metadata4 === void 0 || _command$__metadata4.forEach((guild) => {
2755
2763
  if (!guildCommandsMap.has(guild)) guildCommandsMap.set(guild, []);
2756
2764
  guildCommandsMap.get(guild).push(command);
2757
2765
  });
@@ -2773,7 +2781,7 @@ var CommandRegistrar = class {
2773
2781
  if (prevented$1) continue;
2774
2782
  const data = await this.api.put(discord_js.Routes.applicationGuildCommands(this.commandkit.client.user.id, guild), { body: guildCommands.map((b) => ({
2775
2783
  ...b,
2776
- guilds: void 0
2784
+ __metadata: void 0
2777
2785
  })) });
2778
2786
  count += data.length;
2779
2787
  }
@@ -2784,8 +2792,91 @@ var CommandRegistrar = class {
2784
2792
  }
2785
2793
  };
2786
2794
 
2795
+ //#endregion
2796
+ //#region src/app/middlewares/permissions.ts
2797
+ const middlewareId = crypto.randomUUID();
2798
+ /**
2799
+ * @private
2800
+ * @ignore
2801
+ */
2802
+ async function beforeExecute(ctx) {
2803
+ var _interaction$channel, _message$channel, _message$member, _command$metadata, _interaction$guild, _message$guild, _command$metadata2;
2804
+ if (getConfig().disablePermissionsMiddleware) return;
2805
+ const { interaction, message, command } = ctx;
2806
+ if (interaction && !interaction.isCommand()) return;
2807
+ if (interaction && ((_interaction$channel = interaction.channel) === null || _interaction$channel === void 0 ? void 0 : _interaction$channel.isDMBased()) || message && ((_message$channel = message.channel) === null || _message$channel === void 0 ? void 0 : _message$channel.isDMBased())) {
2808
+ const channel = (interaction === null || interaction === void 0 ? void 0 : interaction.channel) ?? (message === null || message === void 0 ? void 0 : message.channel);
2809
+ const embed$1 = new discord_js.EmbedBuilder().setTitle(":x: Server-only command!").setDescription("This command can only be used in a server.").setColor("Red");
2810
+ try {
2811
+ if (channel === null || channel === void 0 ? void 0 : channel.isSendable()) if (interaction && interaction.isRepliable()) await interaction.reply({
2812
+ embeds: [embed$1],
2813
+ flags: discord_js.MessageFlags.Ephemeral
2814
+ });
2815
+ else await message.reply({ embeds: [embed$1] });
2816
+ } catch (error) {
2817
+ Logger.error(`Could not send 'Server-only command' DM to user ${(interaction === null || interaction === void 0 ? void 0 : interaction.user.id) ?? (message === null || message === void 0 ? void 0 : message.author.id)} for command ${command.command.name}.`, error);
2818
+ }
2819
+ return ctx.cancel();
2820
+ }
2821
+ const userPermissions = (interaction === null || interaction === void 0 ? void 0 : interaction.memberPermissions) ?? (message === null || message === void 0 || (_message$member = message.member) === null || _message$member === void 0 ? void 0 : _message$member.permissions);
2822
+ let userPermissionsRequired = ((_command$metadata = command.metadata) === null || _command$metadata === void 0 ? void 0 : _command$metadata.userPermissions) ?? [];
2823
+ let missingUserPermissions = [];
2824
+ if (typeof userPermissionsRequired === "string") userPermissionsRequired = [userPermissionsRequired];
2825
+ const botPermissions = (interaction === null || interaction === void 0 || (_interaction$guild = interaction.guild) === null || _interaction$guild === void 0 || (_interaction$guild = _interaction$guild.members.me) === null || _interaction$guild === void 0 ? void 0 : _interaction$guild.permissions) ?? (message === null || message === void 0 || (_message$guild = message.guild) === null || _message$guild === void 0 || (_message$guild = _message$guild.members.me) === null || _message$guild === void 0 ? void 0 : _message$guild.permissions);
2826
+ let botPermissionsRequired = ((_command$metadata2 = command.metadata) === null || _command$metadata2 === void 0 ? void 0 : _command$metadata2.botPermissions) ?? [];
2827
+ let missingBotPermissions = [];
2828
+ if (typeof botPermissionsRequired === "string") botPermissionsRequired = [botPermissionsRequired];
2829
+ if (!userPermissionsRequired.length && !botPermissionsRequired.length) return;
2830
+ if (userPermissionsRequired.length) for (const permission of userPermissionsRequired) {
2831
+ const hasPermission = userPermissions === null || userPermissions === void 0 ? void 0 : userPermissions.has(permission);
2832
+ if (!hasPermission) missingUserPermissions.push(permission);
2833
+ }
2834
+ if (botPermissionsRequired.length) for (const permission of botPermissionsRequired) {
2835
+ const hasPermission = botPermissions === null || botPermissions === void 0 ? void 0 : botPermissions.has(permission);
2836
+ if (!hasPermission) missingBotPermissions.push(permission);
2837
+ }
2838
+ if (!missingUserPermissions.length && !missingBotPermissions.length) return;
2839
+ const pattern = /([a-z])([A-Z])|([A-Z]+)([A-Z][a-z])/g;
2840
+ missingUserPermissions = missingUserPermissions.map((str) => str.replace(pattern, "$1$3 $2$4"));
2841
+ missingBotPermissions = missingBotPermissions.map((str) => str.replace(pattern, "$1$3 $2$4"));
2842
+ let embedDescription = "";
2843
+ const formatter = new Intl.ListFormat("en", {
2844
+ style: "long",
2845
+ type: "conjunction"
2846
+ });
2847
+ const getPermissionWord = (permissions) => permissions.length === 1 ? "permission" : "permissions";
2848
+ if (missingUserPermissions.length) {
2849
+ const formattedPermissions = missingUserPermissions.map((p) => `\`${p}\``);
2850
+ const permissionsString = formatter.format(formattedPermissions);
2851
+ embedDescription += `- You must have the ${permissionsString} ${getPermissionWord(missingUserPermissions)} to be able to run this command.\n`;
2852
+ }
2853
+ if (missingBotPermissions.length) {
2854
+ const formattedPermissions = missingBotPermissions.map((p) => `\`${p}\``);
2855
+ const permissionsString = formatter.format(formattedPermissions);
2856
+ embedDescription += `- I must have the ${permissionsString} ${getPermissionWord(missingBotPermissions)} to be able to execute this command.\n`;
2857
+ }
2858
+ const embed = new discord_js.EmbedBuilder().setTitle(`:x: Missing permissions!`).setDescription(embedDescription).setColor("Red");
2859
+ try {
2860
+ var _message$channel2;
2861
+ if (interaction && interaction.isRepliable()) await interaction.reply({
2862
+ embeds: [embed],
2863
+ flags: discord_js.MessageFlags.Ephemeral
2864
+ });
2865
+ else if (message && ((_message$channel2 = message.channel) === null || _message$channel2 === void 0 ? void 0 : _message$channel2.isSendable())) await message.reply({ embeds: [embed] });
2866
+ } catch (error) {
2867
+ Logger.error(`Could not send 'Not enough permissions' reply to user ${(interaction === null || interaction === void 0 ? void 0 : interaction.user.id) ?? (message === null || message === void 0 ? void 0 : message.author.id)} for command ${command.command.name}.`, error);
2868
+ }
2869
+ return ctx.cancel();
2870
+ }
2871
+
2787
2872
  //#endregion
2788
2873
  //#region src/app/handlers/AppCommandHandler.ts
2874
+ const KNOWN_NON_HANDLER_KEYS = [
2875
+ "command",
2876
+ "generateMetadata",
2877
+ "metadata",
2878
+ "aiConfig"
2879
+ ];
2789
2880
  /**
2790
2881
  * @private
2791
2882
  * @internal
@@ -2975,7 +3066,7 @@ var AppCommandHandler = class {
2975
3066
  * @returns Prepared command execution data or null if command not found
2976
3067
  */
2977
3068
  async prepareCommandRun(source, cmdName) {
2978
- var _loadedCommand$guilds2;
3069
+ var _loadedCommand$metada3, _loadedCommand$metada4;
2979
3070
  const config = getConfig();
2980
3071
  if (config.disablePrefixCommands && source instanceof discord_js.Message) return null;
2981
3072
  let parser;
@@ -2984,13 +3075,13 @@ var AppCommandHandler = class {
2984
3075
  const prefix = await this.commandkit.appConfig.getMessageCommandPrefix(source);
2985
3076
  if (!prefix || !prefix.length) return null;
2986
3077
  parser = new require_MessageCommandParser.MessageCommandParser(source, Array.isArray(prefix) ? prefix : [prefix], (command) => {
2987
- var _loadedCommand$guilds, _json$options;
3078
+ var _loadedCommand$metada, _loadedCommand$metada2, _json$options;
2988
3079
  const loadedCommand$1 = this.findCommandByName(command);
2989
3080
  if (!loadedCommand$1) {
2990
3081
  if (require_constants.COMMANDKIT_IS_DEV && this.commandkit.config.showUnknownPrefixCommandsWarning) Logger.error(`Prefix command "${command}" was not found.\nNote: This warning is only shown in development mode as an alert to help you find the command. If you wish to remove this warning, set \`showUnknownPrefixCommandsWarning\` to \`false\` in your commandkit config.`);
2991
3082
  return null;
2992
3083
  }
2993
- if (source.guildId && ((_loadedCommand$guilds = loadedCommand$1.guilds) === null || _loadedCommand$guilds === void 0 ? void 0 : _loadedCommand$guilds.length) && !loadedCommand$1.guilds.includes(source.guildId)) return null;
3084
+ if (source.guildId && ((_loadedCommand$metada = loadedCommand$1.metadata) === null || _loadedCommand$metada === void 0 || (_loadedCommand$metada = _loadedCommand$metada.guilds) === null || _loadedCommand$metada === void 0 ? void 0 : _loadedCommand$metada.length) && !((_loadedCommand$metada2 = loadedCommand$1.metadata) === null || _loadedCommand$metada2 === void 0 ? void 0 : _loadedCommand$metada2.guilds.includes(source.guildId))) return null;
2994
3085
  const json$1 = "toJSON" in loadedCommand$1.data.command ? loadedCommand$1.data.command.toJSON() : loadedCommand$1.data.command;
2995
3086
  return ((_json$options = json$1.options) === null || _json$options === void 0 ? void 0 : _json$options.reduce((acc, opt) => {
2996
3087
  acc[opt.name] = opt.type;
@@ -3013,12 +3104,24 @@ var AppCommandHandler = class {
3013
3104
  }
3014
3105
  const loadedCommand = this.findCommandByName(cmdName);
3015
3106
  if (!loadedCommand) return null;
3016
- if ((source instanceof discord_js.CommandInteraction || source instanceof discord_js.AutocompleteInteraction) && source.guildId && ((_loadedCommand$guilds2 = loadedCommand.guilds) === null || _loadedCommand$guilds2 === void 0 ? void 0 : _loadedCommand$guilds2.length) && !loadedCommand.guilds.includes(source.guildId)) return null;
3107
+ if ((source instanceof discord_js.CommandInteraction || source instanceof discord_js.AutocompleteInteraction) && source.guildId && ((_loadedCommand$metada3 = loadedCommand.metadata) === null || _loadedCommand$metada3 === void 0 || (_loadedCommand$metada3 = _loadedCommand$metada3.guilds) === null || _loadedCommand$metada3 === void 0 ? void 0 : _loadedCommand$metada3.length) && !((_loadedCommand$metada4 = loadedCommand.metadata) === null || _loadedCommand$metada4 === void 0 ? void 0 : _loadedCommand$metada4.guilds.includes(source.guildId))) return null;
3017
3108
  const middlewares = [];
3018
- for (const middlewareId of loadedCommand.command.middlewares) {
3019
- const middleware = this.loadedMiddlewares.get(middlewareId);
3109
+ for (const middlewareId$1 of loadedCommand.command.middlewares) {
3110
+ const middleware = this.loadedMiddlewares.get(middlewareId$1);
3020
3111
  if (middleware) middlewares.push(middleware);
3021
3112
  }
3113
+ if (!getConfig().disablePermissionsMiddleware) middlewares.push({
3114
+ data: { beforeExecute },
3115
+ middleware: {
3116
+ command: null,
3117
+ global: true,
3118
+ id: middlewareId,
3119
+ name: "permissions",
3120
+ parentPath: "",
3121
+ path: "",
3122
+ relativePath: ""
3123
+ }
3124
+ });
3022
3125
  return {
3023
3126
  command: loadedCommand,
3024
3127
  middlewares,
@@ -3032,8 +3135,9 @@ var AppCommandHandler = class {
3032
3135
  */
3033
3136
  findCommandByName(name) {
3034
3137
  for (const [, loadedCommand] of this.loadedCommands) {
3138
+ var _loadedCommand$data$m;
3035
3139
  if (loadedCommand.data.command.name === name) return loadedCommand;
3036
- const aliases = loadedCommand.data.command.aliases;
3140
+ const aliases = (_loadedCommand$data$m = loadedCommand.data.metadata) === null || _loadedCommand$data$m === void 0 ? void 0 : _loadedCommand$data$m.aliases;
3037
3141
  if (aliases && Array.isArray(aliases) && aliases.includes(name)) return loadedCommand;
3038
3142
  }
3039
3143
  return null;
@@ -3098,7 +3202,7 @@ var AppCommandHandler = class {
3098
3202
  for (const [id, command] of combinedCommands) await this.loadCommand(id, command);
3099
3203
  if (require_constants.COMMANDKIT_IS_DEV) {
3100
3204
  const commandNames = Array.from(this.loadedCommands.values()).map((v) => v.data.command.name);
3101
- const aliases = Array.from(this.loadedCommands.values()).flatMap((v) => v.data.command.aliases || []);
3205
+ const aliases = Array.from(this.loadedCommands.values()).flatMap((v) => v.metadata.aliases || []);
3102
3206
  const allNames = [...commandNames, ...aliases];
3103
3207
  await require_types_package.rewriteCommandDeclaration(`type CommandTypeData = ${allNames.map((name) => JSON.stringify(name)).join(" | ")}`);
3104
3208
  }
@@ -3136,6 +3240,12 @@ var AppCommandHandler = class {
3136
3240
  if (command.path === null) {
3137
3241
  this.loadedCommands.set(id, {
3138
3242
  command,
3243
+ metadata: {
3244
+ guilds: [],
3245
+ aliases: [],
3246
+ userPermissions: [],
3247
+ botPermissions: []
3248
+ },
3139
3249
  data: { command: {
3140
3250
  name: command.name,
3141
3251
  description: `${command.name} command`,
@@ -3146,20 +3256,28 @@ var AppCommandHandler = class {
3146
3256
  }
3147
3257
  const commandFileData = await import(`${require_resolve_file_url.toFileURL(command.path)}?t=${Date.now()}`);
3148
3258
  if (!commandFileData.command) throw new Error(`Invalid export for command ${command.name}: no command definition found`);
3259
+ const metadataFunc = commandFileData.generateMetadata;
3260
+ const metadataObj = commandFileData.metadata;
3261
+ if (metadataFunc && metadataObj) throw new Error("A command may only export either `generateMetadata` or `metadata`, not both");
3262
+ const metadata = (metadataFunc ? await metadataFunc() : metadataObj) ?? {
3263
+ aliases: [],
3264
+ guilds: [],
3265
+ userPermissions: [],
3266
+ botPermissions: []
3267
+ };
3149
3268
  const commandName = commandFileData.command.name || command.name;
3150
3269
  const commandDescription = commandFileData.command.description || `${commandName} command`;
3151
3270
  const updatedCommandData = {
3152
3271
  ...commandFileData.command,
3153
3272
  name: commandName,
3154
- description: commandDescription,
3155
- aliases: commandFileData.command.aliases
3273
+ description: commandDescription
3156
3274
  };
3157
3275
  let handlerCount = 0;
3158
3276
  for (const [key, propValidator] of Object.entries(commandDataSchema)) {
3159
3277
  const exportedProp = commandFileData[key];
3160
3278
  if (exportedProp) {
3161
3279
  if (!await propValidator(exportedProp)) throw new Error(`Invalid export for command ${command.name}: ${key} does not match expected value`);
3162
- if (key !== "command") handlerCount++;
3280
+ if (!KNOWN_NON_HANDLER_KEYS.includes(key)) handlerCount++;
3163
3281
  }
3164
3282
  }
3165
3283
  if (handlerCount === 0) throw new Error(`Invalid export for command ${command.name}: at least one handler function must be provided`);
@@ -3168,18 +3286,44 @@ var AppCommandHandler = class {
3168
3286
  const res = await plugin.prepareCommand(ctx, lastUpdated);
3169
3287
  if (res) lastUpdated = res;
3170
3288
  });
3289
+ const commandJson = "toJSON" in lastUpdated && typeof lastUpdated.toJSON === "function" ? lastUpdated.toJSON() : lastUpdated;
3290
+ if ("guilds" in commandJson || "aliases" in commandJson) Logger.warn(`Command \`${command.name}\` uses deprecated metadata properties. Please update to use the new \`metadata\` object or \`generateMetadata\` function.`);
3171
3291
  this.loadedCommands.set(id, {
3172
3292
  command,
3173
- guilds: commandFileData.command.guilds,
3293
+ metadata: {
3294
+ guilds: commandJson.guilds,
3295
+ aliases: commandJson.aliases,
3296
+ ...metadata
3297
+ },
3174
3298
  data: {
3175
3299
  ...commandFileData,
3176
- command: "toJSON" in lastUpdated && typeof lastUpdated.toJSON === "function" ? lastUpdated.toJSON() : lastUpdated
3300
+ metadata: {
3301
+ guilds: commandJson.guilds,
3302
+ aliases: commandJson.aliases,
3303
+ ...metadata
3304
+ },
3305
+ command: commandJson
3177
3306
  }
3178
3307
  });
3179
3308
  } catch (error) {
3180
3309
  Logger.error(`Failed to load command ${command.name} (${id})`, error);
3181
3310
  }
3182
3311
  }
3312
+ /**
3313
+ * Gets the metadata for a command.
3314
+ * @param command - The command name to get metadata for
3315
+ * @returns The command metadata or null if not found
3316
+ */
3317
+ getMetadataFor(command) {
3318
+ const loadedCommand = this.findCommandByName(command);
3319
+ if (!loadedCommand) return null;
3320
+ return loadedCommand.metadata ??= {
3321
+ aliases: [],
3322
+ guilds: [],
3323
+ userPermissions: [],
3324
+ botPermissions: []
3325
+ };
3326
+ }
3183
3327
  };
3184
3328
 
3185
3329
  //#endregion
@@ -4150,6 +4294,12 @@ Object.defineProperty(exports, 'after', {
4150
4294
  return after;
4151
4295
  }
4152
4296
  });
4297
+ Object.defineProperty(exports, 'beforeExecute', {
4298
+ enumerable: true,
4299
+ get: function () {
4300
+ return beforeExecute;
4301
+ }
4302
+ });
4153
4303
  Object.defineProperty(exports, 'cancelAfter', {
4154
4304
  enumerable: true,
4155
4305
  get: function () {
@@ -4276,6 +4426,12 @@ Object.defineProperty(exports, 'makeContextAwareFunction', {
4276
4426
  return makeContextAwareFunction;
4277
4427
  }
4278
4428
  });
4429
+ Object.defineProperty(exports, 'middlewareId', {
4430
+ enumerable: true,
4431
+ get: function () {
4432
+ return middlewareId;
4433
+ }
4434
+ });
4279
4435
  Object.defineProperty(exports, 'noAnalytics', {
4280
4436
  enumerable: true,
4281
4437
  get: function () {
@@ -4312,4 +4468,4 @@ Object.defineProperty(exports, 'useEnvironment', {
4312
4468
  return useEnvironment;
4313
4469
  }
4314
4470
  });
4315
- //# sourceMappingURL=commandkit-5VMG2thU.js.map
4471
+ //# sourceMappingURL=commandkit-C0BuNRSN.js.map