@mostfeatured/dbi 0.1.46 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/dist/src/DBI.d.ts.map +1 -0
  2. package/dist/src/DBI.js.map +1 -0
  3. package/dist/src/Events.d.ts.map +1 -0
  4. package/dist/src/Events.js.map +1 -0
  5. package/dist/src/index.d.ts.map +1 -0
  6. package/dist/src/index.js.map +1 -0
  7. package/dist/src/methods/handleMessageCommands.d.ts.map +1 -0
  8. package/dist/src/methods/handleMessageCommands.js.map +1 -0
  9. package/dist/src/methods/hookEventListeners.d.ts.map +1 -0
  10. package/dist/src/methods/hookEventListeners.js.map +1 -0
  11. package/dist/src/methods/hookInteractionListeners.d.ts.map +1 -0
  12. package/dist/{methods → src/methods}/hookInteractionListeners.js +22 -12
  13. package/dist/src/methods/hookInteractionListeners.js.map +1 -0
  14. package/dist/src/methods/publishInteractions.d.ts.map +1 -0
  15. package/dist/src/methods/publishInteractions.js.map +1 -0
  16. package/dist/src/types/ApplicationRoleConnectionMetadata.d.ts.map +1 -0
  17. package/dist/src/types/ApplicationRoleConnectionMetadata.js.map +1 -0
  18. package/dist/src/types/Builders/ButtonBuilder.d.ts.map +1 -0
  19. package/dist/src/types/Builders/ButtonBuilder.js.map +1 -0
  20. package/dist/src/types/Builders/ChannelSelectMenuBuilder.d.ts.map +1 -0
  21. package/dist/src/types/Builders/ChannelSelectMenuBuilder.js.map +1 -0
  22. package/dist/src/types/Builders/MentionableSelectMenuBuilder.d.ts.map +1 -0
  23. package/dist/src/types/Builders/MentionableSelectMenuBuilder.js.map +1 -0
  24. package/dist/src/types/Builders/ModalBuilder.d.ts.map +1 -0
  25. package/dist/src/types/Builders/ModalBuilder.js.map +1 -0
  26. package/dist/src/types/Builders/RoleSelectMenuBuilder.d.ts.map +1 -0
  27. package/dist/src/types/Builders/RoleSelectMenuBuilder.js.map +1 -0
  28. package/dist/src/types/Builders/StringSelectMenuBuilder.d.ts.map +1 -0
  29. package/dist/src/types/Builders/StringSelectMenuBuilder.js.map +1 -0
  30. package/dist/src/types/Builders/UserSelectMenuBuilder.d.ts.map +1 -0
  31. package/dist/src/types/Builders/UserSelectMenuBuilder.js.map +1 -0
  32. package/dist/src/types/ChatInput/ChatInput.d.ts.map +1 -0
  33. package/dist/src/types/ChatInput/ChatInput.js.map +1 -0
  34. package/dist/{types → src/types}/ChatInput/ChatInputOptions.d.ts +2 -2
  35. package/dist/src/types/ChatInput/ChatInputOptions.d.ts.map +1 -0
  36. package/dist/src/types/ChatInput/ChatInputOptions.js.map +1 -0
  37. package/dist/src/types/Components/Button.d.ts.map +1 -0
  38. package/dist/src/types/Components/Button.js.map +1 -0
  39. package/dist/src/types/Components/ChannelSelectMenu.d.ts.map +1 -0
  40. package/dist/src/types/Components/ChannelSelectMenu.js.map +1 -0
  41. package/dist/src/types/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.d.ts.map +1 -0
  42. package/dist/src/types/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.js.map +1 -0
  43. package/dist/src/types/Components/HTMLComponentsV2/index.d.ts +91 -0
  44. package/dist/src/types/Components/HTMLComponentsV2/index.d.ts.map +1 -0
  45. package/dist/src/types/Components/HTMLComponentsV2/index.js +300 -0
  46. package/dist/src/types/Components/HTMLComponentsV2/index.js.map +1 -0
  47. package/dist/src/types/Components/HTMLComponentsV2/parser.d.ts.map +1 -0
  48. package/dist/{types → src/types}/Components/HTMLComponentsV2/parser.js +11 -4
  49. package/dist/src/types/Components/HTMLComponentsV2/parser.js.map +1 -0
  50. package/dist/src/types/Components/HTMLComponentsV2/svelteParser.d.ts +35 -0
  51. package/dist/src/types/Components/HTMLComponentsV2/svelteParser.d.ts.map +1 -0
  52. package/dist/src/types/Components/HTMLComponentsV2/svelteParser.js +822 -0
  53. package/dist/src/types/Components/HTMLComponentsV2/svelteParser.js.map +1 -0
  54. package/dist/src/types/Components/HTMLComponentsV2/svelteRenderer.d.ts +24 -0
  55. package/dist/src/types/Components/HTMLComponentsV2/svelteRenderer.d.ts.map +1 -0
  56. package/dist/src/types/Components/HTMLComponentsV2/svelteRenderer.js +294 -0
  57. package/dist/src/types/Components/HTMLComponentsV2/svelteRenderer.js.map +1 -0
  58. package/dist/src/types/Components/MentionableSelectMenu.d.ts.map +1 -0
  59. package/dist/src/types/Components/MentionableSelectMenu.js.map +1 -0
  60. package/dist/src/types/Components/Modal.d.ts.map +1 -0
  61. package/dist/src/types/Components/Modal.js.map +1 -0
  62. package/dist/src/types/Components/RoleSelectMenu.d.ts.map +1 -0
  63. package/dist/src/types/Components/RoleSelectMenu.js.map +1 -0
  64. package/dist/src/types/Components/StringSelectMenu.d.ts.map +1 -0
  65. package/dist/src/types/Components/StringSelectMenu.js.map +1 -0
  66. package/dist/src/types/Components/UserSelectMenu.d.ts.map +1 -0
  67. package/dist/src/types/Components/UserSelectMenu.js.map +1 -0
  68. package/dist/src/types/Event.d.ts.map +1 -0
  69. package/dist/src/types/Event.js.map +1 -0
  70. package/dist/src/types/Interaction.d.ts.map +1 -0
  71. package/dist/src/types/Interaction.js.map +1 -0
  72. package/dist/src/types/other/CustomEvent.d.ts.map +1 -0
  73. package/dist/src/types/other/CustomEvent.js.map +1 -0
  74. package/dist/src/types/other/FakeMessageInteraction.d.ts.map +1 -0
  75. package/dist/src/types/other/FakeMessageInteraction.js.map +1 -0
  76. package/dist/src/types/other/InteractionLocale.d.ts.map +1 -0
  77. package/dist/src/types/other/InteractionLocale.js.map +1 -0
  78. package/dist/src/types/other/Locale.d.ts.map +1 -0
  79. package/dist/src/types/other/Locale.js.map +1 -0
  80. package/dist/src/types/other/MessageContextMenu.d.ts.map +1 -0
  81. package/dist/src/types/other/MessageContextMenu.js.map +1 -0
  82. package/dist/src/types/other/UserContextMenu.d.ts.map +1 -0
  83. package/dist/src/types/other/UserContextMenu.js.map +1 -0
  84. package/dist/src/utils/MemoryStore.d.ts.map +1 -0
  85. package/dist/src/utils/MemoryStore.js.map +1 -0
  86. package/dist/src/utils/UtilTypes.d.ts.map +1 -0
  87. package/dist/src/utils/UtilTypes.js.map +1 -0
  88. package/dist/src/utils/customId.d.ts.map +1 -0
  89. package/dist/src/utils/customId.js.map +1 -0
  90. package/dist/src/utils/permissions.d.ts.map +1 -0
  91. package/dist/src/utils/permissions.js.map +1 -0
  92. package/dist/src/utils/recursiveImport.d.ts.map +1 -0
  93. package/dist/src/utils/recursiveImport.js.map +1 -0
  94. package/dist/src/utils/recursiveUnload.d.ts.map +1 -0
  95. package/dist/src/utils/recursiveUnload.js.map +1 -0
  96. package/dist/src/utils/unloadModule.d.ts.map +1 -0
  97. package/dist/src/utils/unloadModule.js.map +1 -0
  98. package/dist/test/index.d.ts +2 -0
  99. package/dist/test/index.d.ts.map +1 -0
  100. package/dist/test/index.js +103 -0
  101. package/dist/test/index.js.map +1 -0
  102. package/docs/ADVANCED_FEATURES.md +836 -0
  103. package/docs/API_REFERENCE.md +925 -0
  104. package/docs/CHAT_INPUT.md +807 -0
  105. package/docs/COMPONENTS.md +1035 -0
  106. package/docs/EVENTS.md +564 -0
  107. package/docs/GETTING_STARTED.md +394 -0
  108. package/docs/LOCALIZATION.md +773 -0
  109. package/docs/README.md +341 -0
  110. package/docs/SVELTE_COMPONENTS.md +955 -0
  111. package/generated/globals.d.ts +1 -0
  112. package/generated/index.d.ts +30 -0
  113. package/generated/svelte-dbi.d.ts +588 -0
  114. package/package.json +57 -47
  115. package/readme.md +168 -491
  116. package/src/methods/hookInteractionListeners.ts +23 -12
  117. package/src/types/Components/HTMLComponentsV2/index.ts +353 -12
  118. package/src/types/Components/HTMLComponentsV2/parser.ts +14 -4
  119. package/src/types/Components/HTMLComponentsV2/svelteParser.ts +904 -0
  120. package/src/types/Components/HTMLComponentsV2/svelteRenderer.ts +332 -0
  121. package/test/index.ts +105 -0
  122. package/test/product-showcase.svelte +199 -0
  123. package/tsconfig.json +13 -3
  124. package/dist/DBI.d.ts.map +0 -1
  125. package/dist/DBI.js.map +0 -1
  126. package/dist/Events.d.ts.map +0 -1
  127. package/dist/Events.js.map +0 -1
  128. package/dist/index.d.ts.map +0 -1
  129. package/dist/index.js.map +0 -1
  130. package/dist/methods/handleMessageCommands.d.ts.map +0 -1
  131. package/dist/methods/handleMessageCommands.js.map +0 -1
  132. package/dist/methods/hookEventListeners.d.ts.map +0 -1
  133. package/dist/methods/hookEventListeners.js.map +0 -1
  134. package/dist/methods/hookInteractionListeners.d.ts.map +0 -1
  135. package/dist/methods/hookInteractionListeners.js.map +0 -1
  136. package/dist/methods/publishInteractions.d.ts.map +0 -1
  137. package/dist/methods/publishInteractions.js.map +0 -1
  138. package/dist/types/ApplicationRoleConnectionMetadata.d.ts.map +0 -1
  139. package/dist/types/ApplicationRoleConnectionMetadata.js.map +0 -1
  140. package/dist/types/Builders/ButtonBuilder.d.ts.map +0 -1
  141. package/dist/types/Builders/ButtonBuilder.js.map +0 -1
  142. package/dist/types/Builders/ChannelSelectMenuBuilder.d.ts.map +0 -1
  143. package/dist/types/Builders/ChannelSelectMenuBuilder.js.map +0 -1
  144. package/dist/types/Builders/MentionableSelectMenuBuilder.d.ts.map +0 -1
  145. package/dist/types/Builders/MentionableSelectMenuBuilder.js.map +0 -1
  146. package/dist/types/Builders/ModalBuilder.d.ts.map +0 -1
  147. package/dist/types/Builders/ModalBuilder.js.map +0 -1
  148. package/dist/types/Builders/RoleSelectMenuBuilder.d.ts.map +0 -1
  149. package/dist/types/Builders/RoleSelectMenuBuilder.js.map +0 -1
  150. package/dist/types/Builders/StringSelectMenuBuilder.d.ts.map +0 -1
  151. package/dist/types/Builders/StringSelectMenuBuilder.js.map +0 -1
  152. package/dist/types/Builders/UserSelectMenuBuilder.d.ts.map +0 -1
  153. package/dist/types/Builders/UserSelectMenuBuilder.js.map +0 -1
  154. package/dist/types/ChatInput/ChatInput.d.ts.map +0 -1
  155. package/dist/types/ChatInput/ChatInput.js.map +0 -1
  156. package/dist/types/ChatInput/ChatInputOptions.d.ts.map +0 -1
  157. package/dist/types/ChatInput/ChatInputOptions.js.map +0 -1
  158. package/dist/types/Components/Button.d.ts.map +0 -1
  159. package/dist/types/Components/Button.js.map +0 -1
  160. package/dist/types/Components/ChannelSelectMenu.d.ts.map +0 -1
  161. package/dist/types/Components/ChannelSelectMenu.js.map +0 -1
  162. package/dist/types/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.d.ts.map +0 -1
  163. package/dist/types/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.js.map +0 -1
  164. package/dist/types/Components/HTMLComponentsV2/index.d.ts +0 -19
  165. package/dist/types/Components/HTMLComponentsV2/index.d.ts.map +0 -1
  166. package/dist/types/Components/HTMLComponentsV2/index.js +0 -31
  167. package/dist/types/Components/HTMLComponentsV2/index.js.map +0 -1
  168. package/dist/types/Components/HTMLComponentsV2/parser.d.ts.map +0 -1
  169. package/dist/types/Components/HTMLComponentsV2/parser.js.map +0 -1
  170. package/dist/types/Components/MentionableSelectMenu.d.ts.map +0 -1
  171. package/dist/types/Components/MentionableSelectMenu.js.map +0 -1
  172. package/dist/types/Components/Modal.d.ts.map +0 -1
  173. package/dist/types/Components/Modal.js.map +0 -1
  174. package/dist/types/Components/RoleSelectMenu.d.ts.map +0 -1
  175. package/dist/types/Components/RoleSelectMenu.js.map +0 -1
  176. package/dist/types/Components/StringSelectMenu.d.ts.map +0 -1
  177. package/dist/types/Components/StringSelectMenu.js.map +0 -1
  178. package/dist/types/Components/UserSelectMenu.d.ts.map +0 -1
  179. package/dist/types/Components/UserSelectMenu.js.map +0 -1
  180. package/dist/types/Event.d.ts.map +0 -1
  181. package/dist/types/Event.js.map +0 -1
  182. package/dist/types/Interaction.d.ts.map +0 -1
  183. package/dist/types/Interaction.js.map +0 -1
  184. package/dist/types/other/CustomEvent.d.ts.map +0 -1
  185. package/dist/types/other/CustomEvent.js.map +0 -1
  186. package/dist/types/other/FakeMessageInteraction.d.ts.map +0 -1
  187. package/dist/types/other/FakeMessageInteraction.js.map +0 -1
  188. package/dist/types/other/InteractionLocale.d.ts.map +0 -1
  189. package/dist/types/other/InteractionLocale.js.map +0 -1
  190. package/dist/types/other/Locale.d.ts.map +0 -1
  191. package/dist/types/other/Locale.js.map +0 -1
  192. package/dist/types/other/MessageContextMenu.d.ts.map +0 -1
  193. package/dist/types/other/MessageContextMenu.js.map +0 -1
  194. package/dist/types/other/UserContextMenu.d.ts.map +0 -1
  195. package/dist/types/other/UserContextMenu.js.map +0 -1
  196. package/dist/utils/MemoryStore.d.ts.map +0 -1
  197. package/dist/utils/MemoryStore.js.map +0 -1
  198. package/dist/utils/UtilTypes.d.ts.map +0 -1
  199. package/dist/utils/UtilTypes.js.map +0 -1
  200. package/dist/utils/customId.d.ts.map +0 -1
  201. package/dist/utils/customId.js.map +0 -1
  202. package/dist/utils/permissions.d.ts.map +0 -1
  203. package/dist/utils/permissions.js.map +0 -1
  204. package/dist/utils/recursiveImport.d.ts.map +0 -1
  205. package/dist/utils/recursiveImport.js.map +0 -1
  206. package/dist/utils/recursiveUnload.d.ts.map +0 -1
  207. package/dist/utils/recursiveUnload.js.map +0 -1
  208. package/dist/utils/unloadModule.d.ts.map +0 -1
  209. package/dist/utils/unloadModule.js.map +0 -1
  210. package/examples/modal/dbi.js +0 -30
  211. package/examples/modal/login.js +0 -15
  212. package/examples/modal/package.json +0 -15
  213. package/examples/modal/publish.js +0 -13
  214. package/examples/modal/src/chatInput.js +0 -38
  215. package/examples/modal/src/components.js +0 -33
  216. package/examples/modal/src/event.js +0 -20
  217. package/examples/modal/src/interactionlocales.js +0 -24
  218. package/examples/modal/src/locales.js +0 -38
  219. package/examples/modal/src/modal.js +0 -28
  220. /package/dist/{DBI.d.ts → src/DBI.d.ts} +0 -0
  221. /package/dist/{DBI.js → src/DBI.js} +0 -0
  222. /package/dist/{Events.d.ts → src/Events.d.ts} +0 -0
  223. /package/dist/{Events.js → src/Events.js} +0 -0
  224. /package/dist/{data → src/data}/eventMap.json +0 -0
  225. /package/dist/{index.d.ts → src/index.d.ts} +0 -0
  226. /package/dist/{index.js → src/index.js} +0 -0
  227. /package/dist/{methods → src/methods}/handleMessageCommands.d.ts +0 -0
  228. /package/dist/{methods → src/methods}/handleMessageCommands.js +0 -0
  229. /package/dist/{methods → src/methods}/hookEventListeners.d.ts +0 -0
  230. /package/dist/{methods → src/methods}/hookEventListeners.js +0 -0
  231. /package/dist/{methods → src/methods}/hookInteractionListeners.d.ts +0 -0
  232. /package/dist/{methods → src/methods}/publishInteractions.d.ts +0 -0
  233. /package/dist/{methods → src/methods}/publishInteractions.js +0 -0
  234. /package/dist/{types → src/types}/ApplicationRoleConnectionMetadata.d.ts +0 -0
  235. /package/dist/{types → src/types}/ApplicationRoleConnectionMetadata.js +0 -0
  236. /package/dist/{types → src/types}/Builders/ButtonBuilder.d.ts +0 -0
  237. /package/dist/{types → src/types}/Builders/ButtonBuilder.js +0 -0
  238. /package/dist/{types → src/types}/Builders/ChannelSelectMenuBuilder.d.ts +0 -0
  239. /package/dist/{types → src/types}/Builders/ChannelSelectMenuBuilder.js +0 -0
  240. /package/dist/{types → src/types}/Builders/MentionableSelectMenuBuilder.d.ts +0 -0
  241. /package/dist/{types → src/types}/Builders/MentionableSelectMenuBuilder.js +0 -0
  242. /package/dist/{types → src/types}/Builders/ModalBuilder.d.ts +0 -0
  243. /package/dist/{types → src/types}/Builders/ModalBuilder.js +0 -0
  244. /package/dist/{types → src/types}/Builders/RoleSelectMenuBuilder.d.ts +0 -0
  245. /package/dist/{types → src/types}/Builders/RoleSelectMenuBuilder.js +0 -0
  246. /package/dist/{types → src/types}/Builders/StringSelectMenuBuilder.d.ts +0 -0
  247. /package/dist/{types → src/types}/Builders/StringSelectMenuBuilder.js +0 -0
  248. /package/dist/{types → src/types}/Builders/UserSelectMenuBuilder.d.ts +0 -0
  249. /package/dist/{types → src/types}/Builders/UserSelectMenuBuilder.js +0 -0
  250. /package/dist/{types → src/types}/ChatInput/ChatInput.d.ts +0 -0
  251. /package/dist/{types → src/types}/ChatInput/ChatInput.js +0 -0
  252. /package/dist/{types → src/types}/ChatInput/ChatInputOptions.js +0 -0
  253. /package/dist/{types → src/types}/Components/Button.d.ts +0 -0
  254. /package/dist/{types → src/types}/Components/Button.js +0 -0
  255. /package/dist/{types → src/types}/Components/ChannelSelectMenu.d.ts +0 -0
  256. /package/dist/{types → src/types}/Components/ChannelSelectMenu.js +0 -0
  257. /package/dist/{types → src/types}/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.d.ts +0 -0
  258. /package/dist/{types → src/types}/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.js +0 -0
  259. /package/dist/{types → src/types}/Components/HTMLComponentsV2/parser.d.ts +0 -0
  260. /package/dist/{types → src/types}/Components/MentionableSelectMenu.d.ts +0 -0
  261. /package/dist/{types → src/types}/Components/MentionableSelectMenu.js +0 -0
  262. /package/dist/{types → src/types}/Components/Modal.d.ts +0 -0
  263. /package/dist/{types → src/types}/Components/Modal.js +0 -0
  264. /package/dist/{types → src/types}/Components/RoleSelectMenu.d.ts +0 -0
  265. /package/dist/{types → src/types}/Components/RoleSelectMenu.js +0 -0
  266. /package/dist/{types → src/types}/Components/StringSelectMenu.d.ts +0 -0
  267. /package/dist/{types → src/types}/Components/StringSelectMenu.js +0 -0
  268. /package/dist/{types → src/types}/Components/UserSelectMenu.d.ts +0 -0
  269. /package/dist/{types → src/types}/Components/UserSelectMenu.js +0 -0
  270. /package/dist/{types → src/types}/Event.d.ts +0 -0
  271. /package/dist/{types → src/types}/Event.js +0 -0
  272. /package/dist/{types → src/types}/Interaction.d.ts +0 -0
  273. /package/dist/{types → src/types}/Interaction.js +0 -0
  274. /package/dist/{types → src/types}/other/CustomEvent.d.ts +0 -0
  275. /package/dist/{types → src/types}/other/CustomEvent.js +0 -0
  276. /package/dist/{types → src/types}/other/FakeMessageInteraction.d.ts +0 -0
  277. /package/dist/{types → src/types}/other/FakeMessageInteraction.js +0 -0
  278. /package/dist/{types → src/types}/other/InteractionLocale.d.ts +0 -0
  279. /package/dist/{types → src/types}/other/InteractionLocale.js +0 -0
  280. /package/dist/{types → src/types}/other/Locale.d.ts +0 -0
  281. /package/dist/{types → src/types}/other/Locale.js +0 -0
  282. /package/dist/{types → src/types}/other/MessageContextMenu.d.ts +0 -0
  283. /package/dist/{types → src/types}/other/MessageContextMenu.js +0 -0
  284. /package/dist/{types → src/types}/other/UserContextMenu.d.ts +0 -0
  285. /package/dist/{types → src/types}/other/UserContextMenu.js +0 -0
  286. /package/dist/{utils → src/utils}/MemoryStore.d.ts +0 -0
  287. /package/dist/{utils → src/utils}/MemoryStore.js +0 -0
  288. /package/dist/{utils → src/utils}/UtilTypes.d.ts +0 -0
  289. /package/dist/{utils → src/utils}/UtilTypes.js +0 -0
  290. /package/dist/{utils → src/utils}/customId.d.ts +0 -0
  291. /package/dist/{utils → src/utils}/customId.js +0 -0
  292. /package/dist/{utils → src/utils}/permissions.d.ts +0 -0
  293. /package/dist/{utils → src/utils}/permissions.js +0 -0
  294. /package/dist/{utils → src/utils}/recursiveImport.d.ts +0 -0
  295. /package/dist/{utils → src/utils}/recursiveImport.js +0 -0
  296. /package/dist/{utils → src/utils}/recursiveUnload.d.ts +0 -0
  297. /package/dist/{utils → src/utils}/recursiveUnload.js +0 -0
  298. /package/dist/{utils → src/utils}/unloadModule.d.ts +0 -0
  299. /package/dist/{utils → src/utils}/unloadModule.js +0 -0
