@mostfeatured/dbi 0.1.47 → 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.
- package/dist/src/DBI.d.ts.map +1 -0
- package/dist/src/DBI.js.map +1 -0
- package/dist/src/Events.d.ts.map +1 -0
- package/dist/src/Events.js.map +1 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/methods/handleMessageCommands.d.ts.map +1 -0
- package/dist/src/methods/handleMessageCommands.js.map +1 -0
- package/dist/src/methods/hookEventListeners.d.ts.map +1 -0
- package/dist/src/methods/hookEventListeners.js.map +1 -0
- package/dist/src/methods/hookInteractionListeners.d.ts.map +1 -0
- package/dist/{methods → src/methods}/hookInteractionListeners.js +22 -12
- package/dist/src/methods/hookInteractionListeners.js.map +1 -0
- package/dist/src/methods/publishInteractions.d.ts.map +1 -0
- package/dist/src/methods/publishInteractions.js.map +1 -0
- package/dist/src/types/ApplicationRoleConnectionMetadata.d.ts.map +1 -0
- package/dist/src/types/ApplicationRoleConnectionMetadata.js.map +1 -0
- package/dist/src/types/Builders/ButtonBuilder.d.ts.map +1 -0
- package/dist/src/types/Builders/ButtonBuilder.js.map +1 -0
- package/dist/src/types/Builders/ChannelSelectMenuBuilder.d.ts.map +1 -0
- package/dist/src/types/Builders/ChannelSelectMenuBuilder.js.map +1 -0
- package/dist/src/types/Builders/MentionableSelectMenuBuilder.d.ts.map +1 -0
- package/dist/src/types/Builders/MentionableSelectMenuBuilder.js.map +1 -0
- package/dist/src/types/Builders/ModalBuilder.d.ts.map +1 -0
- package/dist/src/types/Builders/ModalBuilder.js.map +1 -0
- package/dist/src/types/Builders/RoleSelectMenuBuilder.d.ts.map +1 -0
- package/dist/src/types/Builders/RoleSelectMenuBuilder.js.map +1 -0
- package/dist/src/types/Builders/StringSelectMenuBuilder.d.ts.map +1 -0
- package/dist/src/types/Builders/StringSelectMenuBuilder.js.map +1 -0
- package/dist/src/types/Builders/UserSelectMenuBuilder.d.ts.map +1 -0
- package/dist/src/types/Builders/UserSelectMenuBuilder.js.map +1 -0
- package/dist/src/types/ChatInput/ChatInput.d.ts.map +1 -0
- package/dist/src/types/ChatInput/ChatInput.js.map +1 -0
- package/dist/{types → src/types}/ChatInput/ChatInputOptions.d.ts +2 -2
- package/dist/src/types/ChatInput/ChatInputOptions.d.ts.map +1 -0
- package/dist/src/types/ChatInput/ChatInputOptions.js.map +1 -0
- package/dist/src/types/Components/Button.d.ts.map +1 -0
- package/dist/src/types/Components/Button.js.map +1 -0
- package/dist/src/types/Components/ChannelSelectMenu.d.ts.map +1 -0
- package/dist/src/types/Components/ChannelSelectMenu.js.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.d.ts.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.js.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/index.d.ts +91 -0
- package/dist/src/types/Components/HTMLComponentsV2/index.d.ts.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/index.js +300 -0
- package/dist/src/types/Components/HTMLComponentsV2/index.js.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/parser.d.ts.map +1 -0
- package/dist/{types → src/types}/Components/HTMLComponentsV2/parser.js +11 -4
- package/dist/src/types/Components/HTMLComponentsV2/parser.js.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteParser.d.ts +35 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteParser.d.ts.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteParser.js +822 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteParser.js.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteRenderer.d.ts +24 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteRenderer.d.ts.map +1 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteRenderer.js +294 -0
- package/dist/src/types/Components/HTMLComponentsV2/svelteRenderer.js.map +1 -0
- package/dist/src/types/Components/MentionableSelectMenu.d.ts.map +1 -0
- package/dist/src/types/Components/MentionableSelectMenu.js.map +1 -0
- package/dist/src/types/Components/Modal.d.ts.map +1 -0
- package/dist/src/types/Components/Modal.js.map +1 -0
- package/dist/src/types/Components/RoleSelectMenu.d.ts.map +1 -0
- package/dist/src/types/Components/RoleSelectMenu.js.map +1 -0
- package/dist/src/types/Components/StringSelectMenu.d.ts.map +1 -0
- package/dist/src/types/Components/StringSelectMenu.js.map +1 -0
- package/dist/src/types/Components/UserSelectMenu.d.ts.map +1 -0
- package/dist/src/types/Components/UserSelectMenu.js.map +1 -0
- package/dist/src/types/Event.d.ts.map +1 -0
- package/dist/src/types/Event.js.map +1 -0
- package/dist/src/types/Interaction.d.ts.map +1 -0
- package/dist/src/types/Interaction.js.map +1 -0
- package/dist/src/types/other/CustomEvent.d.ts.map +1 -0
- package/dist/src/types/other/CustomEvent.js.map +1 -0
- package/dist/src/types/other/FakeMessageInteraction.d.ts.map +1 -0
- package/dist/src/types/other/FakeMessageInteraction.js.map +1 -0
- package/dist/src/types/other/InteractionLocale.d.ts.map +1 -0
- package/dist/src/types/other/InteractionLocale.js.map +1 -0
- package/dist/src/types/other/Locale.d.ts.map +1 -0
- package/dist/src/types/other/Locale.js.map +1 -0
- package/dist/src/types/other/MessageContextMenu.d.ts.map +1 -0
- package/dist/src/types/other/MessageContextMenu.js.map +1 -0
- package/dist/src/types/other/UserContextMenu.d.ts.map +1 -0
- package/dist/src/types/other/UserContextMenu.js.map +1 -0
- package/dist/src/utils/MemoryStore.d.ts.map +1 -0
- package/dist/src/utils/MemoryStore.js.map +1 -0
- package/dist/src/utils/UtilTypes.d.ts.map +1 -0
- package/dist/src/utils/UtilTypes.js.map +1 -0
- package/dist/src/utils/customId.d.ts.map +1 -0
- package/dist/src/utils/customId.js.map +1 -0
- package/dist/src/utils/permissions.d.ts.map +1 -0
- package/dist/src/utils/permissions.js.map +1 -0
- package/dist/src/utils/recursiveImport.d.ts.map +1 -0
- package/dist/src/utils/recursiveImport.js.map +1 -0
- package/dist/src/utils/recursiveUnload.d.ts.map +1 -0
- package/dist/src/utils/recursiveUnload.js.map +1 -0
- package/dist/src/utils/unloadModule.d.ts.map +1 -0
- package/dist/src/utils/unloadModule.js.map +1 -0
- package/dist/test/index.d.ts +2 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +103 -0
- package/dist/test/index.js.map +1 -0
- package/docs/ADVANCED_FEATURES.md +836 -0
- package/docs/API_REFERENCE.md +925 -0
- package/docs/CHAT_INPUT.md +807 -0
- package/docs/COMPONENTS.md +1035 -0
- package/docs/EVENTS.md +564 -0
- package/docs/GETTING_STARTED.md +394 -0
- package/docs/LOCALIZATION.md +773 -0
- package/docs/README.md +341 -0
- package/docs/SVELTE_COMPONENTS.md +955 -0
- package/generated/globals.d.ts +1 -0
- package/generated/index.d.ts +30 -0
- package/generated/svelte-dbi.d.ts +588 -0
- package/package.json +57 -47
- package/readme.md +168 -491
- package/src/methods/hookInteractionListeners.ts +23 -12
- package/src/types/Components/HTMLComponentsV2/index.ts +353 -12
- package/src/types/Components/HTMLComponentsV2/parser.ts +14 -4
- package/src/types/Components/HTMLComponentsV2/svelteParser.ts +904 -0
- package/src/types/Components/HTMLComponentsV2/svelteRenderer.ts +332 -0
- package/test/index.ts +105 -0
- package/test/product-showcase.svelte +199 -0
- package/tsconfig.json +13 -3
- package/dist/DBI.d.ts.map +0 -1
- package/dist/DBI.js.map +0 -1
- package/dist/Events.d.ts.map +0 -1
- package/dist/Events.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/methods/handleMessageCommands.d.ts.map +0 -1
- package/dist/methods/handleMessageCommands.js.map +0 -1
- package/dist/methods/hookEventListeners.d.ts.map +0 -1
- package/dist/methods/hookEventListeners.js.map +0 -1
- package/dist/methods/hookInteractionListeners.d.ts.map +0 -1
- package/dist/methods/hookInteractionListeners.js.map +0 -1
- package/dist/methods/publishInteractions.d.ts.map +0 -1
- package/dist/methods/publishInteractions.js.map +0 -1
- package/dist/types/ApplicationRoleConnectionMetadata.d.ts.map +0 -1
- package/dist/types/ApplicationRoleConnectionMetadata.js.map +0 -1
- package/dist/types/Builders/ButtonBuilder.d.ts.map +0 -1
- package/dist/types/Builders/ButtonBuilder.js.map +0 -1
- package/dist/types/Builders/ChannelSelectMenuBuilder.d.ts.map +0 -1
- package/dist/types/Builders/ChannelSelectMenuBuilder.js.map +0 -1
- package/dist/types/Builders/MentionableSelectMenuBuilder.d.ts.map +0 -1
- package/dist/types/Builders/MentionableSelectMenuBuilder.js.map +0 -1
- package/dist/types/Builders/ModalBuilder.d.ts.map +0 -1
- package/dist/types/Builders/ModalBuilder.js.map +0 -1
- package/dist/types/Builders/RoleSelectMenuBuilder.d.ts.map +0 -1
- package/dist/types/Builders/RoleSelectMenuBuilder.js.map +0 -1
- package/dist/types/Builders/StringSelectMenuBuilder.d.ts.map +0 -1
- package/dist/types/Builders/StringSelectMenuBuilder.js.map +0 -1
- package/dist/types/Builders/UserSelectMenuBuilder.d.ts.map +0 -1
- package/dist/types/Builders/UserSelectMenuBuilder.js.map +0 -1
- package/dist/types/ChatInput/ChatInput.d.ts.map +0 -1
- package/dist/types/ChatInput/ChatInput.js.map +0 -1
- package/dist/types/ChatInput/ChatInputOptions.d.ts.map +0 -1
- package/dist/types/ChatInput/ChatInputOptions.js.map +0 -1
- package/dist/types/Components/Button.d.ts.map +0 -1
- package/dist/types/Components/Button.js.map +0 -1
- package/dist/types/Components/ChannelSelectMenu.d.ts.map +0 -1
- package/dist/types/Components/ChannelSelectMenu.js.map +0 -1
- package/dist/types/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.d.ts.map +0 -1
- package/dist/types/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.js.map +0 -1
- package/dist/types/Components/HTMLComponentsV2/index.d.ts +0 -19
- package/dist/types/Components/HTMLComponentsV2/index.d.ts.map +0 -1
- package/dist/types/Components/HTMLComponentsV2/index.js +0 -31
- package/dist/types/Components/HTMLComponentsV2/index.js.map +0 -1
- package/dist/types/Components/HTMLComponentsV2/parser.d.ts.map +0 -1
- package/dist/types/Components/HTMLComponentsV2/parser.js.map +0 -1
- package/dist/types/Components/MentionableSelectMenu.d.ts.map +0 -1
- package/dist/types/Components/MentionableSelectMenu.js.map +0 -1
- package/dist/types/Components/Modal.d.ts.map +0 -1
- package/dist/types/Components/Modal.js.map +0 -1
- package/dist/types/Components/RoleSelectMenu.d.ts.map +0 -1
- package/dist/types/Components/RoleSelectMenu.js.map +0 -1
- package/dist/types/Components/StringSelectMenu.d.ts.map +0 -1
- package/dist/types/Components/StringSelectMenu.js.map +0 -1
- package/dist/types/Components/UserSelectMenu.d.ts.map +0 -1
- package/dist/types/Components/UserSelectMenu.js.map +0 -1
- package/dist/types/Event.d.ts.map +0 -1
- package/dist/types/Event.js.map +0 -1
- package/dist/types/Interaction.d.ts.map +0 -1
- package/dist/types/Interaction.js.map +0 -1
- package/dist/types/other/CustomEvent.d.ts.map +0 -1
- package/dist/types/other/CustomEvent.js.map +0 -1
- package/dist/types/other/FakeMessageInteraction.d.ts.map +0 -1
- package/dist/types/other/FakeMessageInteraction.js.map +0 -1
- package/dist/types/other/InteractionLocale.d.ts.map +0 -1
- package/dist/types/other/InteractionLocale.js.map +0 -1
- package/dist/types/other/Locale.d.ts.map +0 -1
- package/dist/types/other/Locale.js.map +0 -1
- package/dist/types/other/MessageContextMenu.d.ts.map +0 -1
- package/dist/types/other/MessageContextMenu.js.map +0 -1
- package/dist/types/other/UserContextMenu.d.ts.map +0 -1
- package/dist/types/other/UserContextMenu.js.map +0 -1
- package/dist/utils/MemoryStore.d.ts.map +0 -1
- package/dist/utils/MemoryStore.js.map +0 -1
- package/dist/utils/UtilTypes.d.ts.map +0 -1
- package/dist/utils/UtilTypes.js.map +0 -1
- package/dist/utils/customId.d.ts.map +0 -1
- package/dist/utils/customId.js.map +0 -1
- package/dist/utils/permissions.d.ts.map +0 -1
- package/dist/utils/permissions.js.map +0 -1
- package/dist/utils/recursiveImport.d.ts.map +0 -1
- package/dist/utils/recursiveImport.js.map +0 -1
- package/dist/utils/recursiveUnload.d.ts.map +0 -1
- package/dist/utils/recursiveUnload.js.map +0 -1
- package/dist/utils/unloadModule.d.ts.map +0 -1
- package/dist/utils/unloadModule.js.map +0 -1
- package/examples/modal/dbi.js +0 -30
- package/examples/modal/login.js +0 -15
- package/examples/modal/package.json +0 -15
- package/examples/modal/publish.js +0 -13
- package/examples/modal/src/chatInput.js +0 -38
- package/examples/modal/src/components.js +0 -33
- package/examples/modal/src/event.js +0 -20
- package/examples/modal/src/interactionlocales.js +0 -24
- package/examples/modal/src/locales.js +0 -38
- package/examples/modal/src/modal.js +0 -28
- /package/dist/{DBI.d.ts → src/DBI.d.ts} +0 -0
- /package/dist/{DBI.js → src/DBI.js} +0 -0
- /package/dist/{Events.d.ts → src/Events.d.ts} +0 -0
- /package/dist/{Events.js → src/Events.js} +0 -0
- /package/dist/{data → src/data}/eventMap.json +0 -0
- /package/dist/{index.d.ts → src/index.d.ts} +0 -0
- /package/dist/{index.js → src/index.js} +0 -0
- /package/dist/{methods → src/methods}/handleMessageCommands.d.ts +0 -0
- /package/dist/{methods → src/methods}/handleMessageCommands.js +0 -0
- /package/dist/{methods → src/methods}/hookEventListeners.d.ts +0 -0
- /package/dist/{methods → src/methods}/hookEventListeners.js +0 -0
- /package/dist/{methods → src/methods}/hookInteractionListeners.d.ts +0 -0
- /package/dist/{methods → src/methods}/publishInteractions.d.ts +0 -0
- /package/dist/{methods → src/methods}/publishInteractions.js +0 -0
- /package/dist/{types → src/types}/ApplicationRoleConnectionMetadata.d.ts +0 -0
- /package/dist/{types → src/types}/ApplicationRoleConnectionMetadata.js +0 -0
- /package/dist/{types → src/types}/Builders/ButtonBuilder.d.ts +0 -0
- /package/dist/{types → src/types}/Builders/ButtonBuilder.js +0 -0
- /package/dist/{types → src/types}/Builders/ChannelSelectMenuBuilder.d.ts +0 -0
- /package/dist/{types → src/types}/Builders/ChannelSelectMenuBuilder.js +0 -0
- /package/dist/{types → src/types}/Builders/MentionableSelectMenuBuilder.d.ts +0 -0
- /package/dist/{types → src/types}/Builders/MentionableSelectMenuBuilder.js +0 -0
- /package/dist/{types → src/types}/Builders/ModalBuilder.d.ts +0 -0
- /package/dist/{types → src/types}/Builders/ModalBuilder.js +0 -0
- /package/dist/{types → src/types}/Builders/RoleSelectMenuBuilder.d.ts +0 -0
- /package/dist/{types → src/types}/Builders/RoleSelectMenuBuilder.js +0 -0
- /package/dist/{types → src/types}/Builders/StringSelectMenuBuilder.d.ts +0 -0
- /package/dist/{types → src/types}/Builders/StringSelectMenuBuilder.js +0 -0
- /package/dist/{types → src/types}/Builders/UserSelectMenuBuilder.d.ts +0 -0
- /package/dist/{types → src/types}/Builders/UserSelectMenuBuilder.js +0 -0
- /package/dist/{types → src/types}/ChatInput/ChatInput.d.ts +0 -0
- /package/dist/{types → src/types}/ChatInput/ChatInput.js +0 -0
- /package/dist/{types → src/types}/ChatInput/ChatInputOptions.js +0 -0
- /package/dist/{types → src/types}/Components/Button.d.ts +0 -0
- /package/dist/{types → src/types}/Components/Button.js +0 -0
- /package/dist/{types → src/types}/Components/ChannelSelectMenu.d.ts +0 -0
- /package/dist/{types → src/types}/Components/ChannelSelectMenu.js +0 -0
- /package/dist/{types → src/types}/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.d.ts +0 -0
- /package/dist/{types → src/types}/Components/HTMLComponentsV2/HTMLComponentsV2Handlers.js +0 -0
- /package/dist/{types → src/types}/Components/HTMLComponentsV2/parser.d.ts +0 -0
- /package/dist/{types → src/types}/Components/MentionableSelectMenu.d.ts +0 -0
- /package/dist/{types → src/types}/Components/MentionableSelectMenu.js +0 -0
- /package/dist/{types → src/types}/Components/Modal.d.ts +0 -0
- /package/dist/{types → src/types}/Components/Modal.js +0 -0
- /package/dist/{types → src/types}/Components/RoleSelectMenu.d.ts +0 -0
- /package/dist/{types → src/types}/Components/RoleSelectMenu.js +0 -0
- /package/dist/{types → src/types}/Components/StringSelectMenu.d.ts +0 -0
- /package/dist/{types → src/types}/Components/StringSelectMenu.js +0 -0
- /package/dist/{types → src/types}/Components/UserSelectMenu.d.ts +0 -0
- /package/dist/{types → src/types}/Components/UserSelectMenu.js +0 -0
- /package/dist/{types → src/types}/Event.d.ts +0 -0
- /package/dist/{types → src/types}/Event.js +0 -0
- /package/dist/{types → src/types}/Interaction.d.ts +0 -0
- /package/dist/{types → src/types}/Interaction.js +0 -0
- /package/dist/{types → src/types}/other/CustomEvent.d.ts +0 -0
- /package/dist/{types → src/types}/other/CustomEvent.js +0 -0
- /package/dist/{types → src/types}/other/FakeMessageInteraction.d.ts +0 -0
- /package/dist/{types → src/types}/other/FakeMessageInteraction.js +0 -0
- /package/dist/{types → src/types}/other/InteractionLocale.d.ts +0 -0
- /package/dist/{types → src/types}/other/InteractionLocale.js +0 -0
- /package/dist/{types → src/types}/other/Locale.d.ts +0 -0
- /package/dist/{types → src/types}/other/Locale.js +0 -0
- /package/dist/{types → src/types}/other/MessageContextMenu.d.ts +0 -0
- /package/dist/{types → src/types}/other/MessageContextMenu.js +0 -0
- /package/dist/{types → src/types}/other/UserContextMenu.d.ts +0 -0
- /package/dist/{types → src/types}/other/UserContextMenu.js +0 -0
- /package/dist/{utils → src/utils}/MemoryStore.d.ts +0 -0
- /package/dist/{utils → src/utils}/MemoryStore.js +0 -0
- /package/dist/{utils → src/utils}/UtilTypes.d.ts +0 -0
- /package/dist/{utils → src/utils}/UtilTypes.js +0 -0
- /package/dist/{utils → src/utils}/customId.d.ts +0 -0
- /package/dist/{utils → src/utils}/customId.js +0 -0
- /package/dist/{utils → src/utils}/permissions.d.ts +0 -0
- /package/dist/{utils → src/utils}/permissions.js +0 -0
- /package/dist/{utils → src/utils}/recursiveImport.d.ts +0 -0
- /package/dist/{utils → src/utils}/recursiveImport.js +0 -0
- /package/dist/{utils → src/utils}/recursiveUnload.d.ts +0 -0
- /package/dist/{utils → src/utils}/recursiveUnload.js +0 -0
- /package/dist/{utils → src/utils}/unloadModule.d.ts +0 -0
- /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
|
-
|
|
241
|
-
dbiInter.handlers
|
|
242
|
-
|
|
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
|
-
...(
|
|
59
|
+
...(argsWithoutOnExecute as any),
|
|
24
60
|
type: "HTMLComponentsV2",
|
|
25
61
|
});
|
|
26
|
-
this.template = args.template || fs.readFileSync(args.file
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
-
|
|
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:
|
|
89
|
-
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
|
-
|
|
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
|
}
|