commandkit 0.1.11-dev.20250104131827 → 0.1.11-dev.20250111094526

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 (172) hide show
  1. package/bin/build.mjs +3 -0
  2. package/bin/development.mjs +1 -0
  3. package/dist/{CommandKit-8KZkBcWO.d.ts → CommandKit-DW5Fy2uM.d.ts} +28 -1
  4. package/dist/{CommandKit-eNQRmrvH.d.mts → CommandKit-oiAWcISu.d.mts} +28 -1
  5. package/dist/CommandKit.d.mts +3 -1
  6. package/dist/CommandKit.d.ts +3 -1
  7. package/dist/CommandKit.js +2 -2
  8. package/dist/CommandKit.js.map +1 -1
  9. package/dist/CommandKit.mjs +1 -1
  10. package/dist/async-context-B85N7tuZ.d.ts +156 -0
  11. package/dist/async-context-C45rxdEH.d.mts +156 -0
  12. package/dist/cache/CacheProvider.d.mts +9 -0
  13. package/dist/cache/CacheProvider.d.ts +9 -0
  14. package/dist/cache/CacheProvider.js +2 -0
  15. package/dist/cache/CacheProvider.js.map +1 -0
  16. package/dist/cache/CacheProvider.mjs +2 -0
  17. package/dist/cache/MemoryCache.d.mts +17 -0
  18. package/dist/cache/MemoryCache.d.ts +17 -0
  19. package/dist/cache/MemoryCache.js +2 -0
  20. package/dist/cache/MemoryCache.js.map +1 -0
  21. package/dist/cache/MemoryCache.mjs +2 -0
  22. package/dist/cache/MemoryCache.mjs.map +1 -0
  23. package/dist/cache/index.d.mts +26 -0
  24. package/dist/cache/index.d.ts +26 -0
  25. package/dist/cache/index.js +2 -0
  26. package/dist/cache/index.js.map +1 -0
  27. package/dist/cache/index.mjs +2 -0
  28. package/dist/cache/index.mjs.map +1 -0
  29. package/dist/{chunk-J3ZMR7KK.mjs → chunk-3ENTJANI.mjs} +2 -2
  30. package/dist/chunk-4BV475NY.mjs +2 -0
  31. package/dist/chunk-4BV475NY.mjs.map +1 -0
  32. package/dist/{chunk-D7RDGUPK.mjs → chunk-4CG7S6RY.mjs} +2 -2
  33. package/dist/{chunk-UXQFRVAB.mjs → chunk-6AX5YJEO.mjs} +2 -2
  34. package/dist/{chunk-JFCJXIOI.mjs → chunk-6BSP7AD3.mjs} +2 -2
  35. package/dist/{chunk-E2KEPOOS.mjs → chunk-6IFRWFZE.mjs} +2 -2
  36. package/dist/{chunk-7KD7ZCH6.mjs → chunk-6TIBWNPX.mjs} +1 -1
  37. package/dist/chunk-6TIBWNPX.mjs.map +1 -0
  38. package/dist/chunk-6TIGKCSX.mjs +2 -0
  39. package/dist/{chunk-GS3Q7VW7.mjs → chunk-6W2KY7FK.mjs} +2 -2
  40. package/dist/chunk-C6WU57FQ.mjs +2 -0
  41. package/dist/{chunk-ZE7AC2HG.mjs.map → chunk-C6WU57FQ.mjs.map} +1 -1
  42. package/dist/{chunk-YSVQ45EN.mjs → chunk-DW5KRS5H.mjs} +2 -2
  43. package/dist/chunk-GOXZZ7GU.mjs +2 -0
  44. package/dist/chunk-GOXZZ7GU.mjs.map +1 -0
  45. package/dist/{chunk-SFWUUQXC.mjs → chunk-K43A7OIY.mjs} +2 -2
  46. package/dist/chunk-LTI3V2K4.mjs +2 -0
  47. package/dist/chunk-LTI3V2K4.mjs.map +1 -0
  48. package/dist/chunk-M2MFP4HH.mjs +2 -0
  49. package/dist/chunk-M2MFP4HH.mjs.map +1 -0
  50. package/dist/chunk-MVPNDXHU.mjs +2 -0
  51. package/dist/chunk-MVPNDXHU.mjs.map +1 -0
  52. package/dist/chunk-UOPZOWKS.mjs +2 -0
  53. package/dist/chunk-UOPZOWKS.mjs.map +1 -0
  54. package/dist/chunk-VRGHCTCP.mjs +2 -0
  55. package/dist/chunk-VRGHCTCP.mjs.map +1 -0
  56. package/dist/{chunk-4IWEG3WI.mjs → chunk-WNEBLBID.mjs} +2 -2
  57. package/dist/{chunk-4IWEG3WI.mjs.map → chunk-WNEBLBID.mjs.map} +1 -1
  58. package/dist/chunk-XHS5CRG6.mjs +2 -0
  59. package/dist/chunk-XHS5CRG6.mjs.map +1 -0
  60. package/dist/{chunk-I2MRY4KL.mjs → chunk-XJCWZEWC.mjs} +2 -2
  61. package/dist/chunk-YTD7MZPP.mjs +2 -0
  62. package/dist/chunk-YTD7MZPP.mjs.map +1 -0
  63. package/dist/{chunk-4U6VHAPY.mjs → chunk-Z4FBPRS6.mjs} +2 -2
  64. package/dist/components/ButtonKit.js +1 -1
  65. package/dist/components/ButtonKit.js.map +1 -1
  66. package/dist/components/ButtonKit.mjs +1 -1
  67. package/dist/components/index.js +1 -1
  68. package/dist/components/index.js.map +1 -1
  69. package/dist/components/index.mjs +1 -1
  70. package/dist/config.mjs +1 -1
  71. package/dist/context/async-context.d.mts +7 -0
  72. package/dist/context/async-context.d.ts +7 -0
  73. package/dist/context/async-context.js +2 -0
  74. package/dist/context/async-context.js.map +1 -0
  75. package/dist/context/async-context.mjs +2 -0
  76. package/dist/context/async-context.mjs.map +1 -0
  77. package/dist/context/environment.d.mts +7 -0
  78. package/dist/context/environment.d.ts +7 -0
  79. package/dist/context/environment.js +2 -0
  80. package/dist/context/environment.js.map +1 -0
  81. package/dist/context/environment.mjs +2 -0
  82. package/dist/context/environment.mjs.map +1 -0
  83. package/dist/handlers/command-handler/CommandHandler.d.mts +3 -1
  84. package/dist/handlers/command-handler/CommandHandler.d.ts +3 -1
  85. package/dist/handlers/command-handler/CommandHandler.js +2 -2
  86. package/dist/handlers/command-handler/CommandHandler.js.map +1 -1
  87. package/dist/handlers/command-handler/CommandHandler.mjs +1 -1
  88. package/dist/handlers/command-handler/functions/loadCommandsWithRest.d.mts +3 -1
  89. package/dist/handlers/command-handler/functions/loadCommandsWithRest.d.ts +3 -1
  90. package/dist/handlers/command-handler/functions/loadCommandsWithRest.js +1 -1
  91. package/dist/handlers/command-handler/functions/loadCommandsWithRest.js.map +1 -1
  92. package/dist/handlers/command-handler/functions/loadCommandsWithRest.mjs +1 -1
  93. package/dist/handlers/command-handler/functions/registerCommands.d.mts +3 -1
  94. package/dist/handlers/command-handler/functions/registerCommands.d.ts +3 -1
  95. package/dist/handlers/command-handler/functions/registerCommands.js +1 -1
  96. package/dist/handlers/command-handler/functions/registerCommands.js.map +1 -1
  97. package/dist/handlers/command-handler/functions/registerCommands.mjs +1 -1
  98. package/dist/handlers/command-handler/typings.d.mts +3 -1
  99. package/dist/handlers/command-handler/typings.d.ts +3 -1
  100. package/dist/handlers/command-handler/utils/areSlashCommandsDifferent.mjs +1 -1
  101. package/dist/handlers/command-handler/validations/devOnly.d.mts +3 -1
  102. package/dist/handlers/command-handler/validations/devOnly.d.ts +3 -1
  103. package/dist/handlers/command-handler/validations/devOnly.mjs +1 -1
  104. package/dist/handlers/command-handler/validations/index.d.mts +3 -1
  105. package/dist/handlers/command-handler/validations/index.d.ts +3 -1
  106. package/dist/handlers/command-handler/validations/index.mjs +1 -1
  107. package/dist/handlers/command-handler/validations/permissions.d.mts +3 -1
  108. package/dist/handlers/command-handler/validations/permissions.d.ts +3 -1
  109. package/dist/handlers/command-handler/validations/permissions.mjs +1 -1
  110. package/dist/handlers/event-handler/EventHandler.d.mts +3 -1
  111. package/dist/handlers/event-handler/EventHandler.d.ts +3 -1
  112. package/dist/handlers/event-handler/EventHandler.js +1 -1
  113. package/dist/handlers/event-handler/EventHandler.js.map +1 -1
  114. package/dist/handlers/event-handler/EventHandler.mjs +1 -1
  115. package/dist/handlers/event-handler/typings.d.mts +3 -1
  116. package/dist/handlers/event-handler/typings.d.ts +3 -1
  117. package/dist/handlers/index.d.mts +3 -1
  118. package/dist/handlers/index.d.ts +3 -1
  119. package/dist/handlers/index.js +2 -2
  120. package/dist/handlers/index.js.map +1 -1
  121. package/dist/handlers/index.mjs +1 -1
  122. package/dist/handlers/validation-handler/ValidationHandler.js +1 -1
  123. package/dist/handlers/validation-handler/ValidationHandler.js.map +1 -1
  124. package/dist/handlers/validation-handler/ValidationHandler.mjs +1 -1
  125. package/dist/index.d.mts +6 -1
  126. package/dist/index.d.ts +6 -1
  127. package/dist/index.js +2 -2
  128. package/dist/index.js.map +1 -1
  129. package/dist/index.mjs +1 -1
  130. package/dist/index.mjs.map +1 -1
  131. package/dist/types.d.mts +3 -1
  132. package/dist/types.d.ts +3 -1
  133. package/dist/types.js.map +1 -1
  134. package/dist/types.mjs +1 -1
  135. package/dist/types.mjs.map +1 -1
  136. package/dist/utils/clone.mjs +1 -1
  137. package/dist/utils/colors.js +1 -1
  138. package/dist/utils/colors.js.map +1 -1
  139. package/dist/utils/colors.mjs +1 -1
  140. package/dist/utils/error-codes.d.mts +10 -0
  141. package/dist/utils/error-codes.d.ts +10 -0
  142. package/dist/utils/error-codes.js +2 -0
  143. package/dist/utils/error-codes.js.map +1 -0
  144. package/dist/utils/error-codes.mjs +2 -0
  145. package/dist/utils/error-codes.mjs.map +1 -0
  146. package/dist/utils/get-paths.mjs +1 -1
  147. package/dist/utils/resolve-file-url.mjs +1 -1
  148. package/dist/utils/warn-unstable.d.mts +3 -0
  149. package/dist/utils/warn-unstable.d.ts +3 -0
  150. package/dist/utils/warn-unstable.js +2 -0
  151. package/dist/utils/warn-unstable.js.map +1 -0
  152. package/dist/utils/warn-unstable.mjs +2 -0
  153. package/dist/utils/warn-unstable.mjs.map +1 -0
  154. package/package.json +3 -3
  155. package/dist/chunk-FXJNQE5B.mjs +0 -2
  156. package/dist/chunk-FXJNQE5B.mjs.map +0 -1
  157. package/dist/chunk-IHC5YX2R.mjs +0 -2
  158. package/dist/chunk-IHC5YX2R.mjs.map +0 -1
  159. package/dist/chunk-YZT2CEWE.mjs +0 -2
  160. package/dist/chunk-ZE7AC2HG.mjs +0 -2
  161. /package/dist/{chunk-7KD7ZCH6.mjs.map → cache/CacheProvider.mjs.map} +0 -0
  162. /package/dist/{chunk-J3ZMR7KK.mjs.map → chunk-3ENTJANI.mjs.map} +0 -0
  163. /package/dist/{chunk-D7RDGUPK.mjs.map → chunk-4CG7S6RY.mjs.map} +0 -0
  164. /package/dist/{chunk-UXQFRVAB.mjs.map → chunk-6AX5YJEO.mjs.map} +0 -0
  165. /package/dist/{chunk-JFCJXIOI.mjs.map → chunk-6BSP7AD3.mjs.map} +0 -0
  166. /package/dist/{chunk-E2KEPOOS.mjs.map → chunk-6IFRWFZE.mjs.map} +0 -0
  167. /package/dist/{chunk-YZT2CEWE.mjs.map → chunk-6TIGKCSX.mjs.map} +0 -0
  168. /package/dist/{chunk-GS3Q7VW7.mjs.map → chunk-6W2KY7FK.mjs.map} +0 -0
  169. /package/dist/{chunk-YSVQ45EN.mjs.map → chunk-DW5KRS5H.mjs.map} +0 -0
  170. /package/dist/{chunk-SFWUUQXC.mjs.map → chunk-K43A7OIY.mjs.map} +0 -0
  171. /package/dist/{chunk-I2MRY4KL.mjs.map → chunk-XJCWZEWC.mjs.map} +0 -0
  172. /package/dist/{chunk-4U6VHAPY.mjs.map → chunk-Z4FBPRS6.mjs.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/colors.ts"],"sourcesContent":["const resetColor = '\\x1b[0m';\n\nexport default {\n reset: (text: string) => `${text}${resetColor}`,\n bright: (text: string) => `\\x1b[1m${text}${resetColor}`,\n dim: (text: string) => `\\x1b[2m${text}${resetColor}`,\n underscore: (text: string) => `\\x1b[4m${text}${resetColor}`,\n blink: (text: string) => `\\x1b[5m${text}${resetColor}`,\n reverse: (text: string) => `\\x1b[7m${text}${resetColor}`,\n hidden: (text: string) => `\\x1b[8m${text}${resetColor}`,\n\n black: (text: string) => `\\x1b[30m${text}${resetColor}`,\n red: (text: string) => `\\x1b[31m${text}${resetColor}`,\n green: (text: string) => `\\x1b[32m${text}${resetColor}`,\n yellow: (text: string) => `\\x1b[33m${text}${resetColor}`,\n blue: (text: string) => `\\x1b[34m${text}${resetColor}`,\n magenta: (text: string) => `\\x1b[35m${text}${resetColor}`,\n cyan: (text: string) => `\\x1b[36m${text}${resetColor}`,\n white: (text: string) => `\\x1b[37m${text}${resetColor}`,\n\n bgBlack: (text: string) => `\\x1b[40m${text}${resetColor}`,\n bgRed: (text: string) => `\\x1b[41m${text}${resetColor}`,\n bgGreen: (text: string) => `\\x1b[42m${text}${resetColor}`,\n bgYellow: (text: string) => `\\x1b[43m${text}${resetColor}`,\n bgBlue: (text: string) => `\\x1b[44m${text}${resetColor}`,\n bgMagenta: (text: string) => `\\x1b[45m${text}${resetColor}`,\n bgCyan: (text: string) => `\\x1b[46m${text}${resetColor}`,\n bgWhite: (text: string) => `\\x1b[47m${text}${resetColor}`\n};"],"mappings":"AAAA,IAAM,WAAa,UAEZ,eAAQ,CACb,MAAQ,MAAiB,GAAG,IAAI,GAAG,UAAU,GAC7C,OAAS,MAAiB,UAAU,IAAI,GAAG,UAAU,GACrD,IAAM,MAAiB,UAAU,IAAI,GAAG,UAAU,GAClD,WAAa,MAAiB,UAAU,IAAI,GAAG,UAAU,GACzD,MAAQ,MAAiB,UAAU,IAAI,GAAG,UAAU,GACpD,QAAU,MAAiB,UAAU,IAAI,GAAG,UAAU,GACtD,OAAS,MAAiB,UAAU,IAAI,GAAG,UAAU,GAErD,MAAQ,MAAiB,WAAW,IAAI,GAAG,UAAU,GACrD,IAAM,MAAiB,WAAW,IAAI,GAAG,UAAU,GACnD,MAAQ,MAAiB,WAAW,IAAI,GAAG,UAAU,GACrD,OAAS,MAAiB,WAAW,IAAI,GAAG,UAAU,GACtD,KAAO,MAAiB,WAAW,IAAI,GAAG,UAAU,GACpD,QAAU,MAAiB,WAAW,IAAI,GAAG,UAAU,GACvD,KAAO,MAAiB,WAAW,IAAI,GAAG,UAAU,GACpD,MAAQ,MAAiB,WAAW,IAAI,GAAG,UAAU,GAErD,QAAU,MAAiB,WAAW,IAAI,GAAG,UAAU,GACvD,MAAQ,MAAiB,WAAW,IAAI,GAAG,UAAU,GACrD,QAAU,MAAiB,WAAW,IAAI,GAAG,UAAU,GACvD,SAAW,MAAiB,WAAW,IAAI,GAAG,UAAU,GACxD,OAAS,MAAiB,WAAW,IAAI,GAAG,UAAU,GACtD,UAAY,MAAiB,WAAW,IAAI,GAAG,UAAU,GACzD,OAAS,MAAiB,WAAW,IAAI,GAAG,UAAU,GACtD,QAAU,MAAiB,WAAW,IAAI,GAAG,UAAU,EACzD","names":[]}
1
+ {"version":3,"sources":["../src/utils/colors.ts"],"sourcesContent":["const resetColor = '\\x1b[0m';\n\nexport default {\n reset: (text: string) => `${text}${resetColor}`,\n bright: (text: string) => `\\x1b[1m${text}${resetColor}`,\n dim: (text: string) => `\\x1b[2m${text}${resetColor}`,\n underscore: (text: string) => `\\x1b[4m${text}${resetColor}`,\n blink: (text: string) => `\\x1b[5m${text}${resetColor}`,\n reverse: (text: string) => `\\x1b[7m${text}${resetColor}`,\n hidden: (text: string) => `\\x1b[8m${text}${resetColor}`,\n\n black: (text: string) => `\\x1b[30m${text}${resetColor}`,\n red: (text: string) => `\\x1b[31m${text}${resetColor}`,\n green: (text: string) => `\\x1b[32m${text}${resetColor}`,\n yellow: (text: string) => `\\x1b[33m${text}${resetColor}`,\n blue: (text: string) => `\\x1b[34m${text}${resetColor}`,\n magenta: (text: string) => `\\x1b[35m${text}${resetColor}`,\n cyan: (text: string) => `\\x1b[36m${text}${resetColor}`,\n white: (text: string) => `\\x1b[37m${text}${resetColor}`,\n\n bgBlack: (text: string) => `\\x1b[40m${text}${resetColor}`,\n bgRed: (text: string) => `\\x1b[41m${text}${resetColor}`,\n bgGreen: (text: string) => `\\x1b[42m${text}${resetColor}`,\n bgYellow: (text: string) => `\\x1b[43m${text}${resetColor}`,\n bgBlue: (text: string) => `\\x1b[44m${text}${resetColor}`,\n bgMagenta: (text: string) => `\\x1b[45m${text}${resetColor}`,\n bgCyan: (text: string) => `\\x1b[46m${text}${resetColor}`,\n bgWhite: (text: string) => `\\x1b[47m${text}${resetColor}`\n};"],"mappings":"yCAAA,IAAM,WAAa,UAEZ,eAAQ,CACb,MAAO,OAAC,MAAiB,GAAG,IAAI,GAAG,UAAU,GAAtC,SACP,OAAQ,OAAC,MAAiB,UAAU,IAAI,GAAG,UAAU,GAA7C,UACR,IAAK,OAAC,MAAiB,UAAU,IAAI,GAAG,UAAU,GAA7C,OACL,WAAY,OAAC,MAAiB,UAAU,IAAI,GAAG,UAAU,GAA7C,cACZ,MAAO,OAAC,MAAiB,UAAU,IAAI,GAAG,UAAU,GAA7C,SACP,QAAS,OAAC,MAAiB,UAAU,IAAI,GAAG,UAAU,GAA7C,WACT,OAAQ,OAAC,MAAiB,UAAU,IAAI,GAAG,UAAU,GAA7C,UAER,MAAO,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,SACP,IAAK,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,OACL,MAAO,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,SACP,OAAQ,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,UACR,KAAM,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,QACN,QAAS,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,WACT,KAAM,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,QACN,MAAO,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,SAEP,QAAS,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,WACT,MAAO,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,SACP,QAAS,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,WACT,SAAU,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,YACV,OAAQ,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,UACR,UAAW,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,aACX,OAAQ,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,UACR,QAAS,OAAC,MAAiB,WAAW,IAAI,GAAG,UAAU,GAA9C,UACX","names":[]}
@@ -1,4 +1,4 @@
1
- import{colors_default}from"./chunk-ZE7AC2HG.mjs";import{__name}from"./chunk-7KD7ZCH6.mjs";async function loadCommandsWithRest(props){if(props.reloading)if(props.client.isReady())await handleLoading(props.client,props.commands,props.devGuildIds,props.reloading,props.type);else throw new Error(colors_default.red("Cannot reload commands when client is not ready."));else props.client.once("ready",async c=>{await handleLoading(c,props.commands,props.devGuildIds,props.reloading,props.type)})}__name(loadCommandsWithRest,"loadCommandsWithRest");async function handleLoading(client,commands,devGuildIds,reloading,type){commands=commands.filter(cmd=>!cmd.options?.deleted);let devOnlyCommands=commands.filter(cmd=>cmd.options?.devOnly),globalCommands=commands.filter(cmd=>!cmd.options?.devOnly);type==="dev"?await loadDevCommands(client,devOnlyCommands,devGuildIds,reloading):type==="global"?await loadGlobalCommands(client,globalCommands,reloading):(await loadDevCommands(client,devOnlyCommands,devGuildIds,reloading),await loadGlobalCommands(client,globalCommands,reloading))}__name(handleLoading,"handleLoading");async function loadGlobalCommands(client,commands,reloading){let requestBody=commands.map(cmd=>cmd.data);await client.application.commands.set(requestBody).catch(error=>{throw new Error(colors_default.red(`Error ${reloading?"reloading":"loading"} global application commands.
1
+ import{colors_default}from"./chunk-C6WU57FQ.mjs";import{__name}from"./chunk-6TIBWNPX.mjs";async function loadCommandsWithRest(props){if(props.reloading)if(props.client.isReady())await handleLoading(props.client,props.commands,props.devGuildIds,props.reloading,props.type);else throw new Error(colors_default.red("Cannot reload commands when client is not ready."));else props.client.once("ready",async c=>{await handleLoading(c,props.commands,props.devGuildIds,props.reloading,props.type)})}__name(loadCommandsWithRest,"loadCommandsWithRest");async function handleLoading(client,commands,devGuildIds,reloading,type){commands=commands.filter(cmd=>!cmd.options?.deleted);let devOnlyCommands=commands.filter(cmd=>cmd.options?.devOnly),globalCommands=commands.filter(cmd=>!cmd.options?.devOnly);type==="dev"?await loadDevCommands(client,devOnlyCommands,devGuildIds,reloading):type==="global"?await loadGlobalCommands(client,globalCommands,reloading):(await loadDevCommands(client,devOnlyCommands,devGuildIds,reloading),await loadGlobalCommands(client,globalCommands,reloading))}__name(handleLoading,"handleLoading");async function loadGlobalCommands(client,commands,reloading){let requestBody=commands.map(cmd=>cmd.data);await client.application.commands.set(requestBody).catch(error=>{throw new Error(colors_default.red(`Error ${reloading?"reloading":"loading"} global application commands.
2
2
  `),error)}),console.log(colors_default.green(`${reloading?"Reloaded":"Loaded"} ${requestBody.length} global commands.`))}__name(loadGlobalCommands,"loadGlobalCommands");async function loadDevCommands(client,commands,guildIds,reloading){let requestBody=commands.map(cmd=>cmd.data);for(let guildId of guildIds){let targetGuild=client.guilds.cache.get(guildId)||await client.guilds.fetch(guildId);if(!targetGuild){process.emitWarning(`Cannot ${reloading?"reload":"load"} commands in guild "${guildId}" - guild doesn't exist or client isn't part of the guild.`);continue}await targetGuild.commands.set(requestBody).catch(error=>{throw new Error(colors_default.red(`Error ${reloading?"reloading":"loading"} developer application commands in guild "${targetGuild?.name||guildId}".
3
3
  `),error)}),console.log(colors_default.green(`${reloading?"Reloaded":"Loaded"} ${requestBody.length} developer commands in guild "${targetGuild.name}".`))}}__name(loadDevCommands,"loadDevCommands");export{loadCommandsWithRest};
4
- //# sourceMappingURL=chunk-YSVQ45EN.mjs.map
4
+ //# sourceMappingURL=chunk-DW5KRS5H.mjs.map
@@ -0,0 +1,2 @@
1
+ import{__name}from"./chunk-6TIBWNPX.mjs";var CacheProvider=class{static{__name(this,"CacheProvider")}};export{CacheProvider};
2
+ //# sourceMappingURL=chunk-GOXZZ7GU.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cache/CacheProvider.ts"],"sourcesContent":["export abstract class CacheProvider {\n abstract get<T>(key: string): Promise<T | undefined>;\n abstract set<T>(key: string, value: T, ttl?: number): Promise<void>;\n abstract exists(key: string): Promise<boolean>;\n abstract delete(key: string): Promise<void>;\n abstract clear(): Promise<void>;\n}"],"mappings":"yCAAO,IAAe,cAAf,KAA6B,CAApC,MAAoC,8BAMpC","names":[]}
@@ -1,4 +1,4 @@
1
- import{__name}from"./chunk-7KD7ZCH6.mjs";import{EmbedBuilder}from"discord.js";function permissions_default({interaction,targetCommand}){if(interaction.isAutocomplete())return;let userPermissions=interaction.memberPermissions,userPermissionsRequired=targetCommand.options?.userPermissions,missingUserPermissions=[];typeof userPermissionsRequired=="string"&&(userPermissionsRequired=[userPermissionsRequired]);let botPermissions=interaction.guild?.members.me?.permissions,botPermissionsRequired=targetCommand.options?.botPermissions,missingBotPermissions=[];if(typeof botPermissionsRequired=="string"&&(botPermissionsRequired=[botPermissionsRequired]),!userPermissionsRequired?.length&&!botPermissionsRequired?.length)return;if(userPermissions&&userPermissionsRequired)for(let permission of userPermissionsRequired)userPermissions.has(permission)||missingUserPermissions.push(permission);if(botPermissions&&botPermissionsRequired)for(let permission of botPermissionsRequired)botPermissions.has(permission)||missingBotPermissions.push(permission);if(!missingUserPermissions.length&&!missingBotPermissions.length)return;let pattern=/([a-z])([A-Z])|([A-Z]+)([A-Z][a-z])/g;missingUserPermissions=missingUserPermissions.map(str=>str.replace(pattern,"$1$3 $2$4")),missingBotPermissions=missingBotPermissions.map(str=>str.replace(pattern,"$1$3 $2$4"));let embedDescription="",formatter=new Intl.ListFormat("en",{style:"long",type:"conjunction"}),getPermissionWord=__name(permissions=>permissions.length===1?"permission":"permissions","getPermissionWord");if(missingUserPermissions.length){let formattedPermissions=missingUserPermissions.map(p=>`\`${p}\``),permissionsString=formatter.format(formattedPermissions);embedDescription+=`- You must have the ${permissionsString} ${getPermissionWord(missingUserPermissions)} to be able to run this command.
1
+ import{__name}from"./chunk-6TIBWNPX.mjs";import{EmbedBuilder}from"discord.js";function permissions_default({interaction,targetCommand}){if(interaction.isAutocomplete())return;let userPermissions=interaction.memberPermissions,userPermissionsRequired=targetCommand.options?.userPermissions,missingUserPermissions=[];typeof userPermissionsRequired=="string"&&(userPermissionsRequired=[userPermissionsRequired]);let botPermissions=interaction.guild?.members.me?.permissions,botPermissionsRequired=targetCommand.options?.botPermissions,missingBotPermissions=[];if(typeof botPermissionsRequired=="string"&&(botPermissionsRequired=[botPermissionsRequired]),!userPermissionsRequired?.length&&!botPermissionsRequired?.length)return;if(userPermissions&&userPermissionsRequired)for(let permission of userPermissionsRequired)userPermissions.has(permission)||missingUserPermissions.push(permission);if(botPermissions&&botPermissionsRequired)for(let permission of botPermissionsRequired)botPermissions.has(permission)||missingBotPermissions.push(permission);if(!missingUserPermissions.length&&!missingBotPermissions.length)return;let pattern=/([a-z])([A-Z])|([A-Z]+)([A-Z][a-z])/g;missingUserPermissions=missingUserPermissions.map(str=>str.replace(pattern,"$1$3 $2$4")),missingBotPermissions=missingBotPermissions.map(str=>str.replace(pattern,"$1$3 $2$4"));let embedDescription="",formatter=new Intl.ListFormat("en",{style:"long",type:"conjunction"}),getPermissionWord=__name(permissions=>permissions.length===1?"permission":"permissions","getPermissionWord");if(missingUserPermissions.length){let formattedPermissions=missingUserPermissions.map(p=>`\`${p}\``),permissionsString=formatter.format(formattedPermissions);embedDescription+=`- You must have the ${permissionsString} ${getPermissionWord(missingUserPermissions)} to be able to run this command.
2
2
  `}if(missingBotPermissions.length){let formattedPermissions=missingBotPermissions.map(p=>`\`${p}\``),permissionsString=formatter.format(formattedPermissions);embedDescription+=`- I must have the ${permissionsString} ${getPermissionWord(missingBotPermissions)} to be able to execute this command.
3
3
  `}let embed=new EmbedBuilder().setTitle(":x: Missing permissions!").setDescription(embedDescription).setColor("Red");return interaction.reply({embeds:[embed],ephemeral:!0}),!0}__name(permissions_default,"default");export{permissions_default};
4
- //# sourceMappingURL=chunk-SFWUUQXC.mjs.map
4
+ //# sourceMappingURL=chunk-K43A7OIY.mjs.map
@@ -0,0 +1,2 @@
1
+ import{CommandHandler}from"./chunk-M2MFP4HH.mjs";import{ValidationHandler}from"./chunk-3ENTJANI.mjs";import{EventHandler}from"./chunk-6IFRWFZE.mjs";import{colors_default}from"./chunk-C6WU57FQ.mjs";import{MemoryCache}from"./chunk-XHS5CRG6.mjs";import{CacheProvider}from"./chunk-GOXZZ7GU.mjs";import{__name}from"./chunk-6TIBWNPX.mjs";import EventEmitter from"node:events";var CommandKit=class extends EventEmitter{static{__name(this,"CommandKit")}#data;constructor(options){if(!options.client)throw new Error(colors_default.red('"client" is required when instantiating CommandKit.'));if(options.validationsPath&&!options.commandsPath)throw new Error(colors_default.red('"commandsPath" is required when "validationsPath" is set.'));super(),options.debugCommands??=process.env.NODE_ENV!=="production",options.cacheProvider!==null&&(!options.cacheProvider||!(options.cacheProvider instanceof CacheProvider))&&(options.cacheProvider=new MemoryCache),this.#data=options,this.#init().then(()=>{this.incrementClientListenersCount()})}getCacheProvider(){return this.#data.cacheProvider??null}isDebuggingCommands(){return this.#data.debugCommands||!1}get client(){return this.#data.client}get commandHandler(){return this.#data.commandHandler}async#init(){if(this.#data.eventsPath){let eventHandler=new EventHandler({client:this.#data.client,eventsPath:this.#data.eventsPath,commandKitInstance:this});await eventHandler.init(),this.#data.eventHandler=eventHandler}if(this.#data.validationsPath){let validationHandler=new ValidationHandler({validationsPath:this.#data.validationsPath});await validationHandler.init(),this.#data.validationHandler=validationHandler}if(this.#data.commandsPath){let commandHandler=new CommandHandler({client:this.#data.client,commandsPath:this.#data.commandsPath,devGuildIds:this.#data.devGuildIds||[],devUserIds:this.#data.devUserIds||[],devRoleIds:this.#data.devRoleIds||[],validationHandler:this.#data.validationHandler,skipBuiltInValidations:this.#data.skipBuiltInValidations||!1,commandkitInstance:this,bulkRegister:this.#data.bulkRegister||!1});await commandHandler.init(),this.#data.commandHandler=commandHandler}}async reloadCommands(type){this.#data.commandHandler&&await this.#data.commandHandler.reloadCommands(type)}async reloadEvents(){this.#data.eventHandler&&await this.#data.eventHandler.reloadEvents(this.#data.commandHandler)}async reloadValidations(){this.#data.validationHandler&&await this.#data.validationHandler.reloadValidations()}get commands(){return this.#data.commandHandler?this.#data.commandHandler.commands.map(cmd=>{let{run,autocomplete,...command}=cmd;return command}):[]}get commandsPath(){return this.#data.commandsPath}get eventsPath(){return this.#data.eventsPath}get validationsPath(){return this.#data.validationsPath}get devUserIds(){return this.#data.devUserIds||[]}get devGuildIds(){return this.#data.devGuildIds||[]}get devRoleIds(){return this.#data.devRoleIds||[]}incrementClientListenersCount(){this.#data.client.setMaxListeners(this.#data.client.getMaxListeners()+1)}decrementClientListenersCount(){this.#data.client.setMaxListeners(this.#data.client.getMaxListeners()-1)}};export{CommandKit};
2
+ //# sourceMappingURL=chunk-LTI3V2K4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/CommandKit.ts"],"sourcesContent":["import EventEmitter from 'node:events';\nimport { CommandHandler, EventHandler, ValidationHandler } from './handlers';\nimport type {\n CommandKitData,\n CommandKitOptions,\n CommandObject,\n ReloadOptions } from\n'./types';\nimport colors from './utils/colors';\nimport { CacheProvider } from './cache/CacheProvider';\nimport { MemoryCache } from './cache/MemoryCache';\n\nexport class CommandKit extends EventEmitter {\n #data: CommandKitData;\n\n /**\n * Create a new command and event handler with CommandKit.\n *\n * @param options - The default CommandKit configuration.\n * @see {@link https://commandkit.dev/guide/commandkit-setup}\n */\n constructor(options: CommandKitOptions) {\n if (!options.client) {\n throw new Error(\n colors.red('\"client\" is required when instantiating CommandKit.')\n );\n }\n\n if (options.validationsPath && !options.commandsPath) {\n throw new Error(\n colors.red('\"commandsPath\" is required when \"validationsPath\" is set.')\n );\n }\n\n super();\n\n options.debugCommands ??= process.env.NODE_ENV !== 'production';\n\n if (\n options.cacheProvider !== null && (\n !options.cacheProvider ||\n !(options.cacheProvider instanceof CacheProvider)))\n {\n options.cacheProvider = new MemoryCache();\n }\n\n this.#data = options;\n\n this.#init().then(() => {\n // Increment client listeners count, as commandkit registers internal event listeners.\n this.incrementClientListenersCount();\n });\n }\n\n /**\n * Resolves the current cache provider.\n */\n getCacheProvider(): CacheProvider | null {\n const provider = this.#data.cacheProvider;\n return provider ?? null;\n }\n\n /**\n * Whether or not to debug the command handler.\n */\n isDebuggingCommands() {\n return this.#data.debugCommands || false;\n }\n\n /**\n * Get the client attached to this CommandKit instance.\n */\n get client() {\n return this.#data.client;\n }\n\n /**\n * Get command handler instance.\n */\n get commandHandler() {\n return this.#data.commandHandler;\n }\n\n /**\n * (Private) Initialize CommandKit.\n */\n async #init() {\n // <!-- Setup event handler -->\n if (this.#data.eventsPath) {\n const eventHandler = new EventHandler({\n client: this.#data.client,\n eventsPath: this.#data.eventsPath,\n commandKitInstance: this\n });\n\n await eventHandler.init();\n\n this.#data.eventHandler = eventHandler;\n }\n\n // <!-- Setup validation handler -->\n if (this.#data.validationsPath) {\n const validationHandler = new ValidationHandler({\n validationsPath: this.#data.validationsPath\n });\n\n await validationHandler.init();\n\n this.#data.validationHandler = validationHandler;\n }\n\n // <!-- Setup command handler -->\n if (this.#data.commandsPath) {\n const commandHandler = new CommandHandler({\n client: this.#data.client,\n commandsPath: this.#data.commandsPath,\n devGuildIds: this.#data.devGuildIds || [],\n devUserIds: this.#data.devUserIds || [],\n devRoleIds: this.#data.devRoleIds || [],\n validationHandler: this.#data.validationHandler,\n skipBuiltInValidations: this.#data.skipBuiltInValidations || false,\n commandkitInstance: this,\n bulkRegister: this.#data.bulkRegister || false\n });\n\n await commandHandler.init();\n\n this.#data.commandHandler = commandHandler;\n }\n }\n\n /**\n * Updates application commands with the latest from \"commandsPath\".\n */\n async reloadCommands(type?: ReloadOptions) {\n if (!this.#data.commandHandler) return;\n await this.#data.commandHandler.reloadCommands(type);\n }\n\n /**\n * Updates application events with the latest from \"eventsPath\".\n */\n async reloadEvents() {\n if (!this.#data.eventHandler) return;\n await this.#data.eventHandler.reloadEvents(this.#data.commandHandler);\n }\n\n /**\n * Updates application command validations with the latest from \"validationsPath\".\n */\n async reloadValidations() {\n if (!this.#data.validationHandler) return;\n await this.#data.validationHandler.reloadValidations();\n }\n\n /**\n * @returns An array of objects of all the commands that CommandKit is handling.\n */\n get commands(): CommandObject[] {\n if (!this.#data.commandHandler) {\n return [];\n }\n\n const commands = this.#data.commandHandler.commands.map((cmd) => {\n const { run, autocomplete, ...command } = cmd;\n return command;\n });\n\n return commands;\n }\n\n /**\n * @returns The path to the commands folder which was set when instantiating CommandKit.\n */\n get commandsPath(): string | undefined {\n return this.#data.commandsPath;\n }\n\n /**\n * @returns The path to the events folder which was set when instantiating CommandKit.\n */\n get eventsPath(): string | undefined {\n return this.#data.eventsPath;\n }\n\n /**\n * @returns The path to the validations folder which was set when instantiating CommandKit.\n */\n get validationsPath(): string | undefined {\n return this.#data.validationsPath;\n }\n\n /**\n * @returns An array of all the developer user IDs which was set when instantiating CommandKit.\n */\n get devUserIds(): string[] {\n return this.#data.devUserIds || [];\n }\n\n /**\n * @returns An array of all the developer guild IDs which was set when instantiating CommandKit.\n */\n get devGuildIds(): string[] {\n return this.#data.devGuildIds || [];\n }\n\n /**\n * @returns An array of all the developer role IDs which was set when instantiating CommandKit.\n */\n get devRoleIds(): string[] {\n return this.#data.devRoleIds || [];\n }\n\n /**\n * Increment the client listeners count.\n */\n incrementClientListenersCount() {\n this.#data.client.setMaxListeners(this.#data.client.getMaxListeners() + 1);\n }\n\n /**\n * Decrement the client listeners count.\n */\n decrementClientListenersCount() {\n this.#data.client.setMaxListeners(this.#data.client.getMaxListeners() - 1);\n }\n}"],"mappings":"4UAAA,OAAO,iBAAkB,cAYlB,IAAM,WAAN,cAAyB,YAAa,CAZ7C,MAY6C,2BAC3C,MAQA,YAAY,QAA4B,CACtC,GAAI,CAAC,QAAQ,OACX,MAAM,IAAI,MACR,eAAO,IAAI,qDAAqD,CAClE,EAGF,GAAI,QAAQ,iBAAmB,CAAC,QAAQ,aACtC,MAAM,IAAI,MACR,eAAO,IAAI,2DAA2D,CACxE,EAGF,MAAM,EAEN,QAAQ,gBAAkB,QAAQ,IAAI,WAAa,aAGnD,QAAQ,gBAAkB,OAC1B,CAAC,QAAQ,eACT,EAAE,QAAQ,yBAAyB,kBAEjC,QAAQ,cAAgB,IAAI,aAG9B,KAAK,MAAQ,QAEb,KAAK,MAAM,EAAE,KAAK,IAAM,CAEtB,KAAK,8BAA8B,CACrC,CAAC,CACH,CAKA,kBAAyC,CAEvC,OADiB,KAAK,MAAM,eACT,IACrB,CAKA,qBAAsB,CACpB,OAAO,KAAK,MAAM,eAAiB,EACrC,CAKA,IAAI,QAAS,CACX,OAAO,KAAK,MAAM,MACpB,CAKA,IAAI,gBAAiB,CACnB,OAAO,KAAK,MAAM,cACpB,CAKA,KAAM,OAAQ,CAEZ,GAAI,KAAK,MAAM,WAAY,CACzB,IAAM,aAAe,IAAI,aAAa,CACpC,OAAQ,KAAK,MAAM,OACnB,WAAY,KAAK,MAAM,WACvB,mBAAoB,IACtB,CAAC,EAED,MAAM,aAAa,KAAK,EAExB,KAAK,MAAM,aAAe,YAC5B,CAGA,GAAI,KAAK,MAAM,gBAAiB,CAC9B,IAAM,kBAAoB,IAAI,kBAAkB,CAC9C,gBAAiB,KAAK,MAAM,eAC9B,CAAC,EAED,MAAM,kBAAkB,KAAK,EAE7B,KAAK,MAAM,kBAAoB,iBACjC,CAGA,GAAI,KAAK,MAAM,aAAc,CAC3B,IAAM,eAAiB,IAAI,eAAe,CACxC,OAAQ,KAAK,MAAM,OACnB,aAAc,KAAK,MAAM,aACzB,YAAa,KAAK,MAAM,aAAe,CAAC,EACxC,WAAY,KAAK,MAAM,YAAc,CAAC,EACtC,WAAY,KAAK,MAAM,YAAc,CAAC,EACtC,kBAAmB,KAAK,MAAM,kBAC9B,uBAAwB,KAAK,MAAM,wBAA0B,GAC7D,mBAAoB,KACpB,aAAc,KAAK,MAAM,cAAgB,EAC3C,CAAC,EAED,MAAM,eAAe,KAAK,EAE1B,KAAK,MAAM,eAAiB,cAC9B,CACF,CAKA,MAAM,eAAe,KAAsB,CACpC,KAAK,MAAM,gBAChB,MAAM,KAAK,MAAM,eAAe,eAAe,IAAI,CACrD,CAKA,MAAM,cAAe,CACd,KAAK,MAAM,cAChB,MAAM,KAAK,MAAM,aAAa,aAAa,KAAK,MAAM,cAAc,CACtE,CAKA,MAAM,mBAAoB,CACnB,KAAK,MAAM,mBAChB,MAAM,KAAK,MAAM,kBAAkB,kBAAkB,CACvD,CAKA,IAAI,UAA4B,CAC9B,OAAK,KAAK,MAAM,eAIC,KAAK,MAAM,eAAe,SAAS,IAAK,KAAQ,CAC/D,GAAM,CAAE,IAAK,aAAc,GAAG,OAAQ,EAAI,IAC1C,OAAO,OACT,CAAC,EANQ,CAAC,CASZ,CAKA,IAAI,cAAmC,CACrC,OAAO,KAAK,MAAM,YACpB,CAKA,IAAI,YAAiC,CACnC,OAAO,KAAK,MAAM,UACpB,CAKA,IAAI,iBAAsC,CACxC,OAAO,KAAK,MAAM,eACpB,CAKA,IAAI,YAAuB,CACzB,OAAO,KAAK,MAAM,YAAc,CAAC,CACnC,CAKA,IAAI,aAAwB,CAC1B,OAAO,KAAK,MAAM,aAAe,CAAC,CACpC,CAKA,IAAI,YAAuB,CACzB,OAAO,KAAK,MAAM,YAAc,CAAC,CACnC,CAKA,+BAAgC,CAC9B,KAAK,MAAM,OAAO,gBAAgB,KAAK,MAAM,OAAO,gBAAgB,EAAI,CAAC,CAC3E,CAKA,+BAAgC,CAC9B,KAAK,MAAM,OAAO,gBAAgB,KAAK,MAAM,OAAO,gBAAgB,EAAI,CAAC,CAC3E,CACF","names":[]}
@@ -0,0 +1,2 @@
1
+ import{loadCommandsWithRest}from"./chunk-DW5KRS5H.mjs";import{registerCommands}from"./chunk-XJCWZEWC.mjs";import{validations_default}from"./chunk-6TIGKCSX.mjs";import{toFileURL}from"./chunk-4CG7S6RY.mjs";import{clone}from"./chunk-MNPCM4QU.mjs";import{colors_default}from"./chunk-C6WU57FQ.mjs";import{getFilePaths}from"./chunk-6BSP7AD3.mjs";import{CommandKitEnvironment,after}from"./chunk-VRGHCTCP.mjs";import{makeContextAwareFunction,useEnvironment}from"./chunk-UOPZOWKS.mjs";import{__name,__require}from"./chunk-6TIBWNPX.mjs";var CommandHandler=class{static{__name(this,"CommandHandler")}#data;constructor({...options}){this.#data={...options,builtInValidations:[],commands:[]}}async init(){await this.#buildCommands(),this.#buildBuiltInValidations();let devOnlyCommands=this.#data.commands.filter(cmd=>cmd.options?.devOnly);devOnlyCommands.length&&!this.#data.devGuildIds.length&&process.emitWarning(colors_default.yellow('You have commands marked as "devOnly", but "devGuildIds" have not been set.')),devOnlyCommands.length&&!this.#data.devUserIds.length&&!this.#data.devRoleIds.length&&process.emitWarning(colors_default.yellow('You have commands marked as "devOnly", but "devUserIds" or "devRoleIds" have not been set.')),this.#data.bulkRegister?await loadCommandsWithRest({client:this.#data.client,devGuildIds:this.#data.devGuildIds,commands:this.#data.commands}):await registerCommands({client:this.#data.client,devGuildIds:this.#data.devGuildIds,commands:this.#data.commands}),this.handleCommands()}async#buildCommands(){let allowedExtensions=/\.(js|mjs|cjs|ts)$/i,commandFilePaths=(await getFilePaths(this.#data.commandsPath,!0)).filter(path=>allowedExtensions.test(path));for(let commandFilePath of commandFilePaths){let importedObj=await import(`${toFileURL(commandFilePath)}?t=${Date.now()}`),commandObj=clone(importedObj);typeof module<"u"&&typeof __require<"u"&&delete __require.cache[__require.resolve(commandFilePath)];let compactFilePath=commandFilePath.split(process.cwd())[1]||commandFilePath;if(commandObj.default&&(commandObj=commandObj.default),importedObj.default?commandObj.data=importedObj.default.data:commandObj.data=importedObj.data,!commandObj.data){process.emitWarning(colors_default.yellow(`Ignoring: Command file ${compactFilePath} does not export "data".`));continue}if(!commandObj.data.name){process.emitWarning(colors_default.yellow(`Ignoring: Command file ${compactFilePath} does not export "data.name".`));continue}if(!commandObj.run){process.emitWarning(colors_default.yellow(`Ignoring: Command file ${commandObj.data.name} does not export "run".`));continue}if(typeof commandObj.run!="function"){process.emitWarning(colors_default.yellow(`Ignoring: Command file ${commandObj.data.name} does not export "run" as a function.`));continue}commandObj.filePath=commandFilePath;let commandCategory=commandFilePath.split(this.#data.commandsPath)[1]?.replace(/\\\\|\\/g,"/").split("/")[1]||null;commandCategory&&allowedExtensions.test(commandCategory)?commandObj.category=null:commandObj.category=commandCategory,this.#data.commands.push(commandObj)}}#buildBuiltInValidations(){for(let builtInValidationFunction of validations_default)this.#data.builtInValidations.push(builtInValidationFunction)}async#commandFinalizer(){let env=useEnvironment();await env.runDeferredFunctions(),env.clearAllDeferredFunctions()}async#interactionHandler(interaction){if(!interaction.isChatInputCommand()&&!interaction.isContextMenuCommand()&&!interaction.isAutocomplete())return;let isAutocomplete=interaction.isAutocomplete(),targetCommand=this.#data.commands.find(cmd=>cmd.data.name===interaction.commandName);if(!targetCommand)return;let env=useEnvironment();env.variables.set("interaction",interaction);let{data,options,run,autocomplete,...rest}=targetCommand;return isAutocomplete&&!autocomplete?void 0:__name(async()=>{let commandObj={data:targetCommand.data,options:targetCommand.options,...rest};if(this.#data.validationHandler){let canRun2=!0;for(let validationFunction of this.#data.validationHandler.validations)if(await validationFunction({interaction,commandObj,client:this.#data.client,handler:this.#data.commandkitInstance})){canRun2=!1;break}if(!canRun2)return}let canRun=!0;if(!this.#data.skipBuiltInValidations){for(let validation of this.#data.builtInValidations)if(validation({targetCommand,interaction,handlerData:this.#data})){canRun=!1;break}}if(!canRun)return;let command=targetCommand[isAutocomplete?"autocomplete":"run"],context={interaction,client:this.#data.client,handler:this.#data.commandkitInstance};if(!this.#data.commandkitInstance.isDebuggingCommands())return command(context);after(env2=>{let error=env2.getExecutionError(),marker=env2.getMarker(),time=env2.getExecutionTime().toFixed(2),cachedMarker=!!env2.variables.get("cacheHit")?" (cached)":"";if(error){console.error(colors_default.red(`[${marker} - ${time}]${cachedMarker} Error executing command: ${error}`));return}console.log(colors_default.green(`[${marker} - ${time}]${cachedMarker} Command executed successfully`))});try{return env.markStart(interaction.commandName),await command(context)}finally{env.markEnd()}},"executor")()}handleCommands(){this.#data.client.on("interactionCreate",interaction=>{let env=new CommandKitEnvironment(this.#data.commandkitInstance);return env.setType("COMMAND_HANDLER"),makeContextAwareFunction(env,this.#interactionHandler.bind(this),this.#commandFinalizer.bind(this))(interaction)})}get commands(){return this.#data.commands}async reloadCommands(type){if(!this.#data.commandsPath)throw new Error(colors_default.red('Cannot reload commands as "commandsPath" was not provided when instantiating CommandKit.'));this.#data.commands=[],await this.#buildCommands(),this.#data.bulkRegister?await loadCommandsWithRest({client:this.#data.client,devGuildIds:this.#data.devGuildIds,commands:this.#data.commands,reloading:!0,type}):await registerCommands({client:this.#data.client,devGuildIds:this.#data.devGuildIds,commands:this.#data.commands,reloading:!0,type})}};export{CommandHandler};
2
+ //# sourceMappingURL=chunk-M2MFP4HH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/handlers/command-handler/CommandHandler.ts"],"sourcesContent":["import { CacheType, Interaction } from 'discord.js';\nimport type {\n CommandData,\n CommandFileObject,\n ReloadOptions } from\n'../../types';\nimport { clone } from '../../utils/clone';\nimport colors from '../../utils/colors';\nimport { getFilePaths } from '../../utils/get-paths';\nimport { toFileURL } from '../../utils/resolve-file-url';\nimport loadCommandsWithRest from './functions/loadCommandsWithRest';\nimport registerCommands from './functions/registerCommands';\nimport type {\n CommandHandlerData,\n CommandHandlerOptions,\n CommandKitInteraction } from\n'./typings';\nimport builtInValidationsFunctions from './validations';\nimport {\n makeContextAwareFunction,\n useEnvironment } from\n'../../context/async-context';\nimport {\n after,\n CommandKitEnvironment,\n CommandKitEnvironmentType } from\n'../../context/environment';\n\nexport interface hCommandContext {\n interaction: CommandKitInteraction;\n command: CommandData;\n}\n\n/**\n * A handler for client application commands.\n */\nexport class CommandHandler {\n #data: CommandHandlerData;\n\n constructor({ ...options }: CommandHandlerOptions) {\n this.#data = {\n ...options,\n builtInValidations: [],\n commands: []\n };\n }\n\n async init() {\n await this.#buildCommands();\n\n this.#buildBuiltInValidations();\n\n const devOnlyCommands = this.#data.commands.filter(\n (cmd) => cmd.options?.devOnly\n );\n\n if (devOnlyCommands.length && !this.#data.devGuildIds.length) {\n process.emitWarning(\n colors.yellow(\n 'You have commands marked as \"devOnly\", but \"devGuildIds\" have not been set.'\n )\n );\n }\n\n if (\n devOnlyCommands.length &&\n !this.#data.devUserIds.length &&\n !this.#data.devRoleIds.length)\n {\n process.emitWarning(\n colors.yellow(\n 'You have commands marked as \"devOnly\", but \"devUserIds\" or \"devRoleIds\" have not been set.'\n )\n );\n }\n\n if (this.#data.bulkRegister) {\n await loadCommandsWithRest({\n client: this.#data.client,\n devGuildIds: this.#data.devGuildIds,\n commands: this.#data.commands\n });\n } else {\n await registerCommands({\n client: this.#data.client,\n devGuildIds: this.#data.devGuildIds,\n commands: this.#data.commands\n });\n }\n\n this.handleCommands();\n }\n\n async #buildCommands() {\n const allowedExtensions = /\\.(js|mjs|cjs|ts)$/i;\n const paths = await getFilePaths(this.#data.commandsPath, true);\n\n const commandFilePaths = paths.filter((path) =>\n allowedExtensions.test(path)\n );\n\n for (const commandFilePath of commandFilePaths) {\n const modulePath = toFileURL(commandFilePath);\n\n const importedObj = await import(`${modulePath}?t=${Date.now()}`);\n let commandObj: CommandFileObject = clone(importedObj); // Make commandObj extensible\n\n // If it's CommonJS, invalidate the import cache\n if (typeof module !== 'undefined' && typeof require !== 'undefined') {\n delete require.cache[require.resolve(commandFilePath)];\n }\n\n const compactFilePath =\n commandFilePath.split(process.cwd())[1] || commandFilePath;\n\n if (commandObj.default)\n commandObj = commandObj.default as CommandFileObject;\n\n // Ensure builder properties\n if (importedObj.default) {\n commandObj.data = importedObj.default.data;\n } else {\n commandObj.data = importedObj.data;\n }\n\n if (!commandObj.data) {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command file ${compactFilePath} does not export \"data\".`\n )\n );\n continue;\n }\n\n if (!commandObj.data.name) {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command file ${compactFilePath} does not export \"data.name\".`\n )\n );\n continue;\n }\n\n if (!commandObj.run) {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command file ${commandObj.data.name} does not export \"run\".`\n )\n );\n continue;\n }\n\n if (typeof commandObj.run !== 'function') {\n process.emitWarning(\n colors.yellow(\n `Ignoring: Command file ${commandObj.data.name} does not export \"run\" as a function.`\n )\n );\n continue;\n }\n\n commandObj.filePath = commandFilePath;\n\n let commandCategory =\n commandFilePath.\n split(this.#data.commandsPath)[1]?.\n replace(/\\\\\\\\|\\\\/g, '/').\n split('/')[1] || null;\n\n if (commandCategory && allowedExtensions.test(commandCategory)) {\n commandObj.category = null;\n } else {\n commandObj.category = commandCategory;\n }\n\n this.#data.commands.push(commandObj);\n }\n }\n\n #buildBuiltInValidations() {\n for (const builtInValidationFunction of builtInValidationsFunctions) {\n this.#data.builtInValidations.push(builtInValidationFunction);\n }\n }\n\n async #commandFinalizer() {\n const env = useEnvironment();\n\n await env.runDeferredFunctions();\n\n // Clear all deferred functions if we somehow missed them\n env.clearAllDeferredFunctions();\n }\n\n async #interactionHandler(interaction: Interaction<CacheType>) {\n if (\n !interaction.isChatInputCommand() &&\n !interaction.isContextMenuCommand() &&\n !interaction.isAutocomplete())\n\n return;\n\n const isAutocomplete = interaction.isAutocomplete();\n\n const targetCommand = this.#data.commands.find(\n (cmd) => cmd.data.name === interaction.commandName\n );\n\n if (!targetCommand) return;\n\n const env = useEnvironment();\n\n env.variables.set('interaction', interaction);\n\n const { data, options, run, autocomplete, ...rest } = targetCommand;\n\n // Skip if autocomplete handler is not defined\n if (isAutocomplete && !autocomplete) return;\n\n const executor = async () => {\n const commandObj = {\n data: targetCommand.data,\n options: targetCommand.options,\n ...rest\n };\n\n if (this.#data.validationHandler) {\n let canRun = true;\n\n for (const validationFunction of this.#data.validationHandler.\n validations) {\n const stopValidationLoop = await validationFunction({\n interaction,\n commandObj,\n client: this.#data.client,\n handler: this.#data.commandkitInstance\n });\n\n if (stopValidationLoop) {\n canRun = false;\n break;\n }\n }\n\n if (!canRun) return;\n }\n\n let canRun = true;\n\n // If custom validations pass and !skipBuiltInValidations, run built-in CommandKit validation functions\n if (!this.#data.skipBuiltInValidations) {\n for (const validation of this.#data.builtInValidations) {\n const stopValidationLoop = validation({\n targetCommand,\n interaction,\n handlerData: this.#data\n });\n\n if (stopValidationLoop) {\n canRun = false;\n break;\n }\n }\n }\n\n if (!canRun) return;\n\n const command = targetCommand[isAutocomplete ? 'autocomplete' : 'run']!;\n\n const context = {\n interaction,\n client: this.#data.client,\n handler: this.#data.commandkitInstance\n };\n\n const shouldDebug = this.#data.commandkitInstance.isDebuggingCommands();\n\n if (!shouldDebug) {\n return command(context);\n }\n\n after((env) => {\n const error = env.getExecutionError();\n const marker = env.getMarker();\n const time = env.getExecutionTime().toFixed(2);\n const cached = !!env.variables.get('cacheHit');\n const cachedMarker = cached ? ' (cached)' : '';\n\n if (error) {\n console.error(\n colors.red(\n `[${marker} - ${time}]${cachedMarker} Error executing command: ${error}`\n )\n );\n return;\n }\n\n console.log(\n colors.green(\n `[${marker} - ${time}]${cachedMarker} Command executed successfully`\n )\n );\n });\n\n try {\n env.markStart(interaction.commandName);\n const res = await command(context);\n\n return res;\n } finally {\n env.markEnd();\n }\n };\n\n return executor();\n }\n\n handleCommands() {\n this.#data.client.on('interactionCreate', (interaction) => {\n const env = new CommandKitEnvironment(this.#data.commandkitInstance);\n env.setType(CommandKitEnvironmentType.CommandHandler);\n\n return makeContextAwareFunction(\n env,\n this.#interactionHandler.bind(this),\n this.#commandFinalizer.bind(this)\n )(interaction);\n });\n }\n\n get commands() {\n return this.#data.commands;\n }\n\n async reloadCommands(type?: ReloadOptions) {\n if (!this.#data.commandsPath) {\n throw new Error(\n colors.red(\n 'Cannot reload commands as \"commandsPath\" was not provided when instantiating CommandKit.'\n )\n );\n }\n\n this.#data.commands = [];\n\n // Re-build commands tree\n await this.#buildCommands();\n\n if (this.#data.bulkRegister) {\n await loadCommandsWithRest({\n client: this.#data.client,\n devGuildIds: this.#data.devGuildIds,\n commands: this.#data.commands,\n reloading: true,\n type\n });\n } else {\n await registerCommands({\n client: this.#data.client,\n devGuildIds: this.#data.devGuildIds,\n commands: this.#data.commands,\n reloading: true,\n type\n });\n }\n }\n}"],"mappings":"+gBAoCO,IAAM,eAAN,KAAqB,CApC5B,MAoC4B,+BAC1B,MAEA,YAAY,CAAE,GAAG,OAAQ,EAA0B,CACjD,KAAK,MAAQ,CACX,GAAG,QACH,mBAAoB,CAAC,EACrB,SAAU,CAAC,CACb,CACF,CAEA,MAAM,MAAO,CACX,MAAM,KAAK,eAAe,EAE1B,KAAK,yBAAyB,EAE9B,IAAM,gBAAkB,KAAK,MAAM,SAAS,OACzC,KAAQ,IAAI,SAAS,OACxB,EAEI,gBAAgB,QAAU,CAAC,KAAK,MAAM,YAAY,QACpD,QAAQ,YACN,eAAO,OACL,6EACF,CACF,EAIF,gBAAgB,QAChB,CAAC,KAAK,MAAM,WAAW,QACvB,CAAC,KAAK,MAAM,WAAW,QAErB,QAAQ,YACN,eAAO,OACL,4FACF,CACF,EAGE,KAAK,MAAM,aACb,MAAM,qBAAqB,CACzB,OAAQ,KAAK,MAAM,OACnB,YAAa,KAAK,MAAM,YACxB,SAAU,KAAK,MAAM,QACvB,CAAC,EAED,MAAM,iBAAiB,CACrB,OAAQ,KAAK,MAAM,OACnB,YAAa,KAAK,MAAM,YACxB,SAAU,KAAK,MAAM,QACvB,CAAC,EAGH,KAAK,eAAe,CACtB,CAEA,KAAM,gBAAiB,CACrB,IAAM,kBAAoB,sBAGpB,kBAFQ,MAAM,aAAa,KAAK,MAAM,aAAc,EAAI,GAE/B,OAAQ,MACvC,kBAAkB,KAAK,IAAI,CAC3B,EAEA,QAAW,mBAAmB,iBAAkB,CAG9C,IAAM,YAAc,MAAM,OAAO,GAFd,UAAU,eAAe,CAEE,MAAM,KAAK,IAAI,CAAC,IAC1D,WAAgC,MAAM,WAAW,EAGjD,OAAO,OAAW,KAAe,OAAO,UAAY,KACtD,OAAO,UAAQ,MAAM,UAAQ,QAAQ,eAAe,CAAC,EAGvD,IAAM,gBACN,gBAAgB,MAAM,QAAQ,IAAI,CAAC,EAAE,CAAC,GAAK,gBAY3C,GAVI,WAAW,UACf,WAAa,WAAW,SAGpB,YAAY,QACd,WAAW,KAAO,YAAY,QAAQ,KAEtC,WAAW,KAAO,YAAY,KAG5B,CAAC,WAAW,KAAM,CACpB,QAAQ,YACN,eAAO,OACL,0BAA0B,eAAe,0BAC3C,CACF,EACA,QACF,CAEA,GAAI,CAAC,WAAW,KAAK,KAAM,CACzB,QAAQ,YACN,eAAO,OACL,0BAA0B,eAAe,+BAC3C,CACF,EACA,QACF,CAEA,GAAI,CAAC,WAAW,IAAK,CACnB,QAAQ,YACN,eAAO,OACL,0BAA0B,WAAW,KAAK,IAAI,yBAChD,CACF,EACA,QACF,CAEA,GAAI,OAAO,WAAW,KAAQ,WAAY,CACxC,QAAQ,YACN,eAAO,OACL,0BAA0B,WAAW,KAAK,IAAI,uCAChD,CACF,EACA,QACF,CAEA,WAAW,SAAW,gBAEtB,IAAI,gBACJ,gBACA,MAAM,KAAK,MAAM,YAAY,EAAE,CAAC,GAChC,QAAQ,WAAY,GAAG,EACvB,MAAM,GAAG,EAAE,CAAC,GAAK,KAEb,iBAAmB,kBAAkB,KAAK,eAAe,EAC3D,WAAW,SAAW,KAEtB,WAAW,SAAW,gBAGxB,KAAK,MAAM,SAAS,KAAK,UAAU,CACrC,CACF,CAEA,0BAA2B,CACzB,QAAW,6BAA6B,oBACtC,KAAK,MAAM,mBAAmB,KAAK,yBAAyB,CAEhE,CAEA,KAAM,mBAAoB,CACxB,IAAM,IAAM,eAAe,EAE3B,MAAM,IAAI,qBAAqB,EAG/B,IAAI,0BAA0B,CAChC,CAEA,KAAM,oBAAoB,YAAqC,CAC7D,GACA,CAAC,YAAY,mBAAmB,GAChC,CAAC,YAAY,qBAAqB,GAClC,CAAC,YAAY,eAAe,EAE5B,OAEA,IAAM,eAAiB,YAAY,eAAe,EAE5C,cAAgB,KAAK,MAAM,SAAS,KACvC,KAAQ,IAAI,KAAK,OAAS,YAAY,WACzC,EAEA,GAAI,CAAC,cAAe,OAEpB,IAAM,IAAM,eAAe,EAE3B,IAAI,UAAU,IAAI,cAAe,WAAW,EAE5C,GAAM,CAAE,KAAM,QAAS,IAAK,aAAc,GAAG,IAAK,EAAI,cAGtD,OAAI,gBAAkB,CAAC,aAAc,OAEpB,gBAAY,CAC3B,IAAM,WAAa,CACjB,KAAM,cAAc,KACpB,QAAS,cAAc,QACvB,GAAG,IACL,EAEA,GAAI,KAAK,MAAM,kBAAmB,CAChC,IAAIA,QAAS,GAEb,QAAW,sBAAsB,KAAK,MAAM,kBAC5C,YAQE,GAP2B,MAAM,mBAAmB,CAClD,YACA,WACA,OAAQ,KAAK,MAAM,OACnB,QAAS,KAAK,MAAM,kBACtB,CAAC,EAEuB,CACtBA,QAAS,GACT,KACF,CAGF,GAAI,CAACA,QAAQ,MACf,CAEA,IAAI,OAAS,GAGb,GAAI,CAAC,KAAK,MAAM,wBACd,QAAW,cAAc,KAAK,MAAM,mBAOlC,GAN2B,WAAW,CACpC,cACA,YACA,YAAa,KAAK,KACpB,CAAC,EAEuB,CACtB,OAAS,GACT,KACF,EAIJ,GAAI,CAAC,OAAQ,OAEb,IAAM,QAAU,cAAc,eAAiB,eAAiB,KAAK,EAE/D,QAAU,CACd,YACA,OAAQ,KAAK,MAAM,OACnB,QAAS,KAAK,MAAM,kBACtB,EAIA,GAAI,CAFgB,KAAK,MAAM,mBAAmB,oBAAoB,EAGpE,OAAO,QAAQ,OAAO,EAGxB,MAAOC,MAAQ,CACb,IAAM,MAAQA,KAAI,kBAAkB,EAC9B,OAASA,KAAI,UAAU,EACvB,KAAOA,KAAI,iBAAiB,EAAE,QAAQ,CAAC,EAEvC,aADS,CAAC,CAACA,KAAI,UAAU,IAAI,UAAU,EACf,YAAc,GAE5C,GAAI,MAAO,CACT,QAAQ,MACN,eAAO,IACL,IAAI,MAAM,MAAM,IAAI,IAAI,YAAY,6BAA6B,KAAK,EACxE,CACF,EACA,MACF,CAEA,QAAQ,IACN,eAAO,MACL,IAAI,MAAM,MAAM,IAAI,IAAI,YAAY,gCACtC,CACF,CACF,CAAC,EAED,GAAI,CACF,WAAI,UAAU,YAAY,WAAW,EACzB,MAAM,QAAQ,OAAO,CAGnC,QAAE,CACA,IAAI,QAAQ,CACd,CACF,EA7FiB,YA+FD,CAClB,CAEA,gBAAiB,CACf,KAAK,MAAM,OAAO,GAAG,oBAAsB,aAAgB,CACzD,IAAM,IAAM,IAAI,sBAAsB,KAAK,MAAM,kBAAkB,EACnE,WAAI,yBAAgD,EAE7C,yBACL,IACA,KAAK,oBAAoB,KAAK,IAAI,EAClC,KAAK,kBAAkB,KAAK,IAAI,CAClC,EAAE,WAAW,CACf,CAAC,CACH,CAEA,IAAI,UAAW,CACb,OAAO,KAAK,MAAM,QACpB,CAEA,MAAM,eAAe,KAAsB,CACzC,GAAI,CAAC,KAAK,MAAM,aACd,MAAM,IAAI,MACR,eAAO,IACL,0FACF,CACF,EAGF,KAAK,MAAM,SAAW,CAAC,EAGvB,MAAM,KAAK,eAAe,EAEtB,KAAK,MAAM,aACb,MAAM,qBAAqB,CACzB,OAAQ,KAAK,MAAM,OACnB,YAAa,KAAK,MAAM,YACxB,SAAU,KAAK,MAAM,SACrB,UAAW,GACX,IACF,CAAC,EAED,MAAM,iBAAiB,CACrB,OAAQ,KAAK,MAAM,OACnB,YAAa,KAAK,MAAM,YACxB,SAAU,KAAK,MAAM,SACrB,UAAW,GACX,IACF,CAAC,CAEL,CACF","names":["canRun","env"]}
@@ -0,0 +1,2 @@
1
+ import{__name}from"./chunk-6TIBWNPX.mjs";var WARNED_KEYS=new Set;function warnUnstable(name){WARNED_KEYS.has(name)||(WARNED_KEYS.add(name),process.emitWarning(`${name} is unstable and may change in future versions.`,{code:"CommandKitUnstableWarning"}))}__name(warnUnstable,"warnUnstable");export{warnUnstable};
2
+ //# sourceMappingURL=chunk-MVPNDXHU.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/warn-unstable.ts"],"sourcesContent":["import colors from './colors';\n\nconst WARNED_KEYS = new Set<string>();\n\nexport function warnUnstable(name: string) {\n if (WARNED_KEYS.has(name)) return;\n\n WARNED_KEYS.add(name);\n\n process.emitWarning(\n `${name} is unstable and may change in future versions.`,\n {\n code: 'CommandKitUnstableWarning'\n }\n );\n}"],"mappings":"yCAEA,IAAM,YAAc,IAAI,IAEjB,SAAS,aAAa,KAAc,CACrC,YAAY,IAAI,IAAI,IAExB,YAAY,IAAI,IAAI,EAEpB,QAAQ,YACN,GAAG,IAAI,kDACP,CACE,KAAM,2BACR,CACF,EACF,CAXgB","names":[]}
@@ -0,0 +1,2 @@
1
+ import{CommandKitErrorCodes,isCommandKitError}from"./chunk-4BV475NY.mjs";import{__name}from"./chunk-6TIBWNPX.mjs";import{AsyncLocalStorage}from"node:async_hooks";var context=new AsyncLocalStorage;function makeContextAwareFunction(env,fn,finalizer){return __name((...args)=>context.run(env,async()=>{try{let result=await fn(...args);return env.isCapturingResult()&&result!=null&&env.setResult(result),result}catch(e){if(isCommandKitError(e)){let code=Reflect.get(e,"code"),interaction=env.variables.get("interaction");if(!interaction)return;switch(code){case CommandKitErrorCodes.CacheHit:{let data=Reflect.get(e,"data");env.variables.set("cacheHit",!0),interaction.isCommand()&&(interaction.deferred?await interaction.editReply(data):interaction.isRepliable()&&await interaction.reply(data));return}case CommandKitErrorCodes.GuildOnlyException:{interaction.isRepliable()&&await interaction.reply({content:"This command is only available in guilds.",ephemeral:!0});return}case CommandKitErrorCodes.DMOnlyException:{interaction.isRepliable()&&await interaction.reply({content:"This command is only available in DMs.",ephemeral:!0});return}}return}env.setExecutionError(e)}finally{if(typeof finalizer=="function")try{await finalizer(...args)}catch{}}}),"_fn")}__name(makeContextAwareFunction,"makeContextAwareFunction");function getContext(){return context.getStore()}__name(getContext,"getContext");function useEnvironment(){let ctx=context.getStore();if(!ctx)throw new Error("No commandkit environment found. Please make sure you are inside commandkit handler.");return ctx}__name(useEnvironment,"useEnvironment");function guildOnly(){let interaction=useEnvironment().variables.get("interaction");if(!interaction)throw new Error("No interaction found in environment.");if(!interaction.guild){let error=new Error("This command is only available in guilds.");throw Reflect.set(error,"code",CommandKitErrorCodes.GuildOnlyException),error}}__name(guildOnly,"guildOnly");function dmOnly(){let interaction=useEnvironment().variables.get("interaction");if(!interaction)throw new Error("No interaction found in environment.");if(interaction.guild){let error=new Error("This command is only available in DMs.");throw Reflect.set(error,"code",CommandKitErrorCodes.DMOnlyException),error}}__name(dmOnly,"dmOnly");export{makeContextAwareFunction,getContext,useEnvironment,guildOnly,dmOnly};
2
+ //# sourceMappingURL=chunk-UOPZOWKS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context/async-context.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { CommandKitEnvironment } from './environment';\nimport { CommandKitErrorCodes, isCommandKitError } from '../utils/error-codes';\nimport { Interaction } from 'discord.js';\nimport { warnUnstable } from '../utils/warn-unstable';\n\nconst context = new AsyncLocalStorage<CommandKitEnvironment>();\n\nexport type GenericFunction<A extends any[] = any[]> = (...args: A) => any;\n\n/**\n * Returns a context-aware version of the given function.\n * @param env - The commandkit environment data.\n * @param fn - The target function.\n * @param finalizer - An optional finalizer function to run after the target function. This function will be context-aware.\n * @internal\n */\nexport function makeContextAwareFunction<\n R extends GenericFunction,\n F extends GenericFunction>(\nenv: CommandKitEnvironment, fn: R, finalizer?: F): R {\n const _fn = (...args: any[]) => {\n return context.run(env, async () => {\n try {\n // execute the target function\n const result = await fn(...args);\n\n if (env.isCapturingResult() && result != null) {\n env.setResult(result);\n }\n\n return result;\n } catch (e) {\n // set the error in the environment data\n if (isCommandKitError(e)) {\n const code = Reflect.get(e, 'code');\n const interaction = env.variables.get('interaction') as Interaction;\n if (!interaction) return;\n\n switch (code) {\n case CommandKitErrorCodes.CacheHit:{\n const data = Reflect.get(e, 'data');\n env.variables.set('cacheHit', true);\n\n if (interaction.isCommand()) {\n if (interaction.deferred) {\n await interaction.editReply(data);\n } else if (interaction.isRepliable()) {\n await interaction.reply(data);\n }\n }\n\n return;\n }\n case CommandKitErrorCodes.GuildOnlyException:{\n if (interaction.isRepliable()) {\n await interaction.reply({\n content: 'This command is only available in guilds.',\n ephemeral: true\n });\n }\n return;\n }\n case CommandKitErrorCodes.DMOnlyException:{\n if (interaction.isRepliable()) {\n await interaction.reply({\n content: 'This command is only available in DMs.',\n ephemeral: true\n });\n }\n return;\n }\n }\n\n return;\n }\n\n env.setExecutionError(e as Error);\n } finally {\n if (typeof finalizer === 'function') {\n // execute the finalizer function\n try {\n await finalizer(...args);\n } catch {\n\n // no-op\n }}\n }\n });\n };\n\n return _fn as R;\n}\n\n/**\n * Get the current commandkit context.\n * @internal\n */\nexport function getContext(): CommandKitEnvironment | void {\n const ctx = context.getStore();\n return ctx;\n}\n\n/**\n * Use current commandkit context. Throws an error if no context is found.\n */\nexport function useEnvironment(): CommandKitEnvironment {\n const ctx = context.getStore();\n if (!ctx) {\n throw new Error(\n 'No commandkit environment found. Please make sure you are inside commandkit handler.'\n );\n }\n\n return ctx;\n}\n\n/**\n * Ensures the command is only available in guilds.\n * Note: do not wrap this function in a try/catch block.\n */\nexport function guildOnly() {\n const env = useEnvironment();\n const interaction: Interaction = env.variables.get('interaction');\n\n if (!interaction) {\n throw new Error('No interaction found in environment.');\n }\n\n if (!interaction.guild) {\n const error = new Error('This command is only available in guilds.');\n Reflect.set(error, 'code', CommandKitErrorCodes.GuildOnlyException);\n\n throw error;\n }\n}\n\n/**\n * Ensures the command is only available in DMs.\n * Note: do not wrap this function in a try/catch block.\n */\nexport function dmOnly() {\n const env = useEnvironment();\n const interaction: Interaction = env.variables.get('interaction');\n\n if (!interaction) {\n throw new Error('No interaction found in environment.');\n }\n\n if (interaction.guild) {\n const error = new Error('This command is only available in DMs.');\n Reflect.set(error, 'code', CommandKitErrorCodes.DMOnlyException);\n\n throw error;\n }\n}"],"mappings":"kHAAA,OAAS,sBAAyB,mBAMlC,IAAM,QAAU,IAAI,kBAWb,SAAS,yBAGhB,IAA4B,GAAO,UAAkB,CAuEnD,OAtEY,WAAI,OACP,QAAQ,IAAI,IAAK,SAAY,CAClC,GAAI,CAEF,IAAM,OAAS,MAAM,GAAG,GAAG,IAAI,EAE/B,OAAI,IAAI,kBAAkB,GAAK,QAAU,MACvC,IAAI,UAAU,MAAM,EAGf,MACT,OAAS,EAAG,CAEV,GAAI,kBAAkB,CAAC,EAAG,CACxB,IAAM,KAAO,QAAQ,IAAI,EAAG,MAAM,EAC5B,YAAc,IAAI,UAAU,IAAI,aAAa,EACnD,GAAI,CAAC,YAAa,OAElB,OAAQ,KAAM,CACZ,KAAK,qBAAqB,SAAS,CAC/B,IAAM,KAAO,QAAQ,IAAI,EAAG,MAAM,EAClC,IAAI,UAAU,IAAI,WAAY,EAAI,EAE9B,YAAY,UAAU,IACpB,YAAY,SACd,MAAM,YAAY,UAAU,IAAI,EACvB,YAAY,YAAY,GACjC,MAAM,YAAY,MAAM,IAAI,GAIhC,MACF,CACF,KAAK,qBAAqB,mBAAmB,CACrC,YAAY,YAAY,GAC1B,MAAM,YAAY,MAAM,CACtB,QAAS,4CACT,UAAW,EACb,CAAC,EAEH,MACF,CACF,KAAK,qBAAqB,gBAAgB,CAClC,YAAY,YAAY,GAC1B,MAAM,YAAY,MAAM,CACtB,QAAS,yCACT,UAAW,EACb,CAAC,EAEH,MACF,CACJ,CAEA,MACF,CAEA,IAAI,kBAAkB,CAAU,CAClC,QAAE,CACA,GAAI,OAAO,WAAc,WAEvB,GAAI,CACF,MAAM,UAAU,GAAG,IAAI,CACzB,MAAQ,CAGR,CACJ,CACF,CAAC,EAnES,MAuEd,CA3EgB,4DAiFT,SAAS,YAA2C,CAEzD,OADY,QAAQ,SAAS,CAE/B,CAHgB,gCAQT,SAAS,gBAAwC,CACtD,IAAM,IAAM,QAAQ,SAAS,EAC7B,GAAI,CAAC,IACH,MAAM,IAAI,MACR,sFACF,EAGF,OAAO,GACT,CATgB,wCAeT,SAAS,WAAY,CAE1B,IAAM,YADM,eAAe,EACU,UAAU,IAAI,aAAa,EAEhE,GAAI,CAAC,YACH,MAAM,IAAI,MAAM,sCAAsC,EAGxD,GAAI,CAAC,YAAY,MAAO,CACtB,IAAM,MAAQ,IAAI,MAAM,2CAA2C,EACnE,cAAQ,IAAI,MAAO,OAAQ,qBAAqB,kBAAkB,EAE5D,KACR,CACF,CAdgB,8BAoBT,SAAS,QAAS,CAEvB,IAAM,YADM,eAAe,EACU,UAAU,IAAI,aAAa,EAEhE,GAAI,CAAC,YACH,MAAM,IAAI,MAAM,sCAAsC,EAGxD,GAAI,YAAY,MAAO,CACrB,IAAM,MAAQ,IAAI,MAAM,wCAAwC,EAChE,cAAQ,IAAI,MAAO,OAAQ,qBAAqB,eAAe,EAEzD,KACR,CACF,CAdgB","names":[]}
@@ -0,0 +1,2 @@
1
+ import{getContext}from"./chunk-UOPZOWKS.mjs";import{__name}from"./chunk-6TIBWNPX.mjs";import{randomUUID}from"node:crypto";var CommandKitEnvironment=class{constructor(commandkit){this.commandkit=commandkit}static{__name(this,"CommandKitEnvironment")}#data={executionError:null,type:null,variables:new Map,deferredFunctions:new Map,marker:"",markStart:0,markEnd:0,captureResult:!1,result:null};captureResult(){this.#data.captureResult=!0}isCapturingResult(){return this.#data.captureResult}setResult(result){this.#data.result=result}getResult(){return this.#data.result}getExecutionError(){return this.#data.executionError}setExecutionError(error){if(this.#data.executionError)throw new Error("Execution error already set.");this.#data.executionError=error}getType(){let type=this.#data.type;if(!type)throw new Error("Environment type not set.");return type}setType(type){this.#data.type=type}get variables(){return this.#data.variables}registerDeferredFunction(fn){let id=randomUUID();return this.#data.deferredFunctions.set(id,fn),id}clearDeferredFunction(id){this.#data.deferredFunctions.delete(id)}async runDeferredFunctions(){for(let[id,fn]of this.#data.deferredFunctions)try{await fn(this)}catch(e){this.commandkit.emit("unhandledDeferredFunctionRejection",e)}finally{this.clearDeferredFunction(id)}}clearAllDeferredFunctions(){this.#data.deferredFunctions.clear()}markStart(marker){this.#data.marker=marker,this.#data.markStart=performance.now()}markEnd(){this.#data.markEnd||(this.#data.markEnd=performance.now())}getMarker(){return this.#data.marker}getExecutionTime(){return Math.abs(this.#data.markEnd-this.#data.markStart)}},CommandKitEnvironmentType=(CommandKitEnvironmentType2=>(CommandKitEnvironmentType2.CommandHandler="COMMAND_HANDLER",CommandKitEnvironmentType2))(CommandKitEnvironmentType||{});function after(fn){let env=getContext();if(!env)throw new Error("after must be called inside commandkit handler.");return env.registerDeferredFunction(fn)}__name(after,"after");function cancelAfter(id){let env=getContext();if(!env)throw new Error("cancelAfter must be called inside commandkit handler.");env.clearDeferredFunction(id)}__name(cancelAfter,"cancelAfter");export{CommandKitEnvironment,CommandKitEnvironmentType,after,cancelAfter};
2
+ //# sourceMappingURL=chunk-VRGHCTCP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context/environment.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { CommandKit } from '../CommandKit';\nimport { GenericFunction, getContext } from './async-context';\n\nexport interface CommandKitEnvironmentInternalData {\n executionError: Error | null;\n type: CommandKitEnvironmentType | null;\n variables: Map<string, any>;\n deferredFunctions: Map<string, GenericFunction<[CommandKitEnvironment]>>;\n marker: string;\n markStart: number;\n markEnd: number;\n captureResult: boolean;\n result: any;\n}\n\nexport class CommandKitEnvironment {\n #data: CommandKitEnvironmentInternalData = {\n executionError: null,\n type: null,\n variables: new Map(),\n deferredFunctions: new Map(),\n marker: '',\n markStart: 0,\n markEnd: 0,\n captureResult: false,\n result: null\n };\n\n /**\n * Creates the commandkit execution environment.\n * @param commandkit - The commandkit instance.\n */\n public constructor(public readonly commandkit: CommandKit) {}\n\n /**\n * Capture the result of the command execution\n * @internal\n */\n public captureResult(): void {\n this.#data.captureResult = true;\n }\n\n /**\n * Whether the result of the command execution is being captured.\n * @internal\n */\n public isCapturingResult(): boolean {\n return this.#data.captureResult;\n }\n\n /**\n * Set the result of the command execution\n * @internal\n */\n public setResult(result: any): void {\n this.#data.result = result;\n }\n\n /**\n * Get the result of the command execution\n * @internal\n */\n public getResult(): any {\n return this.#data.result;\n }\n\n /**\n * Get the execution error.\n * @internal\n */\n public getExecutionError(): Error | null {\n return this.#data.executionError;\n }\n\n /**\n * Set the execution error.\n * @param error - The error to set.\n * @internal\n */\n public setExecutionError(error: Error): void {\n if (this.#data.executionError) {\n throw new Error('Execution error already set.');\n }\n\n this.#data.executionError = error;\n }\n\n /**\n * Get the environment type.\n */\n public getType(): CommandKitEnvironmentType {\n const type = this.#data.type;\n\n if (!type) {\n throw new Error('Environment type not set.');\n }\n\n return type;\n }\n\n /**\n * Set the environment type.\n * @param type - The environment type to set.\n * @internal\n */\n public setType(type: CommandKitEnvironmentType): void {\n this.#data.type = type;\n }\n\n /**\n * The variables store for this environment.\n */\n public get variables(): Map<string, any> {\n return this.#data.variables;\n }\n\n /**\n * Register a deferred function.\n * @param fn - The deferred function to register.\n * @returns The deferred function id.\n * @internal\n */\n public registerDeferredFunction(\n fn: GenericFunction<[CommandKitEnvironment]>)\n : string {\n const id = randomUUID();\n this.#data.deferredFunctions.set(id, fn);\n return id;\n }\n\n /**\n * Clear a deferred function by id.\n * @param id - The deferred function id to clear.\n * @internal\n */\n public clearDeferredFunction(id: string): void {\n this.#data.deferredFunctions.delete(id);\n }\n\n /**\n * Run all deferred functions sequentially.\n * @internal\n */\n public async runDeferredFunctions(): Promise<void> {\n for (const [id, fn] of this.#data.deferredFunctions) {\n try {\n await fn(this);\n } catch (e) {\n this.commandkit.emit('unhandledDeferredFunctionRejection', e);\n } finally {\n this.clearDeferredFunction(id);\n }\n }\n }\n\n /**\n * Clear all deferred functions.\n * @internal\n */\n public clearAllDeferredFunctions(): void {\n this.#data.deferredFunctions.clear();\n }\n\n /**\n * Mark the start of a command execution.\n * @param marker - The marker to set.\n * @internal\n */\n public markStart(marker: string): void {\n this.#data.marker = marker;\n this.#data.markStart = performance.now();\n }\n\n /**\n * Mark the end of a command execution.\n * @internal\n */\n public markEnd(): void {\n if (!this.#data.markEnd) this.#data.markEnd = performance.now();\n }\n\n /**\n * Get the marker.\n * @internal\n */\n public getMarker(): string {\n return this.#data.marker;\n }\n\n /**\n * Get the execution time in milliseconds.\n * @internal\n */\n public getExecutionTime(): number {\n return Math.abs(this.#data.markEnd - this.#data.markStart);\n }\n}\n\nexport enum CommandKitEnvironmentType {\n CommandHandler = 'COMMAND_HANDLER',\n}\n\n/**\n * Runs the given function after the current handler has finished executing.\n * @param fn The function to run after the current handler.\n * @returns The deferred function id. This can be used to cancel the deferred function.\n */\nexport function after(fn: GenericFunction<[CommandKitEnvironment]>): string {\n const env = getContext();\n\n if (!env) {\n throw new Error('after must be called inside commandkit handler.');\n }\n\n return env.registerDeferredFunction(fn);\n}\n\n/**\n * Cancels a deferred function registered with `after`.\n * @param id The deferred function id to cancel.\n */\nexport function cancelAfter(id: string): void {\n const env = getContext();\n\n if (!env) {\n throw new Error('cancelAfter must be called inside commandkit handler.');\n }\n\n env.clearDeferredFunction(id);\n}"],"mappings":"sFAAA,OAAS,eAAkB,cAgBpB,IAAM,sBAAN,KAA4B,CAiB1B,YAA4B,WAAwB,CAAxB,0BAAyB,CAjC9D,MAgBmC,sCACjC,MAA2C,CACzC,eAAgB,KAChB,KAAM,KACN,UAAW,IAAI,IACf,kBAAmB,IAAI,IACvB,OAAQ,GACR,UAAW,EACX,QAAS,EACT,cAAe,GACf,OAAQ,IACV,EAYO,eAAsB,CAC3B,KAAK,MAAM,cAAgB,EAC7B,CAMO,mBAA6B,CAClC,OAAO,KAAK,MAAM,aACpB,CAMO,UAAU,OAAmB,CAClC,KAAK,MAAM,OAAS,MACtB,CAMO,WAAiB,CACtB,OAAO,KAAK,MAAM,MACpB,CAMO,mBAAkC,CACvC,OAAO,KAAK,MAAM,cACpB,CAOO,kBAAkB,MAAoB,CAC3C,GAAI,KAAK,MAAM,eACb,MAAM,IAAI,MAAM,8BAA8B,EAGhD,KAAK,MAAM,eAAiB,KAC9B,CAKO,SAAqC,CAC1C,IAAM,KAAO,KAAK,MAAM,KAExB,GAAI,CAAC,KACH,MAAM,IAAI,MAAM,2BAA2B,EAG7C,OAAO,IACT,CAOO,QAAQ,KAAuC,CACpD,KAAK,MAAM,KAAO,IACpB,CAKA,IAAW,WAA8B,CACvC,OAAO,KAAK,MAAM,SACpB,CAQO,yBACP,GACS,CACP,IAAM,GAAK,WAAW,EACtB,YAAK,MAAM,kBAAkB,IAAI,GAAI,EAAE,EAChC,EACT,CAOO,sBAAsB,GAAkB,CAC7C,KAAK,MAAM,kBAAkB,OAAO,EAAE,CACxC,CAMA,MAAa,sBAAsC,CACjD,OAAW,CAAC,GAAI,EAAE,IAAK,KAAK,MAAM,kBAChC,GAAI,CACF,MAAM,GAAG,IAAI,CACf,OAAS,EAAG,CACV,KAAK,WAAW,KAAK,qCAAsC,CAAC,CAC9D,QAAE,CACA,KAAK,sBAAsB,EAAE,CAC/B,CAEJ,CAMO,2BAAkC,CACvC,KAAK,MAAM,kBAAkB,MAAM,CACrC,CAOO,UAAU,OAAsB,CACrC,KAAK,MAAM,OAAS,OACpB,KAAK,MAAM,UAAY,YAAY,IAAI,CACzC,CAMO,SAAgB,CAChB,KAAK,MAAM,UAAS,KAAK,MAAM,QAAU,YAAY,IAAI,EAChE,CAMO,WAAoB,CACzB,OAAO,KAAK,MAAM,MACpB,CAMO,kBAA2B,CAChC,OAAO,KAAK,IAAI,KAAK,MAAM,QAAU,KAAK,MAAM,SAAS,CAC3D,CACF,EAEY,2BAAAA,6BACVA,2BAAA,eAAiB,kBADPA,6BAAA,+BASL,SAAS,MAAM,GAAsD,CAC1E,IAAM,IAAM,WAAW,EAEvB,GAAI,CAAC,IACH,MAAM,IAAI,MAAM,iDAAiD,EAGnE,OAAO,IAAI,yBAAyB,EAAE,CACxC,CARgB,sBAcT,SAAS,YAAY,GAAkB,CAC5C,IAAM,IAAM,WAAW,EAEvB,GAAI,CAAC,IACH,MAAM,IAAI,MAAM,uDAAuD,EAGzE,IAAI,sBAAsB,EAAE,CAC9B,CARgB","names":["CommandKitEnvironmentType"]}
@@ -1,2 +1,2 @@
1
- import{__name}from"./chunk-7KD7ZCH6.mjs";import{ButtonStyle,ButtonBuilder,ComponentType}from"discord.js";var ButtonKit=class extends ButtonBuilder{static{__name(this,"ButtonKit")}#onClickHandler=null;#onEndHandler=null;#contextData=null;#collector=null;onClick(handler,data){if(this.data.style===ButtonStyle.Link)throw new TypeError('Cannot setup "onClick" handler on link buttons.');if(!handler)throw new TypeError('Cannot setup "onClick" without a handler function parameter.');return this.#destroyCollector(),this.#onClickHandler=handler,data&&(this.#contextData=data),this.#setupInteractionCollector(),this}onEnd(handler){if(!handler)throw new TypeError('Cannot setup "onEnd" without a handler function parameter.');return this.#onEndHandler=handler,this}#setupInteractionCollector(){if(!this.#contextData||!this.#onClickHandler)return;let message=this.#contextData.message;if(!message)throw new TypeError('Cannot setup "onClick" handler without a message in the context data.');if("customId"in this.data&&!this.data.customId)throw new TypeError('Cannot setup "onClick" handler on a button without a custom id.');let data={time:864e5,autoReset:!0,...this.#contextData},collector=this.#collector=message.createMessageComponentCollector({filter:interaction=>interaction.customId===this.data.custom_id&&interaction.message.id===message.id,componentType:ComponentType.Button,...data});this.#collector.on("collect",interaction=>{let handler=this.#onClickHandler;return handler?this.#collector?(data.autoReset&&this.#collector.resetTimer(),handler(interaction)):collector.stop("destroyed"):this.#destroyCollector()}),this.#collector.on("end",(_,reason)=>{this.#destroyCollector(),this.#onEndHandler?.(reason)})}dispose(){return this.#destroyCollector(),this.#onEndHandler?.("disposed"),this}#destroyCollector(){this.#collector?.stop("end"),this.#collector?.removeAllListeners(),this.#collector=null,this.#contextData=null,this.#onClickHandler=null}};export{ButtonKit};
2
- //# sourceMappingURL=chunk-4IWEG3WI.mjs.map
1
+ import{__name}from"./chunk-6TIBWNPX.mjs";import{ButtonStyle,ButtonBuilder,ComponentType}from"discord.js";var ButtonKit=class extends ButtonBuilder{static{__name(this,"ButtonKit")}#onClickHandler=null;#onEndHandler=null;#contextData=null;#collector=null;onClick(handler,data){if(this.data.style===ButtonStyle.Link)throw new TypeError('Cannot setup "onClick" handler on link buttons.');if(!handler)throw new TypeError('Cannot setup "onClick" without a handler function parameter.');return this.#destroyCollector(),this.#onClickHandler=handler,data&&(this.#contextData=data),this.#setupInteractionCollector(),this}onEnd(handler){if(!handler)throw new TypeError('Cannot setup "onEnd" without a handler function parameter.');return this.#onEndHandler=handler,this}#setupInteractionCollector(){if(!this.#contextData||!this.#onClickHandler)return;let message=this.#contextData.message;if(!message)throw new TypeError('Cannot setup "onClick" handler without a message in the context data.');if("customId"in this.data&&!this.data.customId)throw new TypeError('Cannot setup "onClick" handler on a button without a custom id.');let data={time:864e5,autoReset:!0,...this.#contextData},collector=this.#collector=message.createMessageComponentCollector({filter:__name(interaction=>interaction.customId===this.data.custom_id&&interaction.message.id===message.id,"filter"),componentType:ComponentType.Button,...data});this.#collector.on("collect",interaction=>{let handler=this.#onClickHandler;return handler?this.#collector?(data.autoReset&&this.#collector.resetTimer(),handler(interaction)):collector.stop("destroyed"):this.#destroyCollector()}),this.#collector.on("end",(_,reason)=>{this.#destroyCollector(),this.#onEndHandler?.(reason)})}dispose(){return this.#destroyCollector(),this.#onEndHandler?.("disposed"),this}#destroyCollector(){this.#collector?.stop("end"),this.#collector?.removeAllListeners(),this.#collector=null,this.#contextData=null,this.#onClickHandler=null}};export{ButtonKit};
2
+ //# sourceMappingURL=chunk-WNEBLBID.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ButtonKit.ts"],"sourcesContent":["import {\n type Message,\n type Awaitable,\n type ButtonInteraction,\n type InteractionCollector,\n type InteractionCollectorOptions,\n type APIButtonComponentWithCustomId,\n ButtonStyle,\n ButtonBuilder,\n ComponentType } from\n'discord.js';\n\n/**\n * The handler to run when a button is clicked. This handler is called with the interaction as the first argument.\n * If the first argument is null, it means that the interaction collector has been destroyed.\n */\nexport type CommandKitButtonBuilderInteractionCollectorDispatch = (\ninteraction: ButtonInteraction)\n=> Awaitable<void>;\n\nexport type CommandKitButtonBuilderOnEnd = (reason: string) => Awaitable<void>;\n\nexport type CommandKitButtonBuilderInteractionCollectorDispatchContextData = {\n /**\n * The message to listen for button interactions on.\n */\n message: Message;\n /**\n * The duration (in ms) that the collector should run for.\n */\n time?: number;\n /**\n * If the collector should automatically reset the timer when a button is clicked.\n */\n autoReset?: boolean;\n} & Omit<\n InteractionCollectorOptions<ButtonInteraction>,\n 'filter' | 'componentType'>;\n\n\nexport class ButtonKit extends ButtonBuilder {\n #onClickHandler: CommandKitButtonBuilderInteractionCollectorDispatch | null =\n null;\n #onEndHandler: CommandKitButtonBuilderOnEnd | null = null;\n #contextData: CommandKitButtonBuilderInteractionCollectorDispatchContextData | null =\n null;\n #collector: InteractionCollector<ButtonInteraction> | null = null;\n\n /**\n * Sets up an inline interaction collector for this button. This collector by default allows as many interactions as possible if it is actively used.\n * If unused, this expires after 24 hours or custom time if specified.\n * @param handler The handler to run when the button is clicked\n * @param data The context data to use for the interaction collector\n * @returns This button\n * @example\n * ```ts\n * const button = new ButtonKit()\n * .setLabel('Click me')\n * .setStyle(ButtonStyle.Primary)\n * .setCustomId('click_me');\n *\n * const row = new ActionRowBuilder().addComponents(button);\n *\n * const message = await channel.send({ content: 'Click the button', components: [row] });\n *\n * button.onClick(async (interaction) => {\n * await interaction.reply('You clicked me!');\n * }, { message });\n *\n * // Remove onClick handler and destroy the interaction collector\n * button.onClick(null);\n * ```\n */\n public onClick(\n handler: CommandKitButtonBuilderInteractionCollectorDispatch,\n data?: CommandKitButtonBuilderInteractionCollectorDispatchContextData)\n : this {\n if (this.data.style === ButtonStyle.Link) {\n throw new TypeError('Cannot setup \"onClick\" handler on link buttons.');\n }\n\n if (!handler) {\n throw new TypeError(\n 'Cannot setup \"onClick\" without a handler function parameter.'\n );\n }\n\n this.#destroyCollector();\n\n this.#onClickHandler = handler;\n if (data) this.#contextData = data;\n\n this.#setupInteractionCollector();\n\n return this;\n }\n\n public onEnd(handler: CommandKitButtonBuilderOnEnd): this {\n if (!handler) {\n throw new TypeError(\n 'Cannot setup \"onEnd\" without a handler function parameter.'\n );\n }\n\n this.#onEndHandler = handler;\n\n return this;\n }\n\n #setupInteractionCollector() {\n if (!this.#contextData || !this.#onClickHandler) return;\n\n const message = this.#contextData.message;\n\n if (!message) {\n throw new TypeError(\n 'Cannot setup \"onClick\" handler without a message in the context data.'\n );\n }\n\n if ('customId' in this.data && !this.data.customId) {\n throw new TypeError(\n 'Cannot setup \"onClick\" handler on a button without a custom id.'\n );\n }\n\n const data = {\n time: 86_400_000,\n autoReset: true,\n ...this.#contextData\n };\n\n const collector = this.#collector =\n message.createMessageComponentCollector({\n filter: (interaction) =>\n interaction.customId ===\n (<APIButtonComponentWithCustomId> this.data).custom_id &&\n interaction.message.id === message.id,\n componentType: ComponentType.Button,\n ...data\n });\n\n this.#collector.on('collect', (interaction) => {\n const handler = this.#onClickHandler;\n\n if (!handler) return this.#destroyCollector();\n\n if (!this.#collector) {\n return collector.stop('destroyed');\n }\n\n if (data.autoReset) {\n this.#collector.resetTimer();\n }\n\n return handler(interaction);\n });\n\n this.#collector.on('end', (_, reason) => {\n this.#destroyCollector();\n this.#onEndHandler?.(reason);\n });\n }\n\n public dispose() {\n this.#destroyCollector();\n this.#onEndHandler?.('disposed');\n return this;\n }\n\n #destroyCollector() {\n this.#collector?.stop('end');\n this.#collector?.removeAllListeners();\n this.#collector = null;\n this.#contextData = null;\n this.#onClickHandler = null;\n }\n}"],"mappings":"yCAAA,OAOE,YACA,cACA,kBACF,aA8BO,IAAM,UAAN,cAAwB,aAAc,CAxC7C,MAwC6C,0BAC3C,gBACA,KACA,cAAqD,KACrD,aACA,KACA,WAA6D,KA2BtD,QACP,QACA,KACO,CACL,GAAI,KAAK,KAAK,QAAU,YAAY,KAClC,MAAM,IAAI,UAAU,iDAAiD,EAGvE,GAAI,CAAC,QACH,MAAM,IAAI,UACR,8DACF,EAGF,YAAK,kBAAkB,EAEvB,KAAK,gBAAkB,QACnB,OAAM,KAAK,aAAe,MAE9B,KAAK,2BAA2B,EAEzB,IACT,CAEO,MAAM,QAA6C,CACxD,GAAI,CAAC,QACH,MAAM,IAAI,UACR,4DACF,EAGF,YAAK,cAAgB,QAEd,IACT,CAEA,4BAA6B,CAC3B,GAAI,CAAC,KAAK,cAAgB,CAAC,KAAK,gBAAiB,OAEjD,IAAM,QAAU,KAAK,aAAa,QAElC,GAAI,CAAC,QACH,MAAM,IAAI,UACR,uEACF,EAGF,GAAI,aAAc,KAAK,MAAQ,CAAC,KAAK,KAAK,SACxC,MAAM,IAAI,UACR,iEACF,EAGF,IAAM,KAAO,CACX,KAAM,MACN,UAAW,GACX,GAAG,KAAK,YACV,EAEM,UAAY,KAAK,WACvB,QAAQ,gCAAgC,CACtC,OAAS,aACT,YAAY,WACsB,KAAK,KAAM,WAC7C,YAAY,QAAQ,KAAO,QAAQ,GACnC,cAAe,cAAc,OAC7B,GAAG,IACL,CAAC,EAED,KAAK,WAAW,GAAG,UAAY,aAAgB,CAC7C,IAAM,QAAU,KAAK,gBAErB,OAAK,QAEA,KAAK,YAIN,KAAK,WACP,KAAK,WAAW,WAAW,EAGtB,QAAQ,WAAW,GAPjB,UAAU,KAAK,WAAW,EAHd,KAAK,kBAAkB,CAW9C,CAAC,EAED,KAAK,WAAW,GAAG,MAAO,CAAC,EAAG,SAAW,CACvC,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,MAAM,CAC7B,CAAC,CACH,CAEO,SAAU,CACf,YAAK,kBAAkB,EACvB,KAAK,gBAAgB,UAAU,EACxB,IACT,CAEA,mBAAoB,CAClB,KAAK,YAAY,KAAK,KAAK,EAC3B,KAAK,YAAY,mBAAmB,EACpC,KAAK,WAAa,KAClB,KAAK,aAAe,KACpB,KAAK,gBAAkB,IACzB,CACF","names":[]}
1
+ {"version":3,"sources":["../src/components/ButtonKit.ts"],"sourcesContent":["import {\n type Message,\n type Awaitable,\n type ButtonInteraction,\n type InteractionCollector,\n type InteractionCollectorOptions,\n type APIButtonComponentWithCustomId,\n ButtonStyle,\n ButtonBuilder,\n ComponentType } from\n'discord.js';\n\n/**\n * The handler to run when a button is clicked. This handler is called with the interaction as the first argument.\n * If the first argument is null, it means that the interaction collector has been destroyed.\n */\nexport type CommandKitButtonBuilderInteractionCollectorDispatch = (\ninteraction: ButtonInteraction)\n=> Awaitable<void>;\n\nexport type CommandKitButtonBuilderOnEnd = (reason: string) => Awaitable<void>;\n\nexport type CommandKitButtonBuilderInteractionCollectorDispatchContextData = {\n /**\n * The message to listen for button interactions on.\n */\n message: Message;\n /**\n * The duration (in ms) that the collector should run for.\n */\n time?: number;\n /**\n * If the collector should automatically reset the timer when a button is clicked.\n */\n autoReset?: boolean;\n} & Omit<\n InteractionCollectorOptions<ButtonInteraction>,\n 'filter' | 'componentType'>;\n\n\nexport class ButtonKit extends ButtonBuilder {\n #onClickHandler: CommandKitButtonBuilderInteractionCollectorDispatch | null =\n null;\n #onEndHandler: CommandKitButtonBuilderOnEnd | null = null;\n #contextData: CommandKitButtonBuilderInteractionCollectorDispatchContextData | null =\n null;\n #collector: InteractionCollector<ButtonInteraction> | null = null;\n\n /**\n * Sets up an inline interaction collector for this button. This collector by default allows as many interactions as possible if it is actively used.\n * If unused, this expires after 24 hours or custom time if specified.\n * @param handler The handler to run when the button is clicked\n * @param data The context data to use for the interaction collector\n * @returns This button\n * @example\n * ```ts\n * const button = new ButtonKit()\n * .setLabel('Click me')\n * .setStyle(ButtonStyle.Primary)\n * .setCustomId('click_me');\n *\n * const row = new ActionRowBuilder().addComponents(button);\n *\n * const message = await channel.send({ content: 'Click the button', components: [row] });\n *\n * button.onClick(async (interaction) => {\n * await interaction.reply('You clicked me!');\n * }, { message });\n *\n * // Remove onClick handler and destroy the interaction collector\n * button.onClick(null);\n * ```\n */\n public onClick(\n handler: CommandKitButtonBuilderInteractionCollectorDispatch,\n data?: CommandKitButtonBuilderInteractionCollectorDispatchContextData)\n : this {\n if (this.data.style === ButtonStyle.Link) {\n throw new TypeError('Cannot setup \"onClick\" handler on link buttons.');\n }\n\n if (!handler) {\n throw new TypeError(\n 'Cannot setup \"onClick\" without a handler function parameter.'\n );\n }\n\n this.#destroyCollector();\n\n this.#onClickHandler = handler;\n if (data) this.#contextData = data;\n\n this.#setupInteractionCollector();\n\n return this;\n }\n\n public onEnd(handler: CommandKitButtonBuilderOnEnd): this {\n if (!handler) {\n throw new TypeError(\n 'Cannot setup \"onEnd\" without a handler function parameter.'\n );\n }\n\n this.#onEndHandler = handler;\n\n return this;\n }\n\n #setupInteractionCollector() {\n if (!this.#contextData || !this.#onClickHandler) return;\n\n const message = this.#contextData.message;\n\n if (!message) {\n throw new TypeError(\n 'Cannot setup \"onClick\" handler without a message in the context data.'\n );\n }\n\n if ('customId' in this.data && !this.data.customId) {\n throw new TypeError(\n 'Cannot setup \"onClick\" handler on a button without a custom id.'\n );\n }\n\n const data = {\n time: 86_400_000,\n autoReset: true,\n ...this.#contextData\n };\n\n const collector = this.#collector =\n message.createMessageComponentCollector({\n filter: (interaction) =>\n interaction.customId ===\n (<APIButtonComponentWithCustomId> this.data).custom_id &&\n interaction.message.id === message.id,\n componentType: ComponentType.Button,\n ...data\n });\n\n this.#collector.on('collect', (interaction) => {\n const handler = this.#onClickHandler;\n\n if (!handler) return this.#destroyCollector();\n\n if (!this.#collector) {\n return collector.stop('destroyed');\n }\n\n if (data.autoReset) {\n this.#collector.resetTimer();\n }\n\n return handler(interaction);\n });\n\n this.#collector.on('end', (_, reason) => {\n this.#destroyCollector();\n this.#onEndHandler?.(reason);\n });\n }\n\n public dispose() {\n this.#destroyCollector();\n this.#onEndHandler?.('disposed');\n return this;\n }\n\n #destroyCollector() {\n this.#collector?.stop('end');\n this.#collector?.removeAllListeners();\n this.#collector = null;\n this.#contextData = null;\n this.#onClickHandler = null;\n }\n}"],"mappings":"yCAAA,OAOE,YACA,cACA,kBACF,aA8BO,IAAM,UAAN,cAAwB,aAAc,CAxC7C,MAwC6C,0BAC3C,gBACA,KACA,cAAqD,KACrD,aACA,KACA,WAA6D,KA2BtD,QACP,QACA,KACO,CACL,GAAI,KAAK,KAAK,QAAU,YAAY,KAClC,MAAM,IAAI,UAAU,iDAAiD,EAGvE,GAAI,CAAC,QACH,MAAM,IAAI,UACR,8DACF,EAGF,YAAK,kBAAkB,EAEvB,KAAK,gBAAkB,QACnB,OAAM,KAAK,aAAe,MAE9B,KAAK,2BAA2B,EAEzB,IACT,CAEO,MAAM,QAA6C,CACxD,GAAI,CAAC,QACH,MAAM,IAAI,UACR,4DACF,EAGF,YAAK,cAAgB,QAEd,IACT,CAEA,4BAA6B,CAC3B,GAAI,CAAC,KAAK,cAAgB,CAAC,KAAK,gBAAiB,OAEjD,IAAM,QAAU,KAAK,aAAa,QAElC,GAAI,CAAC,QACH,MAAM,IAAI,UACR,uEACF,EAGF,GAAI,aAAc,KAAK,MAAQ,CAAC,KAAK,KAAK,SACxC,MAAM,IAAI,UACR,iEACF,EAGF,IAAM,KAAO,CACX,KAAM,MACN,UAAW,GACX,GAAG,KAAK,YACV,EAEM,UAAY,KAAK,WACvB,QAAQ,gCAAgC,CACtC,OAAQ,OAAC,aACT,YAAY,WACsB,KAAK,KAAM,WAC7C,YAAY,QAAQ,KAAO,QAAQ,GAH3B,UAIR,cAAe,cAAc,OAC7B,GAAG,IACL,CAAC,EAED,KAAK,WAAW,GAAG,UAAY,aAAgB,CAC7C,IAAM,QAAU,KAAK,gBAErB,OAAK,QAEA,KAAK,YAIN,KAAK,WACP,KAAK,WAAW,WAAW,EAGtB,QAAQ,WAAW,GAPjB,UAAU,KAAK,WAAW,EAHd,KAAK,kBAAkB,CAW9C,CAAC,EAED,KAAK,WAAW,GAAG,MAAO,CAAC,EAAG,SAAW,CACvC,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,MAAM,CAC7B,CAAC,CACH,CAEO,SAAU,CACf,YAAK,kBAAkB,EACvB,KAAK,gBAAgB,UAAU,EACxB,IACT,CAEA,mBAAoB,CAClB,KAAK,YAAY,KAAK,KAAK,EAC3B,KAAK,YAAY,mBAAmB,EACpC,KAAK,WAAa,KAClB,KAAK,aAAe,KACpB,KAAK,gBAAkB,IACzB,CACF","names":[]}
@@ -0,0 +1,2 @@
1
+ import{CacheProvider}from"./chunk-GOXZZ7GU.mjs";import{__name}from"./chunk-6TIBWNPX.mjs";var MemoryCache=class extends CacheProvider{static{__name(this,"MemoryCache")}#cache=new Map;async get(key){let entry=this.#cache.get(key);if(entry){if(entry.ttl&&Date.now()>entry.ttl){this.#cache.delete(key);return}return entry.value}}async set(key,value,ttl){this.#cache.set(key,{key,value,ttl:ttl!=null?Date.now()+ttl:void 0})}async exists(key){return this.#cache.has(key)}async delete(key){this.#cache.delete(key)}async clear(){this.#cache.clear()}};export{MemoryCache};
2
+ //# sourceMappingURL=chunk-XHS5CRG6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cache/MemoryCache.ts"],"sourcesContent":["import { CacheProvider } from './CacheProvider';\n\nexport interface MemoryCacheEntry {\n key: string;\n value: any;\n ttl?: number;\n}\n\nexport class MemoryCache extends CacheProvider {\n #cache = new Map<string, MemoryCacheEntry>();\n\n public async get<T>(key: string): Promise<T | undefined> {\n const entry = this.#cache.get(key);\n\n if (!entry) {\n return undefined;\n }\n\n if (entry.ttl && Date.now() > entry.ttl) {\n this.#cache.delete(key);\n return undefined;\n }\n\n return entry.value;\n }\n\n public async set<T>(key: string, value: T, ttl?: number): Promise<void> {\n this.#cache.set(key, {\n key,\n value,\n ttl: ttl != null ? Date.now() + ttl : undefined\n });\n }\n\n public async exists(key: string): Promise<boolean> {\n return this.#cache.has(key);\n }\n\n public async delete(key: string): Promise<void> {\n this.#cache.delete(key);\n }\n\n public async clear(): Promise<void> {\n this.#cache.clear();\n }\n}"],"mappings":"yFAQO,IAAM,YAAN,cAA0B,aAAc,CAR/C,MAQ+C,4BAC7C,OAAS,IAAI,IAEb,MAAa,IAAO,IAAqC,CACvD,IAAM,MAAQ,KAAK,OAAO,IAAI,GAAG,EAEjC,GAAK,MAIL,IAAI,MAAM,KAAO,KAAK,IAAI,EAAI,MAAM,IAAK,CACvC,KAAK,OAAO,OAAO,GAAG,EACtB,MACF,CAEA,OAAO,MAAM,MACf,CAEA,MAAa,IAAO,IAAa,MAAU,IAA6B,CACtE,KAAK,OAAO,IAAI,IAAK,CACnB,IACA,MACA,IAAK,KAAO,KAAO,KAAK,IAAI,EAAI,IAAM,MACxC,CAAC,CACH,CAEA,MAAa,OAAO,IAA+B,CACjD,OAAO,KAAK,OAAO,IAAI,GAAG,CAC5B,CAEA,MAAa,OAAO,IAA4B,CAC9C,KAAK,OAAO,OAAO,GAAG,CACxB,CAEA,MAAa,OAAuB,CAClC,KAAK,OAAO,MAAM,CACpB,CACF","names":[]}
@@ -1,7 +1,7 @@
1
- import{areSlashCommandsDifferent}from"./chunk-UXQFRVAB.mjs";import{colors_default}from"./chunk-ZE7AC2HG.mjs";import{__name}from"./chunk-7KD7ZCH6.mjs";async function registerCommands(props){if(props.reloading)if(props.client.isReady())await handleRegistration(props.client,props.commands,props.devGuildIds,props.type);else throw new Error(colors_default.red("Cannot reload commands when client is not ready."));else props.client.once("ready",async c=>{await handleRegistration(c,props.commands,props.devGuildIds,props.type)})}__name(registerCommands,"registerCommands");async function handleRegistration(client,commands,devGuildIds,type){let devOnlyCommands=commands.filter(cmd=>cmd.options?.devOnly),globalCommands=commands.filter(cmd=>!cmd.options?.devOnly);type==="dev"?await registerDevCommands(client,devOnlyCommands,devGuildIds):type==="global"?await registerGlobalCommands(client,globalCommands):(await registerDevCommands(client,devOnlyCommands,devGuildIds),await registerGlobalCommands(client,globalCommands))}__name(handleRegistration,"handleRegistration");async function registerGlobalCommands(client,commands){let appCommandsManager=client.application.commands;await appCommandsManager.fetch();for(let command of commands){let targetCommand=appCommandsManager.cache.find(cmd=>cmd.name===command.data.name);if(command.options?.deleted){targetCommand?(await targetCommand.delete().catch(error=>{throw new Error(colors_default.red(`Failed to delete command "${command.data.name}" globally.
1
+ import{areSlashCommandsDifferent}from"./chunk-6AX5YJEO.mjs";import{colors_default}from"./chunk-C6WU57FQ.mjs";import{__name}from"./chunk-6TIBWNPX.mjs";async function registerCommands(props){if(props.reloading)if(props.client.isReady())await handleRegistration(props.client,props.commands,props.devGuildIds,props.type);else throw new Error(colors_default.red("Cannot reload commands when client is not ready."));else props.client.once("ready",async c=>{await handleRegistration(c,props.commands,props.devGuildIds,props.type)})}__name(registerCommands,"registerCommands");async function handleRegistration(client,commands,devGuildIds,type){let devOnlyCommands=commands.filter(cmd=>cmd.options?.devOnly),globalCommands=commands.filter(cmd=>!cmd.options?.devOnly);type==="dev"?await registerDevCommands(client,devOnlyCommands,devGuildIds):type==="global"?await registerGlobalCommands(client,globalCommands):(await registerDevCommands(client,devOnlyCommands,devGuildIds),await registerGlobalCommands(client,globalCommands))}__name(handleRegistration,"handleRegistration");async function registerGlobalCommands(client,commands){let appCommandsManager=client.application.commands;await appCommandsManager.fetch();for(let command of commands){let targetCommand=appCommandsManager.cache.find(cmd=>cmd.name===command.data.name);if(command.options?.deleted){targetCommand?(await targetCommand.delete().catch(error=>{throw new Error(colors_default.red(`Failed to delete command "${command.data.name}" globally.
2
2
  `),error)}),console.log(colors_default.green(`Deleted command "${command.data.name}" globally.`))):process.emitWarning(colors_default.yellow(`Ignoring: Command "${command.data.name}" is globally marked as deleted.`));continue}if(targetCommand&&areSlashCommandsDifferent(targetCommand,command.data)){await targetCommand.edit(command.data).catch(error=>{throw new Error(colors_default.red(`Failed to edit command "${command.data.name}" globally.
3
3
  `),error)}),console.log(colors_default.green(`Edited command "${command.data.name}" globally.`));continue}targetCommand||(await appCommandsManager.create(command.data).catch(error=>{throw new Error(colors_default.red(`Failed to register command "${command.data.name}" globally.
4
4
  `),error)}),console.log(colors_default.green(`Registered command "${command.data.name}" globally.`)))}}__name(registerGlobalCommands,"registerGlobalCommands");async function registerDevCommands(client,commands,guildIds){let devGuilds=[];for(let guildId of guildIds){let guild=client.guilds.cache.get(guildId)||await client.guilds.fetch(guildId);if(!guild){process.emitWarning(colors_default.yellow(`Ignoring: Guild ${guildId} doesn't exist or client isn't part of the guild.`));continue}devGuilds.push(guild)}let guildCommandsManagers=[];for(let guild of devGuilds){let guildCommandsManager=guild.commands;await guildCommandsManager.fetch(),guildCommandsManagers.push(guildCommandsManager)}for(let command of commands)for(let guildCommands of guildCommandsManagers){let targetCommand=guildCommands.cache.find(cmd=>cmd.name===command.data.name);if(command.options?.deleted){targetCommand?(await targetCommand.delete().catch(error=>{throw new Error(colors_default.red(`Failed to delete command "${command.data.name}" in ${guildCommands.guild.name}.`),error)}),console.log(colors_default.green(`Deleted command "${command.data.name}" in ${guildCommands.guild.name}.`))):process.emitWarning(colors_default.yellow(`Ignoring: Command "${command.data.name}" is marked as deleted in ${guildCommands.guild.name}.`));continue}if(targetCommand&&areSlashCommandsDifferent(targetCommand,command.data)){await targetCommand.edit(command.data).catch(error=>{throw new Error(colors_default.red(`Failed to edit command "${command.data.name}" in ${guildCommands.guild.name}.
5
5
  `),error)}),console.log(colors_default.green(`Edited command "${command.data.name}" in ${guildCommands.guild.name}.`));continue}targetCommand||(await guildCommands.create(command.data).catch(error=>{throw new Error(colors_default.red(`Failed to register command "${command.data.name}" in ${guildCommands.guild.name}.
6
6
  `),error)}),console.log(colors_default.green(`Registered command "${command.data.name}" in ${guildCommands.guild.name}.`)))}}__name(registerDevCommands,"registerDevCommands");export{registerCommands};
7
- //# sourceMappingURL=chunk-I2MRY4KL.mjs.map
7
+ //# sourceMappingURL=chunk-XJCWZEWC.mjs.map
@@ -0,0 +1,2 @@
1
+ import{warnUnstable}from"./chunk-MVPNDXHU.mjs";import{after}from"./chunk-VRGHCTCP.mjs";import{useEnvironment}from"./chunk-UOPZOWKS.mjs";import{CommandKitErrorCodes}from"./chunk-4BV475NY.mjs";import{__name}from"./chunk-6TIBWNPX.mjs";import{InteractionResponse,Message}from"discord.js";async function unstable_cache(options){warnUnstable("unstable_cache()");let env=useEnvironment(),commandkit=env.commandkit,cache=commandkit.getCacheProvider();if(!cache)throw new Error("cache() cannot be used without a cache provider.");let params=typeof options=="string"?{name:options}:options,data=await cache.get(params.name);if(data){let error=new Error("Cache hit exception");throw Reflect.set(error,"data",data),Reflect.set(error,"code",CommandKitErrorCodes.CacheHit),error}env.captureResult(),after(async env2=>{try{let result=await env2.getResult();if(result==null)return;if(result instanceof InteractionResponse){let message=await result.fetch();await cache.set(params.name,{content:message.content,embeds:message.embeds,components:message.components},params.ttl)}else if(result instanceof Message)await cache.set(params.name,{content:result.content,embeds:result.embeds,components:result.components},params.ttl);else{let json="toJSON"in result?result.toJSON():result;await cache.set(params.name,json,params.ttl)}}catch(e){commandkit.emit("cacheError",e)}})}__name(unstable_cache,"unstable_cache");async function unstable_expire(name){warnUnstable("unstable_expire()");let cache=useEnvironment().commandkit.getCacheProvider();if(!cache)throw new Error("expire() cannot be used without a cache provider.");await cache.delete(name)}__name(unstable_expire,"unstable_expire");export{unstable_cache,unstable_expire};
2
+ //# sourceMappingURL=chunk-YTD7MZPP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cache/index.ts"],"sourcesContent":["import { InteractionResponse, Message } from 'discord.js';\nimport { useEnvironment } from '../context/async-context';\nimport { after } from '../context/environment';\nimport { CommandKitErrorCodes } from '../utils/error-codes';\nimport { warnUnstable } from '../utils/warn-unstable';\n\nexport * from './CacheProvider';\nexport * from './MemoryCache';\n\nexport interface CacheOptions {\n /**\n * The name of the cache key.\n */\n name: string;\n /**\n * The time-to-live of the cache key in milliseconds.\n */\n ttl?: number;\n}\n\n/**\n * Cache a value.\n * @param options The cache options.\n */\nexport async function unstable_cache(options: string): Promise<void>;\nexport async function unstable_cache(options: CacheOptions): Promise<void>;\nexport async function unstable_cache(\noptions: string | CacheOptions)\n: Promise<void> {\n warnUnstable('unstable_cache()');\n const env = useEnvironment();\n const commandkit = env.commandkit;\n const cache = commandkit.getCacheProvider();\n\n if (!cache) {\n throw new Error('cache() cannot be used without a cache provider.');\n }\n\n const params = typeof options === 'string' ? { name: options } : options;\n\n // check cache\n const data = await cache.get(params.name);\n\n if (data) {\n const error = new Error('Cache hit exception');\n Reflect.set(error, 'data', data);\n Reflect.set(error, 'code', CommandKitErrorCodes.CacheHit);\n\n throw error;\n }\n\n env.captureResult();\n\n after(async (env) => {\n try {\n const result = await env.getResult();\n\n if (result == null) return;\n\n if (result instanceof InteractionResponse) {\n const message = await result.fetch();\n await cache.set(\n params.name,\n {\n content: message.content,\n embeds: message.embeds,\n components: message.components\n },\n params.ttl\n );\n } else if (result instanceof Message) {\n await cache.set(\n params.name,\n {\n content: result.content,\n embeds: result.embeds,\n components: result.components\n },\n params.ttl\n );\n } else {\n const json = 'toJSON' in result ? result.toJSON() : result;\n\n await cache.set(params.name, json, params.ttl);\n }\n } catch (e) {\n commandkit.emit('cacheError', e);\n }\n });\n}\n\n/**\n * Manually expire a cache by its key.\n * @param name The name of the cache key.\n */\nexport async function unstable_expire(name: string): Promise<void> {\n warnUnstable('unstable_expire()');\n const env = useEnvironment();\n const commandkit = env.commandkit;\n const cache = commandkit.getCacheProvider();\n\n if (!cache) {\n throw new Error('expire() cannot be used without a cache provider.');\n }\n\n await cache.delete(name);\n}"],"mappings":"wOAAA,OAAS,oBAAqB,YAAe,aA0B7C,eAAsB,eACtB,QACgB,CACd,aAAa,kBAAkB,EAC/B,IAAM,IAAM,eAAe,EACrB,WAAa,IAAI,WACjB,MAAQ,WAAW,iBAAiB,EAE1C,GAAI,CAAC,MACH,MAAM,IAAI,MAAM,kDAAkD,EAGpE,IAAM,OAAS,OAAO,SAAY,SAAW,CAAE,KAAM,OAAQ,EAAI,QAG3D,KAAO,MAAM,MAAM,IAAI,OAAO,IAAI,EAExC,GAAI,KAAM,CACR,IAAM,MAAQ,IAAI,MAAM,qBAAqB,EAC7C,cAAQ,IAAI,MAAO,OAAQ,IAAI,EAC/B,QAAQ,IAAI,MAAO,OAAQ,qBAAqB,QAAQ,EAElD,KACR,CAEA,IAAI,cAAc,EAElB,MAAM,MAAOA,MAAQ,CACnB,GAAI,CACF,IAAM,OAAS,MAAMA,KAAI,UAAU,EAEnC,GAAI,QAAU,KAAM,OAEpB,GAAI,kBAAkB,oBAAqB,CACzC,IAAM,QAAU,MAAM,OAAO,MAAM,EACnC,MAAM,MAAM,IACV,OAAO,KACP,CACE,QAAS,QAAQ,QACjB,OAAQ,QAAQ,OAChB,WAAY,QAAQ,UACtB,EACA,OAAO,GACT,CACF,SAAW,kBAAkB,QAC3B,MAAM,MAAM,IACV,OAAO,KACP,CACE,QAAS,OAAO,QAChB,OAAQ,OAAO,OACf,WAAY,OAAO,UACrB,EACA,OAAO,GACT,MACK,CACL,IAAM,KAAO,WAAY,OAAS,OAAO,OAAO,EAAI,OAEpD,MAAM,MAAM,IAAI,OAAO,KAAM,KAAM,OAAO,GAAG,CAC/C,CACF,OAAS,EAAG,CACV,WAAW,KAAK,aAAc,CAAC,CACjC,CACF,CAAC,CACH,CA/DsB,wCAqEtB,eAAsB,gBAAgB,KAA6B,CACjE,aAAa,mBAAmB,EAGhC,IAAM,MAFM,eAAe,EACJ,WACE,iBAAiB,EAE1C,GAAI,CAAC,MACH,MAAM,IAAI,MAAM,mDAAmD,EAGrE,MAAM,MAAM,OAAO,IAAI,CACzB,CAXsB","names":["env"]}
@@ -1,2 +1,2 @@
1
- import{__name}from"./chunk-7KD7ZCH6.mjs";function devOnly_default({interaction,targetCommand,handlerData}){if(!interaction.isAutocomplete()&&targetCommand.options?.devOnly){if(interaction.inGuild()&&!handlerData.devGuildIds.includes(interaction.guildId))return interaction.reply({content:"\u274C This command can only be used inside development servers.",ephemeral:!0}),!0;let memberRoles=interaction.guild?.members.cache.get(interaction.user.id)?.roles.cache,hasDevRole=!1;if(memberRoles?.forEach(role=>{handlerData.devRoleIds.includes(role.id)&&(hasDevRole=!0)}),!(handlerData.devUserIds.includes(interaction.user.id)||hasDevRole))return interaction.reply({content:"\u274C This command can only be used by developers.",ephemeral:!0}),!0}}__name(devOnly_default,"default");export{devOnly_default};
2
- //# sourceMappingURL=chunk-4U6VHAPY.mjs.map
1
+ import{__name}from"./chunk-6TIBWNPX.mjs";function devOnly_default({interaction,targetCommand,handlerData}){if(!interaction.isAutocomplete()&&targetCommand.options?.devOnly){if(interaction.inGuild()&&!handlerData.devGuildIds.includes(interaction.guildId))return interaction.reply({content:"\u274C This command can only be used inside development servers.",ephemeral:!0}),!0;let memberRoles=interaction.guild?.members.cache.get(interaction.user.id)?.roles.cache,hasDevRole=!1;if(memberRoles?.forEach(role=>{handlerData.devRoleIds.includes(role.id)&&(hasDevRole=!0)}),!(handlerData.devUserIds.includes(interaction.user.id)||hasDevRole))return interaction.reply({content:"\u274C This command can only be used by developers.",ephemeral:!0}),!0}}__name(devOnly_default,"default");export{devOnly_default};
2
+ //# sourceMappingURL=chunk-Z4FBPRS6.mjs.map
@@ -1,2 +1,2 @@
1
- "use strict";var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __name=(target,value)=>__defProp(target,"name",{value,configurable:!0});var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var ButtonKit_exports={};__export(ButtonKit_exports,{ButtonKit:()=>ButtonKit});module.exports=__toCommonJS(ButtonKit_exports);var import_discord=require("discord.js");var ButtonKit=class extends import_discord.ButtonBuilder{static{__name(this,"ButtonKit")}#onClickHandler=null;#onEndHandler=null;#contextData=null;#collector=null;onClick(handler,data){if(this.data.style===import_discord.ButtonStyle.Link)throw new TypeError('Cannot setup "onClick" handler on link buttons.');if(!handler)throw new TypeError('Cannot setup "onClick" without a handler function parameter.');return this.#destroyCollector(),this.#onClickHandler=handler,data&&(this.#contextData=data),this.#setupInteractionCollector(),this}onEnd(handler){if(!handler)throw new TypeError('Cannot setup "onEnd" without a handler function parameter.');return this.#onEndHandler=handler,this}#setupInteractionCollector(){if(!this.#contextData||!this.#onClickHandler)return;let message=this.#contextData.message;if(!message)throw new TypeError('Cannot setup "onClick" handler without a message in the context data.');if("customId"in this.data&&!this.data.customId)throw new TypeError('Cannot setup "onClick" handler on a button without a custom id.');let data={time:864e5,autoReset:!0,...this.#contextData},collector=this.#collector=message.createMessageComponentCollector({filter:interaction=>interaction.customId===this.data.custom_id&&interaction.message.id===message.id,componentType:import_discord.ComponentType.Button,...data});this.#collector.on("collect",interaction=>{let handler=this.#onClickHandler;return handler?this.#collector?(data.autoReset&&this.#collector.resetTimer(),handler(interaction)):collector.stop("destroyed"):this.#destroyCollector()}),this.#collector.on("end",(_,reason)=>{this.#destroyCollector(),this.#onEndHandler?.(reason)})}dispose(){return this.#destroyCollector(),this.#onEndHandler?.("disposed"),this}#destroyCollector(){this.#collector?.stop("end"),this.#collector?.removeAllListeners(),this.#collector=null,this.#contextData=null,this.#onClickHandler=null}};0&&(module.exports={ButtonKit});
1
+ "use strict";var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __name=(target,value)=>__defProp(target,"name",{value,configurable:!0});var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var ButtonKit_exports={};__export(ButtonKit_exports,{ButtonKit:()=>ButtonKit});module.exports=__toCommonJS(ButtonKit_exports);var import_discord=require("discord.js");var ButtonKit=class extends import_discord.ButtonBuilder{static{__name(this,"ButtonKit")}#onClickHandler=null;#onEndHandler=null;#contextData=null;#collector=null;onClick(handler,data){if(this.data.style===import_discord.ButtonStyle.Link)throw new TypeError('Cannot setup "onClick" handler on link buttons.');if(!handler)throw new TypeError('Cannot setup "onClick" without a handler function parameter.');return this.#destroyCollector(),this.#onClickHandler=handler,data&&(this.#contextData=data),this.#setupInteractionCollector(),this}onEnd(handler){if(!handler)throw new TypeError('Cannot setup "onEnd" without a handler function parameter.');return this.#onEndHandler=handler,this}#setupInteractionCollector(){if(!this.#contextData||!this.#onClickHandler)return;let message=this.#contextData.message;if(!message)throw new TypeError('Cannot setup "onClick" handler without a message in the context data.');if("customId"in this.data&&!this.data.customId)throw new TypeError('Cannot setup "onClick" handler on a button without a custom id.');let data={time:864e5,autoReset:!0,...this.#contextData},collector=this.#collector=message.createMessageComponentCollector({filter:__name(interaction=>interaction.customId===this.data.custom_id&&interaction.message.id===message.id,"filter"),componentType:import_discord.ComponentType.Button,...data});this.#collector.on("collect",interaction=>{let handler=this.#onClickHandler;return handler?this.#collector?(data.autoReset&&this.#collector.resetTimer(),handler(interaction)):collector.stop("destroyed"):this.#destroyCollector()}),this.#collector.on("end",(_,reason)=>{this.#destroyCollector(),this.#onEndHandler?.(reason)})}dispose(){return this.#destroyCollector(),this.#onEndHandler?.("disposed"),this}#destroyCollector(){this.#collector?.stop("end"),this.#collector?.removeAllListeners(),this.#collector=null,this.#contextData=null,this.#onClickHandler=null}};0&&(module.exports={ButtonKit});
2
2
  //# sourceMappingURL=ButtonKit.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/ButtonKit.ts"],"sourcesContent":["import {\n type Message,\n type Awaitable,\n type ButtonInteraction,\n type InteractionCollector,\n type InteractionCollectorOptions,\n type APIButtonComponentWithCustomId,\n ButtonStyle,\n ButtonBuilder,\n ComponentType } from\n'discord.js';\n\n/**\n * The handler to run when a button is clicked. This handler is called with the interaction as the first argument.\n * If the first argument is null, it means that the interaction collector has been destroyed.\n */\nexport type CommandKitButtonBuilderInteractionCollectorDispatch = (\ninteraction: ButtonInteraction)\n=> Awaitable<void>;\n\nexport type CommandKitButtonBuilderOnEnd = (reason: string) => Awaitable<void>;\n\nexport type CommandKitButtonBuilderInteractionCollectorDispatchContextData = {\n /**\n * The message to listen for button interactions on.\n */\n message: Message;\n /**\n * The duration (in ms) that the collector should run for.\n */\n time?: number;\n /**\n * If the collector should automatically reset the timer when a button is clicked.\n */\n autoReset?: boolean;\n} & Omit<\n InteractionCollectorOptions<ButtonInteraction>,\n 'filter' | 'componentType'>;\n\n\nexport class ButtonKit extends ButtonBuilder {\n #onClickHandler: CommandKitButtonBuilderInteractionCollectorDispatch | null =\n null;\n #onEndHandler: CommandKitButtonBuilderOnEnd | null = null;\n #contextData: CommandKitButtonBuilderInteractionCollectorDispatchContextData | null =\n null;\n #collector: InteractionCollector<ButtonInteraction> | null = null;\n\n /**\n * Sets up an inline interaction collector for this button. This collector by default allows as many interactions as possible if it is actively used.\n * If unused, this expires after 24 hours or custom time if specified.\n * @param handler The handler to run when the button is clicked\n * @param data The context data to use for the interaction collector\n * @returns This button\n * @example\n * ```ts\n * const button = new ButtonKit()\n * .setLabel('Click me')\n * .setStyle(ButtonStyle.Primary)\n * .setCustomId('click_me');\n *\n * const row = new ActionRowBuilder().addComponents(button);\n *\n * const message = await channel.send({ content: 'Click the button', components: [row] });\n *\n * button.onClick(async (interaction) => {\n * await interaction.reply('You clicked me!');\n * }, { message });\n *\n * // Remove onClick handler and destroy the interaction collector\n * button.onClick(null);\n * ```\n */\n public onClick(\n handler: CommandKitButtonBuilderInteractionCollectorDispatch,\n data?: CommandKitButtonBuilderInteractionCollectorDispatchContextData)\n : this {\n if (this.data.style === ButtonStyle.Link) {\n throw new TypeError('Cannot setup \"onClick\" handler on link buttons.');\n }\n\n if (!handler) {\n throw new TypeError(\n 'Cannot setup \"onClick\" without a handler function parameter.'\n );\n }\n\n this.#destroyCollector();\n\n this.#onClickHandler = handler;\n if (data) this.#contextData = data;\n\n this.#setupInteractionCollector();\n\n return this;\n }\n\n public onEnd(handler: CommandKitButtonBuilderOnEnd): this {\n if (!handler) {\n throw new TypeError(\n 'Cannot setup \"onEnd\" without a handler function parameter.'\n );\n }\n\n this.#onEndHandler = handler;\n\n return this;\n }\n\n #setupInteractionCollector() {\n if (!this.#contextData || !this.#onClickHandler) return;\n\n const message = this.#contextData.message;\n\n if (!message) {\n throw new TypeError(\n 'Cannot setup \"onClick\" handler without a message in the context data.'\n );\n }\n\n if ('customId' in this.data && !this.data.customId) {\n throw new TypeError(\n 'Cannot setup \"onClick\" handler on a button without a custom id.'\n );\n }\n\n const data = {\n time: 86_400_000,\n autoReset: true,\n ...this.#contextData\n };\n\n const collector = this.#collector =\n message.createMessageComponentCollector({\n filter: (interaction) =>\n interaction.customId ===\n (<APIButtonComponentWithCustomId> this.data).custom_id &&\n interaction.message.id === message.id,\n componentType: ComponentType.Button,\n ...data\n });\n\n this.#collector.on('collect', (interaction) => {\n const handler = this.#onClickHandler;\n\n if (!handler) return this.#destroyCollector();\n\n if (!this.#collector) {\n return collector.stop('destroyed');\n }\n\n if (data.autoReset) {\n this.#collector.resetTimer();\n }\n\n return handler(interaction);\n });\n\n this.#collector.on('end', (_, reason) => {\n this.#destroyCollector();\n this.#onEndHandler?.(reason);\n });\n }\n\n public dispose() {\n this.#destroyCollector();\n this.#onEndHandler?.('disposed');\n return this;\n }\n\n #destroyCollector() {\n this.#collector?.stop('end');\n this.#collector?.removeAllListeners();\n this.#collector = null;\n this.#contextData = null;\n this.#onClickHandler = null;\n }\n}"],"mappings":"ouBAAA,8HAAA,mBAUA,sBA8BO,IAAM,UAAN,cAAwB,4BAAc,CAxC7C,MAwC6C,0BAC3C,gBACA,KACA,cAAqD,KACrD,aACA,KACA,WAA6D,KA2BtD,QACP,QACA,KACO,CACL,GAAI,KAAK,KAAK,QAAU,2BAAY,KAClC,MAAM,IAAI,UAAU,iDAAiD,EAGvE,GAAI,CAAC,QACH,MAAM,IAAI,UACR,8DACF,EAGF,YAAK,kBAAkB,EAEvB,KAAK,gBAAkB,QACnB,OAAM,KAAK,aAAe,MAE9B,KAAK,2BAA2B,EAEzB,IACT,CAEO,MAAM,QAA6C,CACxD,GAAI,CAAC,QACH,MAAM,IAAI,UACR,4DACF,EAGF,YAAK,cAAgB,QAEd,IACT,CAEA,4BAA6B,CAC3B,GAAI,CAAC,KAAK,cAAgB,CAAC,KAAK,gBAAiB,OAEjD,IAAM,QAAU,KAAK,aAAa,QAElC,GAAI,CAAC,QACH,MAAM,IAAI,UACR,uEACF,EAGF,GAAI,aAAc,KAAK,MAAQ,CAAC,KAAK,KAAK,SACxC,MAAM,IAAI,UACR,iEACF,EAGF,IAAM,KAAO,CACX,KAAM,MACN,UAAW,GACX,GAAG,KAAK,YACV,EAEM,UAAY,KAAK,WACvB,QAAQ,gCAAgC,CACtC,OAAS,aACT,YAAY,WACsB,KAAK,KAAM,WAC7C,YAAY,QAAQ,KAAO,QAAQ,GACnC,cAAe,6BAAc,OAC7B,GAAG,IACL,CAAC,EAED,KAAK,WAAW,GAAG,UAAY,aAAgB,CAC7C,IAAM,QAAU,KAAK,gBAErB,OAAK,QAEA,KAAK,YAIN,KAAK,WACP,KAAK,WAAW,WAAW,EAGtB,QAAQ,WAAW,GAPjB,UAAU,KAAK,WAAW,EAHd,KAAK,kBAAkB,CAW9C,CAAC,EAED,KAAK,WAAW,GAAG,MAAO,CAAC,EAAG,SAAW,CACvC,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,MAAM,CAC7B,CAAC,CACH,CAEO,SAAU,CACf,YAAK,kBAAkB,EACvB,KAAK,gBAAgB,UAAU,EACxB,IACT,CAEA,mBAAoB,CAClB,KAAK,YAAY,KAAK,KAAK,EAC3B,KAAK,YAAY,mBAAmB,EACpC,KAAK,WAAa,KAClB,KAAK,aAAe,KACpB,KAAK,gBAAkB,IACzB,CACF","names":[]}
1
+ {"version":3,"sources":["../../src/components/ButtonKit.ts"],"sourcesContent":["import {\n type Message,\n type Awaitable,\n type ButtonInteraction,\n type InteractionCollector,\n type InteractionCollectorOptions,\n type APIButtonComponentWithCustomId,\n ButtonStyle,\n ButtonBuilder,\n ComponentType } from\n'discord.js';\n\n/**\n * The handler to run when a button is clicked. This handler is called with the interaction as the first argument.\n * If the first argument is null, it means that the interaction collector has been destroyed.\n */\nexport type CommandKitButtonBuilderInteractionCollectorDispatch = (\ninteraction: ButtonInteraction)\n=> Awaitable<void>;\n\nexport type CommandKitButtonBuilderOnEnd = (reason: string) => Awaitable<void>;\n\nexport type CommandKitButtonBuilderInteractionCollectorDispatchContextData = {\n /**\n * The message to listen for button interactions on.\n */\n message: Message;\n /**\n * The duration (in ms) that the collector should run for.\n */\n time?: number;\n /**\n * If the collector should automatically reset the timer when a button is clicked.\n */\n autoReset?: boolean;\n} & Omit<\n InteractionCollectorOptions<ButtonInteraction>,\n 'filter' | 'componentType'>;\n\n\nexport class ButtonKit extends ButtonBuilder {\n #onClickHandler: CommandKitButtonBuilderInteractionCollectorDispatch | null =\n null;\n #onEndHandler: CommandKitButtonBuilderOnEnd | null = null;\n #contextData: CommandKitButtonBuilderInteractionCollectorDispatchContextData | null =\n null;\n #collector: InteractionCollector<ButtonInteraction> | null = null;\n\n /**\n * Sets up an inline interaction collector for this button. This collector by default allows as many interactions as possible if it is actively used.\n * If unused, this expires after 24 hours or custom time if specified.\n * @param handler The handler to run when the button is clicked\n * @param data The context data to use for the interaction collector\n * @returns This button\n * @example\n * ```ts\n * const button = new ButtonKit()\n * .setLabel('Click me')\n * .setStyle(ButtonStyle.Primary)\n * .setCustomId('click_me');\n *\n * const row = new ActionRowBuilder().addComponents(button);\n *\n * const message = await channel.send({ content: 'Click the button', components: [row] });\n *\n * button.onClick(async (interaction) => {\n * await interaction.reply('You clicked me!');\n * }, { message });\n *\n * // Remove onClick handler and destroy the interaction collector\n * button.onClick(null);\n * ```\n */\n public onClick(\n handler: CommandKitButtonBuilderInteractionCollectorDispatch,\n data?: CommandKitButtonBuilderInteractionCollectorDispatchContextData)\n : this {\n if (this.data.style === ButtonStyle.Link) {\n throw new TypeError('Cannot setup \"onClick\" handler on link buttons.');\n }\n\n if (!handler) {\n throw new TypeError(\n 'Cannot setup \"onClick\" without a handler function parameter.'\n );\n }\n\n this.#destroyCollector();\n\n this.#onClickHandler = handler;\n if (data) this.#contextData = data;\n\n this.#setupInteractionCollector();\n\n return this;\n }\n\n public onEnd(handler: CommandKitButtonBuilderOnEnd): this {\n if (!handler) {\n throw new TypeError(\n 'Cannot setup \"onEnd\" without a handler function parameter.'\n );\n }\n\n this.#onEndHandler = handler;\n\n return this;\n }\n\n #setupInteractionCollector() {\n if (!this.#contextData || !this.#onClickHandler) return;\n\n const message = this.#contextData.message;\n\n if (!message) {\n throw new TypeError(\n 'Cannot setup \"onClick\" handler without a message in the context data.'\n );\n }\n\n if ('customId' in this.data && !this.data.customId) {\n throw new TypeError(\n 'Cannot setup \"onClick\" handler on a button without a custom id.'\n );\n }\n\n const data = {\n time: 86_400_000,\n autoReset: true,\n ...this.#contextData\n };\n\n const collector = this.#collector =\n message.createMessageComponentCollector({\n filter: (interaction) =>\n interaction.customId ===\n (<APIButtonComponentWithCustomId> this.data).custom_id &&\n interaction.message.id === message.id,\n componentType: ComponentType.Button,\n ...data\n });\n\n this.#collector.on('collect', (interaction) => {\n const handler = this.#onClickHandler;\n\n if (!handler) return this.#destroyCollector();\n\n if (!this.#collector) {\n return collector.stop('destroyed');\n }\n\n if (data.autoReset) {\n this.#collector.resetTimer();\n }\n\n return handler(interaction);\n });\n\n this.#collector.on('end', (_, reason) => {\n this.#destroyCollector();\n this.#onEndHandler?.(reason);\n });\n }\n\n public dispose() {\n this.#destroyCollector();\n this.#onEndHandler?.('disposed');\n return this;\n }\n\n #destroyCollector() {\n this.#collector?.stop('end');\n this.#collector?.removeAllListeners();\n this.#collector = null;\n this.#contextData = null;\n this.#onClickHandler = null;\n }\n}"],"mappings":"ouBAAA,8HAAA,mBAUA,sBA8BO,IAAM,UAAN,cAAwB,4BAAc,CAxC7C,MAwC6C,0BAC3C,gBACA,KACA,cAAqD,KACrD,aACA,KACA,WAA6D,KA2BtD,QACP,QACA,KACO,CACL,GAAI,KAAK,KAAK,QAAU,2BAAY,KAClC,MAAM,IAAI,UAAU,iDAAiD,EAGvE,GAAI,CAAC,QACH,MAAM,IAAI,UACR,8DACF,EAGF,YAAK,kBAAkB,EAEvB,KAAK,gBAAkB,QACnB,OAAM,KAAK,aAAe,MAE9B,KAAK,2BAA2B,EAEzB,IACT,CAEO,MAAM,QAA6C,CACxD,GAAI,CAAC,QACH,MAAM,IAAI,UACR,4DACF,EAGF,YAAK,cAAgB,QAEd,IACT,CAEA,4BAA6B,CAC3B,GAAI,CAAC,KAAK,cAAgB,CAAC,KAAK,gBAAiB,OAEjD,IAAM,QAAU,KAAK,aAAa,QAElC,GAAI,CAAC,QACH,MAAM,IAAI,UACR,uEACF,EAGF,GAAI,aAAc,KAAK,MAAQ,CAAC,KAAK,KAAK,SACxC,MAAM,IAAI,UACR,iEACF,EAGF,IAAM,KAAO,CACX,KAAM,MACN,UAAW,GACX,GAAG,KAAK,YACV,EAEM,UAAY,KAAK,WACvB,QAAQ,gCAAgC,CACtC,OAAQ,OAAC,aACT,YAAY,WACsB,KAAK,KAAM,WAC7C,YAAY,QAAQ,KAAO,QAAQ,GAH3B,UAIR,cAAe,6BAAc,OAC7B,GAAG,IACL,CAAC,EAED,KAAK,WAAW,GAAG,UAAY,aAAgB,CAC7C,IAAM,QAAU,KAAK,gBAErB,OAAK,QAEA,KAAK,YAIN,KAAK,WACP,KAAK,WAAW,WAAW,EAGtB,QAAQ,WAAW,GAPjB,UAAU,KAAK,WAAW,EAHd,KAAK,kBAAkB,CAW9C,CAAC,EAED,KAAK,WAAW,GAAG,MAAO,CAAC,EAAG,SAAW,CACvC,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,MAAM,CAC7B,CAAC,CACH,CAEO,SAAU,CACf,YAAK,kBAAkB,EACvB,KAAK,gBAAgB,UAAU,EACxB,IACT,CAEA,mBAAoB,CAClB,KAAK,YAAY,KAAK,KAAK,EAC3B,KAAK,YAAY,mBAAmB,EACpC,KAAK,WAAa,KAClB,KAAK,aAAe,KACpB,KAAK,gBAAkB,IACzB,CACF","names":[]}
@@ -1,2 +1,2 @@
1
- import{ButtonKit}from"../chunk-4IWEG3WI.mjs";import"../chunk-7KD7ZCH6.mjs";export{ButtonKit};
1
+ import{ButtonKit}from"../chunk-WNEBLBID.mjs";import"../chunk-6TIBWNPX.mjs";export{ButtonKit};
2
2
  //# sourceMappingURL=ButtonKit.mjs.map
@@ -1,2 +1,2 @@
1
- "use strict";var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __name=(target,value)=>__defProp(target,"name",{value,configurable:!0});var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var components_exports={};__export(components_exports,{ButtonKit:()=>ButtonKit});module.exports=__toCommonJS(components_exports);var import_discord=require("discord.js");var ButtonKit=class extends import_discord.ButtonBuilder{static{__name(this,"ButtonKit")}#onClickHandler=null;#onEndHandler=null;#contextData=null;#collector=null;onClick(handler,data){if(this.data.style===import_discord.ButtonStyle.Link)throw new TypeError('Cannot setup "onClick" handler on link buttons.');if(!handler)throw new TypeError('Cannot setup "onClick" without a handler function parameter.');return this.#destroyCollector(),this.#onClickHandler=handler,data&&(this.#contextData=data),this.#setupInteractionCollector(),this}onEnd(handler){if(!handler)throw new TypeError('Cannot setup "onEnd" without a handler function parameter.');return this.#onEndHandler=handler,this}#setupInteractionCollector(){if(!this.#contextData||!this.#onClickHandler)return;let message=this.#contextData.message;if(!message)throw new TypeError('Cannot setup "onClick" handler without a message in the context data.');if("customId"in this.data&&!this.data.customId)throw new TypeError('Cannot setup "onClick" handler on a button without a custom id.');let data={time:864e5,autoReset:!0,...this.#contextData},collector=this.#collector=message.createMessageComponentCollector({filter:interaction=>interaction.customId===this.data.custom_id&&interaction.message.id===message.id,componentType:import_discord.ComponentType.Button,...data});this.#collector.on("collect",interaction=>{let handler=this.#onClickHandler;return handler?this.#collector?(data.autoReset&&this.#collector.resetTimer(),handler(interaction)):collector.stop("destroyed"):this.#destroyCollector()}),this.#collector.on("end",(_,reason)=>{this.#destroyCollector(),this.#onEndHandler?.(reason)})}dispose(){return this.#destroyCollector(),this.#onEndHandler?.("disposed"),this}#destroyCollector(){this.#collector?.stop("end"),this.#collector?.removeAllListeners(),this.#collector=null,this.#contextData=null,this.#onClickHandler=null}};0&&(module.exports={ButtonKit});
1
+ "use strict";var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __name=(target,value)=>__defProp(target,"name",{value,configurable:!0});var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var components_exports={};__export(components_exports,{ButtonKit:()=>ButtonKit});module.exports=__toCommonJS(components_exports);var import_discord=require("discord.js");var ButtonKit=class extends import_discord.ButtonBuilder{static{__name(this,"ButtonKit")}#onClickHandler=null;#onEndHandler=null;#contextData=null;#collector=null;onClick(handler,data){if(this.data.style===import_discord.ButtonStyle.Link)throw new TypeError('Cannot setup "onClick" handler on link buttons.');if(!handler)throw new TypeError('Cannot setup "onClick" without a handler function parameter.');return this.#destroyCollector(),this.#onClickHandler=handler,data&&(this.#contextData=data),this.#setupInteractionCollector(),this}onEnd(handler){if(!handler)throw new TypeError('Cannot setup "onEnd" without a handler function parameter.');return this.#onEndHandler=handler,this}#setupInteractionCollector(){if(!this.#contextData||!this.#onClickHandler)return;let message=this.#contextData.message;if(!message)throw new TypeError('Cannot setup "onClick" handler without a message in the context data.');if("customId"in this.data&&!this.data.customId)throw new TypeError('Cannot setup "onClick" handler on a button without a custom id.');let data={time:864e5,autoReset:!0,...this.#contextData},collector=this.#collector=message.createMessageComponentCollector({filter:__name(interaction=>interaction.customId===this.data.custom_id&&interaction.message.id===message.id,"filter"),componentType:import_discord.ComponentType.Button,...data});this.#collector.on("collect",interaction=>{let handler=this.#onClickHandler;return handler?this.#collector?(data.autoReset&&this.#collector.resetTimer(),handler(interaction)):collector.stop("destroyed"):this.#destroyCollector()}),this.#collector.on("end",(_,reason)=>{this.#destroyCollector(),this.#onEndHandler?.(reason)})}dispose(){return this.#destroyCollector(),this.#onEndHandler?.("disposed"),this}#destroyCollector(){this.#collector?.stop("end"),this.#collector?.removeAllListeners(),this.#collector=null,this.#contextData=null,this.#onClickHandler=null}};0&&(module.exports={ButtonKit});
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/index.ts","../../src/components/ButtonKit.ts"],"sourcesContent":["export * from './ButtonKit';","import {\n type Message,\n type Awaitable,\n type ButtonInteraction,\n type InteractionCollector,\n type InteractionCollectorOptions,\n type APIButtonComponentWithCustomId,\n ButtonStyle,\n ButtonBuilder,\n ComponentType } from\n'discord.js';\n\n/**\n * The handler to run when a button is clicked. This handler is called with the interaction as the first argument.\n * If the first argument is null, it means that the interaction collector has been destroyed.\n */\nexport type CommandKitButtonBuilderInteractionCollectorDispatch = (\ninteraction: ButtonInteraction)\n=> Awaitable<void>;\n\nexport type CommandKitButtonBuilderOnEnd = (reason: string) => Awaitable<void>;\n\nexport type CommandKitButtonBuilderInteractionCollectorDispatchContextData = {\n /**\n * The message to listen for button interactions on.\n */\n message: Message;\n /**\n * The duration (in ms) that the collector should run for.\n */\n time?: number;\n /**\n * If the collector should automatically reset the timer when a button is clicked.\n */\n autoReset?: boolean;\n} & Omit<\n InteractionCollectorOptions<ButtonInteraction>,\n 'filter' | 'componentType'>;\n\n\nexport class ButtonKit extends ButtonBuilder {\n #onClickHandler: CommandKitButtonBuilderInteractionCollectorDispatch | null =\n null;\n #onEndHandler: CommandKitButtonBuilderOnEnd | null = null;\n #contextData: CommandKitButtonBuilderInteractionCollectorDispatchContextData | null =\n null;\n #collector: InteractionCollector<ButtonInteraction> | null = null;\n\n /**\n * Sets up an inline interaction collector for this button. This collector by default allows as many interactions as possible if it is actively used.\n * If unused, this expires after 24 hours or custom time if specified.\n * @param handler The handler to run when the button is clicked\n * @param data The context data to use for the interaction collector\n * @returns This button\n * @example\n * ```ts\n * const button = new ButtonKit()\n * .setLabel('Click me')\n * .setStyle(ButtonStyle.Primary)\n * .setCustomId('click_me');\n *\n * const row = new ActionRowBuilder().addComponents(button);\n *\n * const message = await channel.send({ content: 'Click the button', components: [row] });\n *\n * button.onClick(async (interaction) => {\n * await interaction.reply('You clicked me!');\n * }, { message });\n *\n * // Remove onClick handler and destroy the interaction collector\n * button.onClick(null);\n * ```\n */\n public onClick(\n handler: CommandKitButtonBuilderInteractionCollectorDispatch,\n data?: CommandKitButtonBuilderInteractionCollectorDispatchContextData)\n : this {\n if (this.data.style === ButtonStyle.Link) {\n throw new TypeError('Cannot setup \"onClick\" handler on link buttons.');\n }\n\n if (!handler) {\n throw new TypeError(\n 'Cannot setup \"onClick\" without a handler function parameter.'\n );\n }\n\n this.#destroyCollector();\n\n this.#onClickHandler = handler;\n if (data) this.#contextData = data;\n\n this.#setupInteractionCollector();\n\n return this;\n }\n\n public onEnd(handler: CommandKitButtonBuilderOnEnd): this {\n if (!handler) {\n throw new TypeError(\n 'Cannot setup \"onEnd\" without a handler function parameter.'\n );\n }\n\n this.#onEndHandler = handler;\n\n return this;\n }\n\n #setupInteractionCollector() {\n if (!this.#contextData || !this.#onClickHandler) return;\n\n const message = this.#contextData.message;\n\n if (!message) {\n throw new TypeError(\n 'Cannot setup \"onClick\" handler without a message in the context data.'\n );\n }\n\n if ('customId' in this.data && !this.data.customId) {\n throw new TypeError(\n 'Cannot setup \"onClick\" handler on a button without a custom id.'\n );\n }\n\n const data = {\n time: 86_400_000,\n autoReset: true,\n ...this.#contextData\n };\n\n const collector = this.#collector =\n message.createMessageComponentCollector({\n filter: (interaction) =>\n interaction.customId ===\n (<APIButtonComponentWithCustomId> this.data).custom_id &&\n interaction.message.id === message.id,\n componentType: ComponentType.Button,\n ...data\n });\n\n this.#collector.on('collect', (interaction) => {\n const handler = this.#onClickHandler;\n\n if (!handler) return this.#destroyCollector();\n\n if (!this.#collector) {\n return collector.stop('destroyed');\n }\n\n if (data.autoReset) {\n this.#collector.resetTimer();\n }\n\n return handler(interaction);\n });\n\n this.#collector.on('end', (_, reason) => {\n this.#destroyCollector();\n this.#onEndHandler?.(reason);\n });\n }\n\n public dispose() {\n this.#destroyCollector();\n this.#onEndHandler?.('disposed');\n return this;\n }\n\n #destroyCollector() {\n this.#collector?.stop('end');\n this.#collector?.removeAllListeners();\n this.#collector = null;\n this.#contextData = null;\n this.#onClickHandler = null;\n }\n}"],"mappings":"ouBAAA,iICAA,mBAUA,sBA8BO,IAAM,UAAN,cAAwB,4BAAc,CAxC7C,MAwC6C,0BAC3C,gBACA,KACA,cAAqD,KACrD,aACA,KACA,WAA6D,KA2BtD,QACP,QACA,KACO,CACL,GAAI,KAAK,KAAK,QAAU,2BAAY,KAClC,MAAM,IAAI,UAAU,iDAAiD,EAGvE,GAAI,CAAC,QACH,MAAM,IAAI,UACR,8DACF,EAGF,YAAK,kBAAkB,EAEvB,KAAK,gBAAkB,QACnB,OAAM,KAAK,aAAe,MAE9B,KAAK,2BAA2B,EAEzB,IACT,CAEO,MAAM,QAA6C,CACxD,GAAI,CAAC,QACH,MAAM,IAAI,UACR,4DACF,EAGF,YAAK,cAAgB,QAEd,IACT,CAEA,4BAA6B,CAC3B,GAAI,CAAC,KAAK,cAAgB,CAAC,KAAK,gBAAiB,OAEjD,IAAM,QAAU,KAAK,aAAa,QAElC,GAAI,CAAC,QACH,MAAM,IAAI,UACR,uEACF,EAGF,GAAI,aAAc,KAAK,MAAQ,CAAC,KAAK,KAAK,SACxC,MAAM,IAAI,UACR,iEACF,EAGF,IAAM,KAAO,CACX,KAAM,MACN,UAAW,GACX,GAAG,KAAK,YACV,EAEM,UAAY,KAAK,WACvB,QAAQ,gCAAgC,CACtC,OAAS,aACT,YAAY,WACsB,KAAK,KAAM,WAC7C,YAAY,QAAQ,KAAO,QAAQ,GACnC,cAAe,6BAAc,OAC7B,GAAG,IACL,CAAC,EAED,KAAK,WAAW,GAAG,UAAY,aAAgB,CAC7C,IAAM,QAAU,KAAK,gBAErB,OAAK,QAEA,KAAK,YAIN,KAAK,WACP,KAAK,WAAW,WAAW,EAGtB,QAAQ,WAAW,GAPjB,UAAU,KAAK,WAAW,EAHd,KAAK,kBAAkB,CAW9C,CAAC,EAED,KAAK,WAAW,GAAG,MAAO,CAAC,EAAG,SAAW,CACvC,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,MAAM,CAC7B,CAAC,CACH,CAEO,SAAU,CACf,YAAK,kBAAkB,EACvB,KAAK,gBAAgB,UAAU,EACxB,IACT,CAEA,mBAAoB,CAClB,KAAK,YAAY,KAAK,KAAK,EAC3B,KAAK,YAAY,mBAAmB,EACpC,KAAK,WAAa,KAClB,KAAK,aAAe,KACpB,KAAK,gBAAkB,IACzB,CACF","names":[]}
1
+ {"version":3,"sources":["../../src/components/index.ts","../../src/components/ButtonKit.ts"],"sourcesContent":["export * from './ButtonKit';","import {\n type Message,\n type Awaitable,\n type ButtonInteraction,\n type InteractionCollector,\n type InteractionCollectorOptions,\n type APIButtonComponentWithCustomId,\n ButtonStyle,\n ButtonBuilder,\n ComponentType } from\n'discord.js';\n\n/**\n * The handler to run when a button is clicked. This handler is called with the interaction as the first argument.\n * If the first argument is null, it means that the interaction collector has been destroyed.\n */\nexport type CommandKitButtonBuilderInteractionCollectorDispatch = (\ninteraction: ButtonInteraction)\n=> Awaitable<void>;\n\nexport type CommandKitButtonBuilderOnEnd = (reason: string) => Awaitable<void>;\n\nexport type CommandKitButtonBuilderInteractionCollectorDispatchContextData = {\n /**\n * The message to listen for button interactions on.\n */\n message: Message;\n /**\n * The duration (in ms) that the collector should run for.\n */\n time?: number;\n /**\n * If the collector should automatically reset the timer when a button is clicked.\n */\n autoReset?: boolean;\n} & Omit<\n InteractionCollectorOptions<ButtonInteraction>,\n 'filter' | 'componentType'>;\n\n\nexport class ButtonKit extends ButtonBuilder {\n #onClickHandler: CommandKitButtonBuilderInteractionCollectorDispatch | null =\n null;\n #onEndHandler: CommandKitButtonBuilderOnEnd | null = null;\n #contextData: CommandKitButtonBuilderInteractionCollectorDispatchContextData | null =\n null;\n #collector: InteractionCollector<ButtonInteraction> | null = null;\n\n /**\n * Sets up an inline interaction collector for this button. This collector by default allows as many interactions as possible if it is actively used.\n * If unused, this expires after 24 hours or custom time if specified.\n * @param handler The handler to run when the button is clicked\n * @param data The context data to use for the interaction collector\n * @returns This button\n * @example\n * ```ts\n * const button = new ButtonKit()\n * .setLabel('Click me')\n * .setStyle(ButtonStyle.Primary)\n * .setCustomId('click_me');\n *\n * const row = new ActionRowBuilder().addComponents(button);\n *\n * const message = await channel.send({ content: 'Click the button', components: [row] });\n *\n * button.onClick(async (interaction) => {\n * await interaction.reply('You clicked me!');\n * }, { message });\n *\n * // Remove onClick handler and destroy the interaction collector\n * button.onClick(null);\n * ```\n */\n public onClick(\n handler: CommandKitButtonBuilderInteractionCollectorDispatch,\n data?: CommandKitButtonBuilderInteractionCollectorDispatchContextData)\n : this {\n if (this.data.style === ButtonStyle.Link) {\n throw new TypeError('Cannot setup \"onClick\" handler on link buttons.');\n }\n\n if (!handler) {\n throw new TypeError(\n 'Cannot setup \"onClick\" without a handler function parameter.'\n );\n }\n\n this.#destroyCollector();\n\n this.#onClickHandler = handler;\n if (data) this.#contextData = data;\n\n this.#setupInteractionCollector();\n\n return this;\n }\n\n public onEnd(handler: CommandKitButtonBuilderOnEnd): this {\n if (!handler) {\n throw new TypeError(\n 'Cannot setup \"onEnd\" without a handler function parameter.'\n );\n }\n\n this.#onEndHandler = handler;\n\n return this;\n }\n\n #setupInteractionCollector() {\n if (!this.#contextData || !this.#onClickHandler) return;\n\n const message = this.#contextData.message;\n\n if (!message) {\n throw new TypeError(\n 'Cannot setup \"onClick\" handler without a message in the context data.'\n );\n }\n\n if ('customId' in this.data && !this.data.customId) {\n throw new TypeError(\n 'Cannot setup \"onClick\" handler on a button without a custom id.'\n );\n }\n\n const data = {\n time: 86_400_000,\n autoReset: true,\n ...this.#contextData\n };\n\n const collector = this.#collector =\n message.createMessageComponentCollector({\n filter: (interaction) =>\n interaction.customId ===\n (<APIButtonComponentWithCustomId> this.data).custom_id &&\n interaction.message.id === message.id,\n componentType: ComponentType.Button,\n ...data\n });\n\n this.#collector.on('collect', (interaction) => {\n const handler = this.#onClickHandler;\n\n if (!handler) return this.#destroyCollector();\n\n if (!this.#collector) {\n return collector.stop('destroyed');\n }\n\n if (data.autoReset) {\n this.#collector.resetTimer();\n }\n\n return handler(interaction);\n });\n\n this.#collector.on('end', (_, reason) => {\n this.#destroyCollector();\n this.#onEndHandler?.(reason);\n });\n }\n\n public dispose() {\n this.#destroyCollector();\n this.#onEndHandler?.('disposed');\n return this;\n }\n\n #destroyCollector() {\n this.#collector?.stop('end');\n this.#collector?.removeAllListeners();\n this.#collector = null;\n this.#contextData = null;\n this.#onClickHandler = null;\n }\n}"],"mappings":"ouBAAA,iICAA,mBAUA,sBA8BO,IAAM,UAAN,cAAwB,4BAAc,CAxC7C,MAwC6C,0BAC3C,gBACA,KACA,cAAqD,KACrD,aACA,KACA,WAA6D,KA2BtD,QACP,QACA,KACO,CACL,GAAI,KAAK,KAAK,QAAU,2BAAY,KAClC,MAAM,IAAI,UAAU,iDAAiD,EAGvE,GAAI,CAAC,QACH,MAAM,IAAI,UACR,8DACF,EAGF,YAAK,kBAAkB,EAEvB,KAAK,gBAAkB,QACnB,OAAM,KAAK,aAAe,MAE9B,KAAK,2BAA2B,EAEzB,IACT,CAEO,MAAM,QAA6C,CACxD,GAAI,CAAC,QACH,MAAM,IAAI,UACR,4DACF,EAGF,YAAK,cAAgB,QAEd,IACT,CAEA,4BAA6B,CAC3B,GAAI,CAAC,KAAK,cAAgB,CAAC,KAAK,gBAAiB,OAEjD,IAAM,QAAU,KAAK,aAAa,QAElC,GAAI,CAAC,QACH,MAAM,IAAI,UACR,uEACF,EAGF,GAAI,aAAc,KAAK,MAAQ,CAAC,KAAK,KAAK,SACxC,MAAM,IAAI,UACR,iEACF,EAGF,IAAM,KAAO,CACX,KAAM,MACN,UAAW,GACX,GAAG,KAAK,YACV,EAEM,UAAY,KAAK,WACvB,QAAQ,gCAAgC,CACtC,OAAQ,OAAC,aACT,YAAY,WACsB,KAAK,KAAM,WAC7C,YAAY,QAAQ,KAAO,QAAQ,GAH3B,UAIR,cAAe,6BAAc,OAC7B,GAAG,IACL,CAAC,EAED,KAAK,WAAW,GAAG,UAAY,aAAgB,CAC7C,IAAM,QAAU,KAAK,gBAErB,OAAK,QAEA,KAAK,YAIN,KAAK,WACP,KAAK,WAAW,WAAW,EAGtB,QAAQ,WAAW,GAPjB,UAAU,KAAK,WAAW,EAHd,KAAK,kBAAkB,CAW9C,CAAC,EAED,KAAK,WAAW,GAAG,MAAO,CAAC,EAAG,SAAW,CACvC,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,MAAM,CAC7B,CAAC,CACH,CAEO,SAAU,CACf,YAAK,kBAAkB,EACvB,KAAK,gBAAgB,UAAU,EACxB,IACT,CAEA,mBAAoB,CAClB,KAAK,YAAY,KAAK,KAAK,EAC3B,KAAK,YAAY,mBAAmB,EACpC,KAAK,WAAa,KAClB,KAAK,aAAe,KACpB,KAAK,gBAAkB,IACzB,CACF","names":[]}
@@ -1,2 +1,2 @@
1
- import"../chunk-M5FMJETI.mjs";import{ButtonKit}from"../chunk-4IWEG3WI.mjs";import"../chunk-7KD7ZCH6.mjs";export{ButtonKit};
1
+ import"../chunk-M5FMJETI.mjs";import{ButtonKit}from"../chunk-WNEBLBID.mjs";import"../chunk-6TIBWNPX.mjs";export{ButtonKit};
2
2
  //# sourceMappingURL=index.mjs.map
package/dist/config.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{defineConfig,getConfig}from"./chunk-GS3Q7VW7.mjs";import"./chunk-7KD7ZCH6.mjs";export{defineConfig,getConfig};
1
+ import{defineConfig,getConfig}from"./chunk-6W2KY7FK.mjs";import"./chunk-6TIBWNPX.mjs";export{defineConfig,getConfig};
2
2
  //# sourceMappingURL=config.mjs.map
@@ -0,0 +1,7 @@
1
+ export { G as GenericFunction, d as dmOnly, g as getContext, a as guildOnly, m as makeContextAwareFunction, u as useEnvironment } from '../async-context-C45rxdEH.mjs';
2
+ import '../CommandKit-oiAWcISu.mjs';
3
+ import '../handlers/validation-handler/ValidationHandler.mjs';
4
+ import '../handlers/validation-handler/typings.mjs';
5
+ import 'discord.js';
6
+ import 'node:events';
7
+ import '../cache/CacheProvider.mjs';
@@ -0,0 +1,7 @@
1
+ export { G as GenericFunction, d as dmOnly, g as getContext, a as guildOnly, m as makeContextAwareFunction, u as useEnvironment } from '../async-context-B85N7tuZ.js';
2
+ import '../CommandKit-DW5Fy2uM.js';
3
+ import '../handlers/validation-handler/ValidationHandler.js';
4
+ import '../handlers/validation-handler/typings.js';
5
+ import 'discord.js';
6
+ import 'node:events';
7
+ import '../cache/CacheProvider.js';
@@ -0,0 +1,2 @@
1
+ "use strict";var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __name=(target,value)=>__defProp(target,"name",{value,configurable:!0});var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var async_context_exports={};__export(async_context_exports,{dmOnly:()=>dmOnly,getContext:()=>getContext,guildOnly:()=>guildOnly,makeContextAwareFunction:()=>makeContextAwareFunction,useEnvironment:()=>useEnvironment});module.exports=__toCommonJS(async_context_exports);var import_node_async_hooks=require("async_hooks");var CommandKitErrorCodes={GuildOnlyException:Symbol("kGuildOnlyException"),DMOnlyException:Symbol("kDMOnlyException"),CacheHit:Symbol("kCacheHit")};function isCommandKitError(error){if(!(error instanceof Error))return!1;let code=Reflect.get(error,"code");for(let key in CommandKitErrorCodes)if(CommandKitErrorCodes[key]===code)return!0;return!1}__name(isCommandKitError,"isCommandKitError");var context=new import_node_async_hooks.AsyncLocalStorage;function makeContextAwareFunction(env,fn,finalizer){return __name((...args)=>context.run(env,async()=>{try{let result=await fn(...args);return env.isCapturingResult()&&result!=null&&env.setResult(result),result}catch(e){if(isCommandKitError(e)){let code=Reflect.get(e,"code"),interaction=env.variables.get("interaction");if(!interaction)return;switch(code){case CommandKitErrorCodes.CacheHit:{let data=Reflect.get(e,"data");env.variables.set("cacheHit",!0),interaction.isCommand()&&(interaction.deferred?await interaction.editReply(data):interaction.isRepliable()&&await interaction.reply(data));return}case CommandKitErrorCodes.GuildOnlyException:{interaction.isRepliable()&&await interaction.reply({content:"This command is only available in guilds.",ephemeral:!0});return}case CommandKitErrorCodes.DMOnlyException:{interaction.isRepliable()&&await interaction.reply({content:"This command is only available in DMs.",ephemeral:!0});return}}return}env.setExecutionError(e)}finally{if(typeof finalizer=="function")try{await finalizer(...args)}catch{}}}),"_fn")}__name(makeContextAwareFunction,"makeContextAwareFunction");function getContext(){return context.getStore()}__name(getContext,"getContext");function useEnvironment(){let ctx=context.getStore();if(!ctx)throw new Error("No commandkit environment found. Please make sure you are inside commandkit handler.");return ctx}__name(useEnvironment,"useEnvironment");function guildOnly(){let interaction=useEnvironment().variables.get("interaction");if(!interaction)throw new Error("No interaction found in environment.");if(!interaction.guild){let error=new Error("This command is only available in guilds.");throw Reflect.set(error,"code",CommandKitErrorCodes.GuildOnlyException),error}}__name(guildOnly,"guildOnly");function dmOnly(){let interaction=useEnvironment().variables.get("interaction");if(!interaction)throw new Error("No interaction found in environment.");if(interaction.guild){let error=new Error("This command is only available in DMs.");throw Reflect.set(error,"code",CommandKitErrorCodes.DMOnlyException),error}}__name(dmOnly,"dmOnly");0&&(module.exports={dmOnly,getContext,guildOnly,makeContextAwareFunction,useEnvironment});
2
+ //# sourceMappingURL=async-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/context/async-context.ts","../../src/utils/error-codes.ts"],"sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport { CommandKitEnvironment } from './environment';\nimport { CommandKitErrorCodes, isCommandKitError } from '../utils/error-codes';\nimport { Interaction } from 'discord.js';\nimport { warnUnstable } from '../utils/warn-unstable';\n\nconst context = new AsyncLocalStorage<CommandKitEnvironment>();\n\nexport type GenericFunction<A extends any[] = any[]> = (...args: A) => any;\n\n/**\n * Returns a context-aware version of the given function.\n * @param env - The commandkit environment data.\n * @param fn - The target function.\n * @param finalizer - An optional finalizer function to run after the target function. This function will be context-aware.\n * @internal\n */\nexport function makeContextAwareFunction<\n R extends GenericFunction,\n F extends GenericFunction>(\nenv: CommandKitEnvironment, fn: R, finalizer?: F): R {\n const _fn = (...args: any[]) => {\n return context.run(env, async () => {\n try {\n // execute the target function\n const result = await fn(...args);\n\n if (env.isCapturingResult() && result != null) {\n env.setResult(result);\n }\n\n return result;\n } catch (e) {\n // set the error in the environment data\n if (isCommandKitError(e)) {\n const code = Reflect.get(e, 'code');\n const interaction = env.variables.get('interaction') as Interaction;\n if (!interaction) return;\n\n switch (code) {\n case CommandKitErrorCodes.CacheHit:{\n const data = Reflect.get(e, 'data');\n env.variables.set('cacheHit', true);\n\n if (interaction.isCommand()) {\n if (interaction.deferred) {\n await interaction.editReply(data);\n } else if (interaction.isRepliable()) {\n await interaction.reply(data);\n }\n }\n\n return;\n }\n case CommandKitErrorCodes.GuildOnlyException:{\n if (interaction.isRepliable()) {\n await interaction.reply({\n content: 'This command is only available in guilds.',\n ephemeral: true\n });\n }\n return;\n }\n case CommandKitErrorCodes.DMOnlyException:{\n if (interaction.isRepliable()) {\n await interaction.reply({\n content: 'This command is only available in DMs.',\n ephemeral: true\n });\n }\n return;\n }\n }\n\n return;\n }\n\n env.setExecutionError(e as Error);\n } finally {\n if (typeof finalizer === 'function') {\n // execute the finalizer function\n try {\n await finalizer(...args);\n } catch {\n\n // no-op\n }}\n }\n });\n };\n\n return _fn as R;\n}\n\n/**\n * Get the current commandkit context.\n * @internal\n */\nexport function getContext(): CommandKitEnvironment | void {\n const ctx = context.getStore();\n return ctx;\n}\n\n/**\n * Use current commandkit context. Throws an error if no context is found.\n */\nexport function useEnvironment(): CommandKitEnvironment {\n const ctx = context.getStore();\n if (!ctx) {\n throw new Error(\n 'No commandkit environment found. Please make sure you are inside commandkit handler.'\n );\n }\n\n return ctx;\n}\n\n/**\n * Ensures the command is only available in guilds.\n * Note: do not wrap this function in a try/catch block.\n */\nexport function guildOnly() {\n const env = useEnvironment();\n const interaction: Interaction = env.variables.get('interaction');\n\n if (!interaction) {\n throw new Error('No interaction found in environment.');\n }\n\n if (!interaction.guild) {\n const error = new Error('This command is only available in guilds.');\n Reflect.set(error, 'code', CommandKitErrorCodes.GuildOnlyException);\n\n throw error;\n }\n}\n\n/**\n * Ensures the command is only available in DMs.\n * Note: do not wrap this function in a try/catch block.\n */\nexport function dmOnly() {\n const env = useEnvironment();\n const interaction: Interaction = env.variables.get('interaction');\n\n if (!interaction) {\n throw new Error('No interaction found in environment.');\n }\n\n if (interaction.guild) {\n const error = new Error('This command is only available in DMs.');\n Reflect.set(error, 'code', CommandKitErrorCodes.DMOnlyException);\n\n throw error;\n }\n}","export const CommandKitErrorCodes = {\n GuildOnlyException: Symbol('kGuildOnlyException'),\n DMOnlyException: Symbol('kDMOnlyException'),\n CacheHit: Symbol('kCacheHit')\n} as const;\n\nexport function isCommandKitError(\nerror: unknown)\n: error is Error & {code: symbol;} {\n if (!(error instanceof Error)) return false;\n const code = Reflect.get(error, 'code');\n\n for (const key in CommandKitErrorCodes) {\n if (CommandKitErrorCodes[key as keyof typeof CommandKitErrorCodes] === code)\n return true;\n }\n\n return false;\n}"],"mappings":"ouBAAA,8QAAA,4BAAkC,uBCA3B,IAAM,qBAAuB,CAClC,mBAAoB,OAAO,qBAAqB,EAChD,gBAAiB,OAAO,kBAAkB,EAC1C,SAAU,OAAO,WAAW,CAC9B,EAEO,SAAS,kBAChB,MACmC,CACjC,GAAI,EAAE,iBAAiB,OAAQ,MAAO,GACtC,IAAM,KAAO,QAAQ,IAAI,MAAO,MAAM,EAEtC,QAAW,OAAO,qBAChB,GAAI,qBAAqB,GAAwC,IAAM,KACvE,MAAO,GAGT,MAAO,EACT,CAZgB,8CDAhB,IAAM,QAAU,IAAI,0CAWb,SAAS,yBAGhB,IAA4B,GAAO,UAAkB,CAuEnD,OAtEY,WAAI,OACP,QAAQ,IAAI,IAAK,SAAY,CAClC,GAAI,CAEF,IAAM,OAAS,MAAM,GAAG,GAAG,IAAI,EAE/B,OAAI,IAAI,kBAAkB,GAAK,QAAU,MACvC,IAAI,UAAU,MAAM,EAGf,MACT,OAAS,EAAG,CAEV,GAAI,kBAAkB,CAAC,EAAG,CACxB,IAAM,KAAO,QAAQ,IAAI,EAAG,MAAM,EAC5B,YAAc,IAAI,UAAU,IAAI,aAAa,EACnD,GAAI,CAAC,YAAa,OAElB,OAAQ,KAAM,CACZ,KAAK,qBAAqB,SAAS,CAC/B,IAAM,KAAO,QAAQ,IAAI,EAAG,MAAM,EAClC,IAAI,UAAU,IAAI,WAAY,EAAI,EAE9B,YAAY,UAAU,IACpB,YAAY,SACd,MAAM,YAAY,UAAU,IAAI,EACvB,YAAY,YAAY,GACjC,MAAM,YAAY,MAAM,IAAI,GAIhC,MACF,CACF,KAAK,qBAAqB,mBAAmB,CACrC,YAAY,YAAY,GAC1B,MAAM,YAAY,MAAM,CACtB,QAAS,4CACT,UAAW,EACb,CAAC,EAEH,MACF,CACF,KAAK,qBAAqB,gBAAgB,CAClC,YAAY,YAAY,GAC1B,MAAM,YAAY,MAAM,CACtB,QAAS,yCACT,UAAW,EACb,CAAC,EAEH,MACF,CACJ,CAEA,MACF,CAEA,IAAI,kBAAkB,CAAU,CAClC,QAAE,CACA,GAAI,OAAO,WAAc,WAEvB,GAAI,CACF,MAAM,UAAU,GAAG,IAAI,CACzB,MAAQ,CAGR,CACJ,CACF,CAAC,EAnES,MAuEd,CA3EgB,4DAiFT,SAAS,YAA2C,CAEzD,OADY,QAAQ,SAAS,CAE/B,CAHgB,gCAQT,SAAS,gBAAwC,CACtD,IAAM,IAAM,QAAQ,SAAS,EAC7B,GAAI,CAAC,IACH,MAAM,IAAI,MACR,sFACF,EAGF,OAAO,GACT,CATgB,wCAeT,SAAS,WAAY,CAE1B,IAAM,YADM,eAAe,EACU,UAAU,IAAI,aAAa,EAEhE,GAAI,CAAC,YACH,MAAM,IAAI,MAAM,sCAAsC,EAGxD,GAAI,CAAC,YAAY,MAAO,CACtB,IAAM,MAAQ,IAAI,MAAM,2CAA2C,EACnE,cAAQ,IAAI,MAAO,OAAQ,qBAAqB,kBAAkB,EAE5D,KACR,CACF,CAdgB,8BAoBT,SAAS,QAAS,CAEvB,IAAM,YADM,eAAe,EACU,UAAU,IAAI,aAAa,EAEhE,GAAI,CAAC,YACH,MAAM,IAAI,MAAM,sCAAsC,EAGxD,GAAI,YAAY,MAAO,CACrB,IAAM,MAAQ,IAAI,MAAM,wCAAwC,EAChE,cAAQ,IAAI,MAAO,OAAQ,qBAAqB,eAAe,EAEzD,KACR,CACF,CAdgB","names":[]}
@@ -0,0 +1,2 @@
1
+ import{dmOnly,getContext,guildOnly,makeContextAwareFunction,useEnvironment}from"../chunk-UOPZOWKS.mjs";import"../chunk-4BV475NY.mjs";import"../chunk-6TIBWNPX.mjs";export{dmOnly,getContext,guildOnly,makeContextAwareFunction,useEnvironment};
2
+ //# sourceMappingURL=async-context.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,7 @@
1
+ import '../CommandKit-oiAWcISu.mjs';
2
+ export { b as CommandKitEnvironment, C as CommandKitEnvironmentInternalData, c as CommandKitEnvironmentType, e as after, f as cancelAfter } from '../async-context-C45rxdEH.mjs';
3
+ import '../handlers/validation-handler/ValidationHandler.mjs';
4
+ import '../handlers/validation-handler/typings.mjs';
5
+ import 'discord.js';
6
+ import 'node:events';
7
+ import '../cache/CacheProvider.mjs';
@@ -0,0 +1,7 @@
1
+ import '../CommandKit-DW5Fy2uM.js';
2
+ export { b as CommandKitEnvironment, C as CommandKitEnvironmentInternalData, c as CommandKitEnvironmentType, e as after, f as cancelAfter } from '../async-context-B85N7tuZ.js';
3
+ import '../handlers/validation-handler/ValidationHandler.js';
4
+ import '../handlers/validation-handler/typings.js';
5
+ import 'discord.js';
6
+ import 'node:events';
7
+ import '../cache/CacheProvider.js';
@@ -0,0 +1,2 @@
1
+ "use strict";var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __hasOwnProp=Object.prototype.hasOwnProperty;var __name=(target,value)=>__defProp(target,"name",{value,configurable:!0});var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toCommonJS=mod=>__copyProps(__defProp({},"__esModule",{value:!0}),mod);var environment_exports={};__export(environment_exports,{CommandKitEnvironment:()=>CommandKitEnvironment,CommandKitEnvironmentType:()=>CommandKitEnvironmentType,after:()=>after,cancelAfter:()=>cancelAfter});module.exports=__toCommonJS(environment_exports);var import_node_crypto=require("crypto");var import_node_async_hooks=require("async_hooks");var CommandKitErrorCodes={GuildOnlyException:Symbol("kGuildOnlyException"),DMOnlyException:Symbol("kDMOnlyException"),CacheHit:Symbol("kCacheHit")};var context=new import_node_async_hooks.AsyncLocalStorage;function getContext(){return context.getStore()}__name(getContext,"getContext");var CommandKitEnvironment=class{constructor(commandkit){this.commandkit=commandkit}static{__name(this,"CommandKitEnvironment")}#data={executionError:null,type:null,variables:new Map,deferredFunctions:new Map,marker:"",markStart:0,markEnd:0,captureResult:!1,result:null};captureResult(){this.#data.captureResult=!0}isCapturingResult(){return this.#data.captureResult}setResult(result){this.#data.result=result}getResult(){return this.#data.result}getExecutionError(){return this.#data.executionError}setExecutionError(error){if(this.#data.executionError)throw new Error("Execution error already set.");this.#data.executionError=error}getType(){let type=this.#data.type;if(!type)throw new Error("Environment type not set.");return type}setType(type){this.#data.type=type}get variables(){return this.#data.variables}registerDeferredFunction(fn){let id=(0,import_node_crypto.randomUUID)();return this.#data.deferredFunctions.set(id,fn),id}clearDeferredFunction(id){this.#data.deferredFunctions.delete(id)}async runDeferredFunctions(){for(let[id,fn]of this.#data.deferredFunctions)try{await fn(this)}catch(e){this.commandkit.emit("unhandledDeferredFunctionRejection",e)}finally{this.clearDeferredFunction(id)}}clearAllDeferredFunctions(){this.#data.deferredFunctions.clear()}markStart(marker){this.#data.marker=marker,this.#data.markStart=performance.now()}markEnd(){this.#data.markEnd||(this.#data.markEnd=performance.now())}getMarker(){return this.#data.marker}getExecutionTime(){return Math.abs(this.#data.markEnd-this.#data.markStart)}},CommandKitEnvironmentType=(CommandKitEnvironmentType2=>(CommandKitEnvironmentType2.CommandHandler="COMMAND_HANDLER",CommandKitEnvironmentType2))(CommandKitEnvironmentType||{});function after(fn){let env=getContext();if(!env)throw new Error("after must be called inside commandkit handler.");return env.registerDeferredFunction(fn)}__name(after,"after");function cancelAfter(id){let env=getContext();if(!env)throw new Error("cancelAfter must be called inside commandkit handler.");env.clearDeferredFunction(id)}__name(cancelAfter,"cancelAfter");0&&(module.exports={CommandKitEnvironment,CommandKitEnvironmentType,after,cancelAfter});
2
+ //# sourceMappingURL=environment.js.map