@@ -233,27 +233,38 @@ export function hookInteractionListeners(dbi: DBI<NamespaceEnums>): () => any {
233
233
 
234
234
 
235
235
  if (dbiInter.type === "HTMLComponentsV2") {
236
+ // For HTMLComponentsV2, first element of data is the element name (button name, etc.)
237
+ const elementName = data?.[0];
238
+ console.log("[Hook] HTMLComponentsV2 interaction found, elementName:", elementName);
239
+ console.log("[Hook] onExecute exists:", typeof dbiInter.onExecute);
240
+
236
241
  if (dbi.config.strict) {
237
242
  // @ts-ignore
238
243
  await dbiInter.onExecute?.(arg);
239
244
 
240
- const elementName = data.shift();
241
- dbiInter.handlers.forEach((handler) => {
242
- if (handler.name === elementName) {
243
- handler.onExecute(arg);
244
- }
245
- });
246
- } else {
247
- try {
248
- // @ts-ignore
249
- await dbiInter.onExecute?.(arg);
250
-
251
- const elementName = data.shift();
245
+ // For traditional handlers (non-Svelte mode)
246
+ if (dbiInter.handlers?.length > 0) {
247
+ data.shift(); // Remove element name from data
252
248
  dbiInter.handlers.forEach((handler) => {
253
249
  if (handler.name === elementName) {
254
250
  handler.onExecute(arg);
255
251
  }
256
252
  });
253
+ }
254
+ } else {
255
+ try {
256
+ // @ts-ignore
257
+ await dbiInter.onExecute?.(arg);
258
+
259
+ // For traditional handlers (non-Svelte mode)
260
+ if (dbiInter.handlers?.length > 0) {
261
+ data.shift(); // Remove element name from data
262
+ dbiInter.handlers.forEach((handler) => {
263
+ if (handler.name === elementName) {
264
+ handler.onExecute(arg);
265
+ }
266
+ });
267
+ }
257
268
  } catch (error) {
258
269
  // @ts-ignore
259
270
  await dbi.events.trigger(
@@ -2,14 +2,36 @@ import { NamespaceEnums } from "../../../../generated/namespaceData";
2
2
  import { DBI } from "../../../DBI";
3
3
  import { DBIBaseInteraction, DBIRateLimit, IDBIBaseExecuteCtx, TDBIReferencedData } from "../../Interaction";
4
4
  import { parseHTMLComponentsV2 } from "./parser";
5
+ import { renderSvelteComponent, renderSvelteComponentFromFile, SvelteRenderResult } from "./svelteRenderer";
6
+ import { parseSvelteComponent, createHandlerContext, HandlerContextResult } from "./svelteParser";
5
7
  import fs from "fs";
6
8
 
7
- export type TDBIHTMLComponentsV2Omitted<TNamespace extends NamespaceEnums> = Omit<DBIHTMLComponentsV2<TNamespace>, "type" | "dbi" | "toJSON" | "description">;
9
+ export type TDBIHTMLComponentsV2Omitted<TNamespace extends NamespaceEnums> = Omit<DBIHTMLComponentsV2<TNamespace>, "type" | "dbi" | "toJSON" | "description" | "send" | "destroy" | "destroyAll"> & {
10
+ /**
11
+ * Use 'svelte' for Svelte 5 components, 'eta' for Eta templates (default)
12
+ */
13
+ mode?: 'svelte' | 'eta';
14
+ /**
15
+ * Callback executed when the component interaction is triggered
16
+ */
17
+ onExecute?: (ctx: IDBIHTMLComponentsV2ExecuteCtx<TNamespace>) => void;
18
+ };
8
19
 
9
20
  export type TDBIHTMLComponentsV2ToJSONArgs = {
10
21
  data?: Record<string, any>;
11
22
  }
12
23
 
24
+ export interface TDBIHTMLComponentsV2SendOptions {
25
+ data?: Record<string, any>;
26
+ flags?: string[];
27
+ content?: string;
28
+ ephemeral?: boolean;
29
+ /** If true, uses interaction.reply(). If false or unset, auto-detects based on target type */
30
+ reply?: boolean;
31
+ /** If true, uses interaction.followUp() instead of reply() */
32
+ followUp?: boolean;
33
+ }
34
+
13
35
  export interface IDBIHTMLComponentsV2ExecuteCtx<TNamespace extends NamespaceEnums> extends IDBIBaseExecuteCtx<TNamespace> {
14
36
  data: TDBIReferencedData[];
15
37
  }
@@ -17,30 +39,349 @@ export interface IDBIHTMLComponentsV2ExecuteCtx<TNamespace extends NamespaceEnum
17
39
  export class DBIHTMLComponentsV2<TNamespace extends NamespaceEnums> extends DBIBaseInteraction<TNamespace> {
18
40
  template?: string;
19
41
  file?: string;
42
+ mode: 'svelte' | 'eta' = 'eta';
43
+ private svelteComponentInfo: any = null;
44
+ private _userOnExecute?: (ctx: IDBIHTMLComponentsV2ExecuteCtx<TNamespace>) => void;
45
+
46
+ // Store handler contexts per ref for lifecycle management
47
+ // Key: ref id, Value: handlerContext with lifecycle hooks
48
+ private _activeContexts: Map<string, any> = new Map();
20
49
 
21
50
  constructor(dbi: DBI<TNamespace>, args: TDBIHTMLComponentsV2Omitted<TNamespace>) {
51
+ // Store user's onExecute callback before passing to super
52
+ const userOnExecute = (args as any).onExecute;
53
+
54
+ // Remove onExecute from args so it doesn't override the class method
55
+ const argsWithoutOnExecute = { ...args };
56
+ delete (argsWithoutOnExecute as any).onExecute;
57
+
22
58
  super(dbi, {
23
- ...(args as any),
59
+ ...(argsWithoutOnExecute as any),
24
60
  type: "HTMLComponentsV2",
25
61
  });
26
- this.template = args.template || fs.readFileSync(args.file || "", "utf-8");
62
+ this.template = args.template || (args.file ? fs.readFileSync(args.file, "utf-8") : undefined);
63
+ this.file = args.file;
27
64
  this.name = args.name;
28
65
  this.handlers = args.handlers || [];
66
+ this.mode = args.mode || 'eta';
67
+
68
+ // Store user's onExecute callback if provided
69
+ if (userOnExecute) {
70
+ this._userOnExecute = userOnExecute;
71
+ }
72
+
73
+ // Pre-extract Svelte handlers at registration time
74
+ if (this.mode === 'svelte' && this.template) {
75
+ this.svelteComponentInfo = parseSvelteComponent(this.template);
76
+
77
+ // Debug log
78
+ console.log(`[Svelte] Component "${this.name}" registered with handlers:`,
79
+ Array.from(this.svelteComponentInfo.handlers.entries())
80
+ );
81
+ }
82
+
83
+ // Re-assign onExecute method after super() call because parent class sets it to undefined
84
+ this.onExecute = this._handleExecute.bind(this);
85
+ }
86
+
87
+ private _handleExecute(ctx: IDBIHTMLComponentsV2ExecuteCtx<TNamespace>) {
88
+ console.log("[Svelte] onExecute called with data:", ctx.data);
89
+
90
+ // Call user's onExecute callback first if provided
91
+ if (this._userOnExecute) {
92
+ this._userOnExecute(ctx);
93
+ }
94
+
95
+ // If using Svelte mode, find and execute the handler
96
+ if (this.mode === 'svelte' && this.svelteComponentInfo) {
97
+ const [elementName, ...handlerData] = ctx.data;
98
+ console.log("[Svelte] Element name:", elementName, "Handler data:", handlerData);
99
+
100
+ if (typeof elementName === 'string') {
101
+ // Find the handler info for this element
102
+ const handlerInfo = this.svelteComponentInfo.handlers.get(elementName);
103
+ console.log("[Svelte] Handler info:", handlerInfo);
104
+
105
+ if (handlerInfo) {
106
+ // Extract current state from handlerData (refs that were passed)
107
+ // The second element in data array contains the current state
108
+ const currentState = handlerData[0] || {} as Record<string, any>;
109
+ console.log("[Svelte] Current state:", currentState);
110
+
111
+ // Get ref id for lifecycle tracking (if available)
112
+ const refId = (currentState as any)?.$ref || null;
113
+
114
+ // Check if this is first execution for this ref
115
+ const isFirstExecution = refId && !this._activeContexts.has(refId);
116
+
117
+ // Get existing context if any (to preserve lifecycle callbacks like intervals)
118
+ const existingContext = refId ? this._activeContexts.get(refId) : null;
119
+
120
+ // Create a NEW handler context for each execution with the current state
121
+ // This ensures each interaction has its own isolated state
122
+ // Pass 'this' so handlers can access component methods like toJSON()
123
+ // Pass ctx so handlers can access ctx.interaction, ctx.data, ctx.locale, etc.
124
+ const handlerContext = createHandlerContext(
125
+ this.svelteComponentInfo.scriptContent,
126
+ typeof currentState === 'object' ? currentState : {},
127
+ this,
128
+ ctx
129
+ );
130
+
131
+ const handlerFn = handlerContext.handlers[handlerInfo.handlerName];
132
+ console.log("[Svelte] Handler function:", handlerFn ? "found" : "not found", handlerInfo.handlerName);
133
+
134
+ if (handlerFn && typeof handlerFn === 'function') {
135
+ try {
136
+ // Store context for lifecycle management
137
+ if (refId) {
138
+ // If there's an existing context, transfer its destroy callbacks to the new context
139
+ // This preserves intervals/timers created in onMount
140
+ if (existingContext && existingContext.destroyCallbacks) {
141
+ // Merge existing destroy callbacks (don't run them!)
142
+ handlerContext.destroyCallbacks.push(...existingContext.destroyCallbacks);
143
+ }
144
+
145
+ this._activeContexts.set(refId, handlerContext);
146
+
147
+ // Wrap $unRef to call onDestroy when ref is deleted (only wrap once)
148
+ const stateObj = currentState as any;
149
+ if (stateObj.$unRef && !stateObj.__unRefWrapped__) {
150
+ const originalUnRef = stateObj.$unRef.bind(stateObj);
151
+ stateObj.$unRef = () => {
152
+ // Run destroy callbacks before unref
153
+ const ctx = this._activeContexts.get(refId);
154
+ if (ctx && ctx.runDestroy) {
155
+ ctx.runDestroy();
156
+ }
157
+ this._activeContexts.delete(refId);
158
+ return originalUnRef();
159
+ };
160
+ stateObj.__unRefWrapped__ = true;
161
+ }
162
+ }
163
+
164
+ // Run onMount callbacks only on first execution
165
+ if (isFirstExecution && handlerContext.runMount) {
166
+ handlerContext.runMount();
167
+ }
168
+
169
+ // Mark that we're inside handler execution (prevents auto-render during handler)
170
+ handlerContext.setInHandler(true);
171
+
172
+ try {
173
+ // Bind 'this' to the DBIHTMLComponentsV2 instance so handlers can use this.toJSON()
174
+ // Pass wrappedCtx so handlers use the proxy-wrapped ctx that tracks interaction calls
175
+ // This ensures __asyncInteractionCalled__ flag is set when handler calls ctx.interaction.reply() etc.
176
+ handlerFn.call(this, handlerContext.wrappedCtx, ...handlerData.slice(1));
177
+ } finally {
178
+ // Always reset handler execution flag
179
+ handlerContext.setInHandler(false);
180
+ }
181
+
182
+ // Run effects after handler execution (state may have changed)
183
+ handlerContext.runEffects();
184
+
185
+ // If there are pending data changes and no interaction method was called,
186
+ // flush the render now (synchronously uses interaction.update)
187
+ if (handlerContext.hasPendingRender()) {
188
+ handlerContext.flushRender();
189
+ }
190
+ } catch (error) {
191
+ console.error(`Error executing Svelte handler '${handlerInfo.handlerName}':`, error);
192
+ }
193
+ } else {
194
+ console.warn(`Handler function '${handlerInfo.handlerName}' not found for element '${elementName}'`);
195
+ }
196
+ } else {
197
+ console.warn(`No handler info found for element '${elementName}'`);
198
+ }
199
+ }
200
+ }
29
201
  }
30
202
 
31
203
  override toJSON(arg: TDBIHTMLComponentsV2ToJSONArgs = {}): any {
32
- return parseHTMLComponentsV2(
33
- this.dbi as any,
34
- this.template,
35
- this.name,
36
- {
37
- data: arg.data,
38
- ttl: this.ttl
204
+ if (this.mode === 'svelte' && this.template) {
205
+ // Render Svelte component
206
+ const result = renderSvelteComponent(
207
+ this.dbi as any,
208
+ this.template,
209
+ this.name,
210
+ {
211
+ data: arg.data,
212
+ ttl: this.ttl
213
+ }
214
+ );
215
+
216
+ return result.components;
217
+ } else {
218
+ // Use Eta template parsing (default)
219
+ return parseHTMLComponentsV2(
220
+ this.dbi as any,
221
+ this.template!,
222
+ this.name,
223
+ {
224
+ data: arg.data,
225
+ ttl: this.ttl
226
+ }
227
+ );
228
+ }
229
+ }
230
+
231
+ /**
232
+ * Send the component to an interaction or channel and initialize lifecycle hooks (onMount)
233
+ * This is the recommended way to send Svelte components with intervals/timers
234
+ *
235
+ * @param target - Discord interaction or channel to send to
236
+ * @param options - Send options including data, flags, content
237
+ *
238
+ * @example
239
+ * ```ts
240
+ * const showcase = dbi.interaction("product-showcase");
241
+ *
242
+ * // Send as interaction reply
243
+ * await showcase.send(interaction, { data: { count: 0 } });
244
+ *
245
+ * // Send to a channel directly
246
+ * await showcase.send(channel, { data: { count: 0 } });
247
+ *
248
+ * // Send as followUp (if already replied)
249
+ * await showcase.send(interaction, { data: { count: 0 }, followUp: true });
250
+ * ```
251
+ */
252
+ async send(target: any, options: TDBIHTMLComponentsV2SendOptions = {}): Promise<any> {
253
+ const { data = {}, flags = ["IsComponentsV2"], content, ephemeral, reply, followUp } = options;
254
+
255
+ // Render components
256
+ const components = this.toJSON({ data });
257
+
258
+ // Build message options
259
+ const messageOptions: any = { components, flags };
260
+ if (content) messageOptions.content = content;
261
+ if (ephemeral) messageOptions.flags = [...flags, "Ephemeral"];
262
+
263
+ // Detect target type and send accordingly
264
+ let message: any;
265
+ const isInteraction = target.reply && target.user; // Interactions have both reply method and user property
266
+ const isChannel = target.send && !target.user; // Channels have send but no user
267
+
268
+ if (isInteraction) {
269
+ if (followUp) {
270
+ message = await target.followUp(messageOptions);
271
+ } else {
272
+ message = await target.reply(messageOptions);
39
273
  }
40
- )
274
+ } else if (isChannel) {
275
+ message = await target.send(messageOptions);
276
+ } else {
277
+ throw new Error("Invalid target: must be an interaction or channel");
278
+ }
279
+
280
+ // If Svelte mode, create initial handler context and run onMount
281
+ if (this.mode === 'svelte' && this.svelteComponentInfo && data.$ref) {
282
+ const refId = data.$ref;
283
+
284
+ // Create handler context with a fake ctx that has the message
285
+ const fakeCtx = {
286
+ interaction: {
287
+ replied: true,
288
+ deferred: false,
289
+ message: message,
290
+ }
291
+ };
292
+
293
+ const handlerContext = createHandlerContext(
294
+ this.svelteComponentInfo.scriptContent,
295
+ data,
296
+ this,
297
+ fakeCtx
298
+ );
299
+
300
+ // Store the context for lifecycle management
301
+ this._activeContexts.set(refId, handlerContext);
302
+
303
+ // Wrap $unRef to call onDestroy when ref is deleted
304
+ if (data.$unRef) {
305
+ const originalUnRef = data.$unRef.bind(data);
306
+ data.$unRef = () => {
307
+ if (handlerContext.runDestroy) {
308
+ handlerContext.runDestroy();
309
+ }
310
+ this._activeContexts.delete(refId);
311
+ return originalUnRef();
312
+ };
313
+ }
314
+
315
+ // Run onMount callbacks
316
+ handlerContext.runMount();
317
+
318
+ // Run initial effects
319
+ handlerContext.runEffects();
320
+ }
321
+
322
+ return message;
41
323
  }
42
324
 
43
- override onExecute?(ctx: IDBIHTMLComponentsV2ExecuteCtx<TNamespace>) { };
325
+ /**
326
+ * Destroy a component instance by ref ID or data object
327
+ * This runs onDestroy callbacks (clears intervals/timers) and removes the ref
328
+ *
329
+ * @param refOrData - Either a ref ID string or the data object with $ref
330
+ * @returns true if destroyed, false if not found
331
+ *
332
+ * @example
333
+ * ```ts
334
+ * // Destroy by data object
335
+ * showcase.destroy(data);
336
+ *
337
+ * // Destroy by ref ID
338
+ * showcase.destroy(data.$ref);
339
+ *
340
+ * // Destroy all active instances of this component
341
+ * showcase.destroyAll();
342
+ * ```
343
+ */
344
+ destroy(refOrData: string | Record<string, any>): boolean {
345
+ const refId = typeof refOrData === 'string' ? refOrData : refOrData?.$ref;
346
+
347
+ if (!refId) {
348
+ console.warn("[Svelte] Cannot destroy: no ref ID provided");
349
+ return false;
350
+ }
351
+
352
+ const context = this._activeContexts.get(refId);
353
+ if (context) {
354
+ // Run destroy callbacks (clears intervals, timers, etc.)
355
+ if (context.runDestroy) {
356
+ context.runDestroy();
357
+ }
358
+ this._activeContexts.delete(refId);
359
+ }
360
+
361
+ // Also delete from DBI refs store
362
+ this.dbi.data.refs.delete(refId);
363
+
364
+ return true;
365
+ }
366
+
367
+ /**
368
+ * Destroy all active instances of this component
369
+ * Useful for cleanup when the bot shuts down or component is unloaded
370
+ *
371
+ * @returns Number of instances destroyed
372
+ */
373
+ destroyAll(): number {
374
+ let count = 0;
375
+ for (const [refId, context] of this._activeContexts) {
376
+ if (context.runDestroy) {
377
+ context.runDestroy();
378
+ }
379
+ this.dbi.data.refs.delete(refId);
380
+ count++;
381
+ }
382
+ this._activeContexts.clear();
383
+ return count;
384
+ }
44
385
 
45
386
  handlers?: any[] = [];
46
387
  }
@@ -80,13 +80,17 @@ function parseActionRow(dbi: DBI<NamespaceEnums>, dbiName: string, actionRow: El
80
80
 
81
81
  function parseButton(dbi: DBI<NamespaceEnums>, dbiName: string, button: Element) {
82
82
  const style = button.getAttribute("style") || button.getAttribute("button-style") || "Primary";
83
+ const isDisabled = getAttributeBoolean(button, "disabled");
84
+
85
+ const needsCustomId = style !== "Link" && style !== "Premium";
86
+
83
87
  return {
84
88
  type: ComponentType.Button,
85
89
  style: ButtonStyle[style],
86
90
  label: getCleanTextContent(button),
87
91
  emoji: button.getAttribute("emoji"),
88
- custom_id: style !== "Link" && style !== "Premium" ? parseCustomIdAttributes(dbi, dbiName, button) : undefined,
89
- disabled: getAttributeBoolean(button, "disabled"),
92
+ custom_id: needsCustomId ? parseCustomIdAttributes(dbi, dbiName, button) : undefined,
93
+ disabled: isDisabled,
90
94
  url: button.getAttribute("url"),
91
95
  sku_id: button.getAttribute("sku-id"),
92
96
  }
@@ -144,7 +148,13 @@ function parseSection(dbi: DBI<NamespaceEnums>, dbiName: string, sectionElement:
144
148
  const components = childs.find(el => el.tagName === "COMPONENTS");
145
149
  const children = Array.from(components?.children || []);
146
150
 
147
- const accessory = childs.find(el => el.tagName === "ACCESSORY")?.children?.[0];
151
+ // Look for accessory in <accessory> wrapper or directly as <thumbnail>/<button>
152
+ let accessory = childs.find(el => el.tagName === "ACCESSORY")?.children?.[0];
153
+
154
+ // If no <accessory> wrapper, look for direct thumbnail or button
155
+ if (!accessory) {
156
+ accessory = childs.find(el => el.tagName === "THUMBNAIL" || el.tagName === "BUTTON");
157
+ }
148
158
 
149
159
  return {
150
160
  type: ComponentType.Section,
@@ -166,7 +176,7 @@ function parseThumbnail(dbi: DBI<NamespaceEnums>, dbiName: string, thumbnailElem
166
176
  return {
167
177
  type: ComponentType.Thumbnail,
168
178
  media: {
169
- url: thumbnailElement.getAttribute("url")
179
+ url: thumbnailElement.getAttribute("url") || thumbnailElement.getAttribute("media")
170
180
  }
171
181
  }
172
182
  }