@mostfeatured/dbi 0.2.29-dev.1 → 0.2.29

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.
@@ -1,156 +1,28 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DBIHTMLComponentsV2 = void 0;
3
+ exports.DBIHTMLComponentsV2 = exports.parseDiscordComponentError = exports.isComponentValidationError = exports.createEnhancedError = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const Interaction_1 = require("../../Interaction");
6
6
  const parser_1 = require("./parser");
7
7
  const svelteRenderer_1 = require("./svelteRenderer");
8
8
  const svelteParser_1 = require("./svelteParser");
9
+ const errorParser_1 = require("./errorParser");
9
10
  const fs_1 = tslib_1.__importDefault(require("fs"));
11
+ // Re-export error parser utilities for external use
12
+ var errorParser_2 = require("./errorParser");
13
+ Object.defineProperty(exports, "createEnhancedError", { enumerable: true, get: function () { return errorParser_2.createEnhancedError; } });
14
+ Object.defineProperty(exports, "isComponentValidationError", { enumerable: true, get: function () { return errorParser_2.isComponentValidationError; } });
15
+ Object.defineProperty(exports, "parseDiscordComponentError", { enumerable: true, get: function () { return errorParser_2.parseDiscordComponentError; } });
10
16
  /**
11
17
  * Parse Discord API error and provide helpful context about which HTML element caused the error
18
+ * Uses the enhanced error parser for detailed, developer-friendly messages
12
19
  */
13
- function parseDiscordAPIError(error, source, componentName) {
14
- // Check if it's a Discord API error with form body issues
15
- const message = error.message || '';
16
- const rawError = error.rawError || error;
17
- // Extract the path from error message like "data.components[0].components[0].accessory.media.url"
18
- const pathMatch = message.match(/data\.components(\[[^\]]+\](?:\.[^\[\s\[]+|\[[^\]]+\])*)/);
19
- if (!pathMatch) {
20
- return error; // Not a parseable Discord API error
20
+ function parseDiscordAPIError(error, source, componentName, components) {
21
+ // Use the new enhanced error parser
22
+ if ((0, errorParser_1.isComponentValidationError)(error)) {
23
+ return (0, errorParser_1.createEnhancedError)(error, components, source, componentName);
21
24
  }
22
- const errorPath = pathMatch[1];
23
- const errorCode = message.match(/\[([A-Z_]+)\]/)?.[1] || 'UNKNOWN';
24
- // Parse the path to understand the component structure
25
- // e.g., "[0].components[0].accessory.media.url" -> component index 0, child 0, accessory.media.url
26
- const parts = errorPath.split(/\.|\[|\]/).filter(Boolean);
27
- // Build a human-readable path description
28
- let description = '';
29
- let elementHint = '';
30
- let currentPath = [];
31
- for (let i = 0; i < parts.length; i++) {
32
- const part = parts[i];
33
- if (!isNaN(Number(part))) {
34
- currentPath.push(`[${part}]`);
35
- }
36
- else {
37
- currentPath.push(part);
38
- // Provide hints based on known Discord component structure
39
- if (part === 'accessory') {
40
- elementHint = '<section> element\'s accessory (thumbnail/button)';
41
- }
42
- else if (part === 'media') {
43
- elementHint = '<thumbnail> or <media-gallery> element';
44
- }
45
- else if (part === 'url') {
46
- elementHint = 'media URL attribute';
47
- }
48
- else if (part === 'components') {
49
- // Skip, it's container
50
- }
51
- else if (part === 'content') {
52
- elementHint = 'text content of a <text-display> element';
53
- }
54
- else if (part === 'label') {
55
- elementHint = 'label attribute of a <button> or <option>';
56
- }
57
- else if (part === 'custom_id') {
58
- elementHint = 'name attribute of an interactive element';
59
- }
60
- else if (part === 'placeholder') {
61
- elementHint = 'placeholder attribute of a select menu';
62
- }
63
- else if (part === 'title') {
64
- elementHint = 'title attribute of a <modal> or <section>';
65
- }
66
- else if (part === 'options') {
67
- elementHint = '<option> elements inside a <string-select>';
68
- }
69
- else if (part === 'value') {
70
- elementHint = 'value attribute of an <option> or <text-input>';
71
- }
72
- else if (part === 'description') {
73
- elementHint = 'description attribute of an <option>';
74
- }
75
- }
76
- }
77
- // Map error codes to helpful messages
78
- const errorMessages = {
79
- 'BASE_TYPE_REQUIRED': 'This field is required but was empty or undefined',
80
- 'STRING_TYPE_REQUIRED': 'This field must be a string',
81
- 'NUMBER_TYPE_REQUIRED': 'This field must be a number',
82
- 'BOOLEAN_TYPE_REQUIRED': 'This field must be a boolean',
83
- 'INVALID_URL': 'The URL provided is not valid',
84
- 'MAX_LENGTH': 'The value exceeds the maximum allowed length',
85
- 'MIN_LENGTH': 'The value is shorter than the minimum required length',
86
- 'CHOICE_NOT_FOUND': 'The selected value is not in the list of options',
87
- };
88
- const errorExplanation = errorMessages[errorCode] || `Error code: ${errorCode}`;
89
- // Build the enhanced error message
90
- let enhancedMessage = `
91
- ╔══════════════════════════════════════════════════════════════╗
92
- ║ Discord API Error - Invalid Component Data ║
93
- ╚══════════════════════════════════════════════════════════════╝
94
-
95
- 📍 Component: ${componentName || 'unknown'}
96
- 📍 Error Path: data.components${errorPath}
97
- 📍 Error Code: ${errorCode}
98
-
99
- ❌ ${errorExplanation}
100
- ${elementHint ? `\n💡 This error is likely in: ${elementHint}` : ''}
101
-
102
- 🔍 What to check:
103
- `;
104
- // Add specific suggestions based on error type
105
- if (errorPath.includes('media.url')) {
106
- enhancedMessage += ` • Make sure the image/media URL is provided and valid
107
- • Check that the data property used for the image exists
108
- • Example: <thumbnail media={product?.image}> - is product.image defined?
109
- `;
110
- }
111
- else if (errorPath.includes('accessory')) {
112
- enhancedMessage += ` • The <section> element requires valid content in its accessory
113
- • If using <thumbnail>, ensure the media URL is valid
114
- `;
115
- }
116
- else if (errorPath.includes('content')) {
117
- enhancedMessage += ` • Text content cannot be empty or undefined
118
- • Check your template expressions like {variable?.property}
119
- `;
120
- }
121
- else if (errorPath.includes('options')) {
122
- enhancedMessage += ` • Select menu options must have valid value and label
123
- • Each <option> needs: value="..." and text content
124
- `;
125
- }
126
- else if (errorPath.includes('label') || errorPath.includes('custom_id')) {
127
- enhancedMessage += ` • Interactive elements (buttons, selects) need valid labels/names
128
- • Check that text content and name attributes are not empty
129
- `;
130
- }
131
- // If we have source, try to highlight relevant section
132
- if (source && elementHint) {
133
- const elementType = elementHint.match(/<(\w+-?\w*)>/)?.[1];
134
- if (elementType) {
135
- const elementRegex = new RegExp(`<${elementType}[^>]*>`, 'g');
136
- const matches = source.match(elementRegex);
137
- if (matches && matches.length > 0) {
138
- enhancedMessage += `\n📝 Found ${matches.length} <${elementType}> element(s) in template:`;
139
- matches.slice(0, 3).forEach((m, i) => {
140
- enhancedMessage += `\n ${i + 1}. ${m.substring(0, 80)}${m.length > 80 ? '...' : ''}`;
141
- });
142
- if (matches.length > 3) {
143
- enhancedMessage += `\n ... and ${matches.length - 3} more`;
144
- }
145
- }
146
- }
147
- }
148
- const enhancedError = new Error(enhancedMessage);
149
- enhancedError.originalError = error;
150
- enhancedError.type = 'discord-api-error';
151
- enhancedError.path = errorPath;
152
- enhancedError.code = errorCode;
153
- return enhancedError;
25
+ return error;
154
26
  }
155
27
  class DBIHTMLComponentsV2 extends Interaction_1.DBIBaseInteraction {
156
28
  template;
@@ -455,7 +327,7 @@ class DBIHTMLComponentsV2 extends Interaction_1.DBIBaseInteraction {
455
327
  // Check if it's a Discord API error and enhance it with helpful context
456
328
  if (error.code || error.rawError || (error.message && error.message.includes('Invalid Form Body'))) {
457
329
  const source = this.file ? fs_1.default.readFileSync(this.file, 'utf-8') : this.template;
458
- throw parseDiscordAPIError(error, source, this.name);
330
+ throw parseDiscordAPIError(error, source, this.name, components);
459
331
  }
460
332
  throw error;
461
333
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/types/Components/HTMLComponentsV2/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { NamespaceEnums } from \"../../../../generated/namespaceData\";\r\nimport { DBI } from \"../../../DBI\";\r\nimport { DBIBaseInteraction, DBIRateLimit, IDBIBaseExecuteCtx, TDBIReferencedData } from \"../../Interaction\";\r\nimport { parseHTMLComponentsV2 } from \"./parser\";\r\nimport { renderSvelteComponent, renderSvelteComponentFromFile, SvelteRenderResult } from \"./svelteRenderer\";\r\nimport { parseSvelteComponent, createHandlerContext, HandlerContextResult } from \"./svelteParser\";\r\nimport fs from \"fs\";\r\n\r\n/**\r\n * Parse Discord API error and provide helpful context about which HTML element caused the error\r\n */\r\nfunction parseDiscordAPIError(error: any, source?: string, componentName?: string): Error {\r\n // Check if it's a Discord API error with form body issues\r\n const message = error.message || '';\r\n const rawError = error.rawError || error;\r\n\r\n // Extract the path from error message like \"data.components[0].components[0].accessory.media.url\"\r\n const pathMatch = message.match(/data\\.components(\\[[^\\]]+\\](?:\\.[^\\[\\s\\[]+|\\[[^\\]]+\\])*)/);\r\n\r\n if (!pathMatch) {\r\n return error; // Not a parseable Discord API error\r\n }\r\n\r\n const errorPath = pathMatch[1];\r\n const errorCode = message.match(/\\[([A-Z_]+)\\]/)?.[1] || 'UNKNOWN';\r\n\r\n // Parse the path to understand the component structure\r\n // e.g., \"[0].components[0].accessory.media.url\" -> component index 0, child 0, accessory.media.url\r\n const parts = errorPath.split(/\\.|\\[|\\]/).filter(Boolean);\r\n\r\n // Build a human-readable path description\r\n let description = '';\r\n let elementHint = '';\r\n let currentPath = [];\r\n\r\n for (let i = 0; i < parts.length; i++) {\r\n const part = parts[i];\r\n if (!isNaN(Number(part))) {\r\n currentPath.push(`[${part}]`);\r\n } else {\r\n currentPath.push(part);\r\n\r\n // Provide hints based on known Discord component structure\r\n if (part === 'accessory') {\r\n elementHint = '<section> element\\'s accessory (thumbnail/button)';\r\n } else if (part === 'media') {\r\n elementHint = '<thumbnail> or <media-gallery> element';\r\n } else if (part === 'url') {\r\n elementHint = 'media URL attribute';\r\n } else if (part === 'components') {\r\n // Skip, it's container\r\n } else if (part === 'content') {\r\n elementHint = 'text content of a <text-display> element';\r\n } else if (part === 'label') {\r\n elementHint = 'label attribute of a <button> or <option>';\r\n } else if (part === 'custom_id') {\r\n elementHint = 'name attribute of an interactive element';\r\n } else if (part === 'placeholder') {\r\n elementHint = 'placeholder attribute of a select menu';\r\n } else if (part === 'title') {\r\n elementHint = 'title attribute of a <modal> or <section>';\r\n } else if (part === 'options') {\r\n elementHint = '<option> elements inside a <string-select>';\r\n } else if (part === 'value') {\r\n elementHint = 'value attribute of an <option> or <text-input>';\r\n } else if (part === 'description') {\r\n elementHint = 'description attribute of an <option>';\r\n }\r\n }\r\n }\r\n\r\n // Map error codes to helpful messages\r\n const errorMessages: Record<string, string> = {\r\n 'BASE_TYPE_REQUIRED': 'This field is required but was empty or undefined',\r\n 'STRING_TYPE_REQUIRED': 'This field must be a string',\r\n 'NUMBER_TYPE_REQUIRED': 'This field must be a number',\r\n 'BOOLEAN_TYPE_REQUIRED': 'This field must be a boolean',\r\n 'INVALID_URL': 'The URL provided is not valid',\r\n 'MAX_LENGTH': 'The value exceeds the maximum allowed length',\r\n 'MIN_LENGTH': 'The value is shorter than the minimum required length',\r\n 'CHOICE_NOT_FOUND': 'The selected value is not in the list of options',\r\n };\r\n\r\n const errorExplanation = errorMessages[errorCode] || `Error code: ${errorCode}`;\r\n\r\n // Build the enhanced error message\r\n let enhancedMessage = `\r\n╔══════════════════════════════════════════════════════════════╗\r\n║ Discord API Error - Invalid Component Data ║\r\n╚══════════════════════════════════════════════════════════════╝\r\n\r\n📍 Component: ${componentName || 'unknown'}\r\n📍 Error Path: data.components${errorPath}\r\n📍 Error Code: ${errorCode}\r\n\r\n❌ ${errorExplanation}\r\n${elementHint ? `\\n💡 This error is likely in: ${elementHint}` : ''}\r\n\r\n🔍 What to check:\r\n`;\r\n\r\n // Add specific suggestions based on error type\r\n if (errorPath.includes('media.url')) {\r\n enhancedMessage += ` • Make sure the image/media URL is provided and valid\r\n • Check that the data property used for the image exists\r\n • Example: <thumbnail media={product?.image}> - is product.image defined?\r\n`;\r\n } else if (errorPath.includes('accessory')) {\r\n enhancedMessage += ` • The <section> element requires valid content in its accessory\r\n • If using <thumbnail>, ensure the media URL is valid\r\n`;\r\n } else if (errorPath.includes('content')) {\r\n enhancedMessage += ` • Text content cannot be empty or undefined\r\n • Check your template expressions like {variable?.property}\r\n`;\r\n } else if (errorPath.includes('options')) {\r\n enhancedMessage += ` • Select menu options must have valid value and label\r\n • Each <option> needs: value=\"...\" and text content\r\n`;\r\n } else if (errorPath.includes('label') || errorPath.includes('custom_id')) {\r\n enhancedMessage += ` • Interactive elements (buttons, selects) need valid labels/names\r\n • Check that text content and name attributes are not empty\r\n`;\r\n }\r\n\r\n // If we have source, try to highlight relevant section\r\n if (source && elementHint) {\r\n const elementType = elementHint.match(/<(\\w+-?\\w*)>/)?.[1];\r\n if (elementType) {\r\n const elementRegex = new RegExp(`<${elementType}[^>]*>`, 'g');\r\n const matches = source.match(elementRegex);\r\n if (matches && matches.length > 0) {\r\n enhancedMessage += `\\n📝 Found ${matches.length} <${elementType}> element(s) in template:`;\r\n matches.slice(0, 3).forEach((m, i) => {\r\n enhancedMessage += `\\n ${i + 1}. ${m.substring(0, 80)}${m.length > 80 ? '...' : ''}`;\r\n });\r\n if (matches.length > 3) {\r\n enhancedMessage += `\\n ... and ${matches.length - 3} more`;\r\n }\r\n }\r\n }\r\n }\r\n\r\n const enhancedError = new Error(enhancedMessage);\r\n (enhancedError as any).originalError = error;\r\n (enhancedError as any).type = 'discord-api-error';\r\n (enhancedError as any).path = errorPath;\r\n (enhancedError as any).code = errorCode;\r\n\r\n return enhancedError;\r\n}\r\n\r\nexport type TDBIHTMLComponentsV2Omitted<TNamespace extends NamespaceEnums> = Omit<DBIHTMLComponentsV2<TNamespace>, \"type\" | \"dbi\" | \"toJSON\" | \"description\" | \"send\" | \"destroy\" | \"destroyAll\" | \"__lastRenderModals__\" | \"_pendingModals\" | \"_initPromise\"> & {\r\n /**\r\n * Use 'svelte' for Svelte 5 components, 'eta' for Eta templates (default)\r\n */\r\n mode?: 'svelte' | 'eta';\r\n /**\r\n * Callback executed when the component interaction is triggered\r\n */\r\n onExecute?: (ctx: IDBIHTMLComponentsV2ExecuteCtx<TNamespace>) => void;\r\n};\r\n\r\nexport type TDBIHTMLComponentsV2ToJSONArgs = {\r\n data?: Record<string, any>;\r\n}\r\n\r\nexport interface TDBIHTMLComponentsV2SendOptions {\r\n data?: Record<string, any>;\r\n flags?: string[];\r\n content?: string;\r\n ephemeral?: boolean;\r\n /** If true, uses interaction.reply(). If false or unset, auto-detects based on target type */\r\n reply?: boolean;\r\n /** If true, uses interaction.followUp() instead of reply() */\r\n followUp?: boolean;\r\n}\r\n\r\n/**\r\n * Result object returned by send() method\r\n * Includes the Discord message and a render() method for manual re-rendering\r\n */\r\nexport interface TDBIHTMLComponentsV2SendResult {\r\n /** The Discord message object returned from send/reply/followUp */\r\n message: any;\r\n /** The data object with reactive state (includes $ref) */\r\n data: Record<string, any>;\r\n /** Manually trigger a re-render of the component */\r\n render: () => Promise<void>;\r\n /** Destroy this component instance (clears intervals, timers, removes ref) */\r\n destroy: () => boolean;\r\n}\r\n\r\nexport interface IDBIHTMLComponentsV2ExecuteCtx<TNamespace extends NamespaceEnums> extends IDBIBaseExecuteCtx<TNamespace> {\r\n data: TDBIReferencedData[];\r\n}\r\n\r\nexport class DBIHTMLComponentsV2<TNamespace extends NamespaceEnums> extends DBIBaseInteraction<TNamespace> {\r\n template?: string;\r\n file?: string;\r\n mode: 'svelte' | 'eta' = 'eta';\r\n private svelteComponentInfo: any = null;\r\n private _userOnExecute?: (ctx: IDBIHTMLComponentsV2ExecuteCtx<TNamespace>) => void;\r\n /** The directory of the source file (used for resolving relative imports) */\r\n private _sourceDir?: string;\r\n\r\n // Store handler contexts per ref for lifecycle management\r\n // Key: ref id, Value: handlerContext with lifecycle hooks\r\n private _activeContexts: Map<string, any> = new Map();\r\n\r\n // Store pending modal promises for await showModal() support\r\n // Key: modal customId, Value: { resolve, reject } functions\r\n _pendingModals: Map<string, { resolve: (result: any) => void; reject: (error: any) => void }> = new Map();\r\n\r\n // Track initialization promise\r\n private _initPromise: Promise<void> | null = null;\r\n\r\n constructor(dbi: DBI<TNamespace>, args: TDBIHTMLComponentsV2Omitted<TNamespace>) {\r\n // Store user's onExecute callback before passing to super\r\n const userOnExecute = (args as any).onExecute;\r\n\r\n // Remove onExecute from args so it doesn't override the class method\r\n const argsWithoutOnExecute = { ...args };\r\n delete (argsWithoutOnExecute as any).onExecute;\r\n\r\n super(dbi, {\r\n ...(argsWithoutOnExecute as any),\r\n type: \"HTMLComponentsV2\",\r\n });\r\n this.template = args.template || (args.file ? fs.readFileSync(args.file, \"utf-8\") : undefined);\r\n this.file = args.file;\r\n this.name = args.name;\r\n this.handlers = args.handlers || [];\r\n this.mode = args.mode || 'eta';\r\n\r\n // Store source directory for resolving relative imports in Svelte components\r\n if (this.file) {\r\n const path = require(\"path\");\r\n this._sourceDir = path.dirname(path.resolve(this.file));\r\n }\r\n\r\n // Store user's onExecute callback if provided\r\n if (userOnExecute) {\r\n this._userOnExecute = userOnExecute;\r\n }\r\n\r\n // Pre-extract Svelte handlers at registration time (lazy loaded)\r\n if (this.mode === 'svelte' && this.template) {\r\n // Store the promise so we can await it in _handleExecute\r\n this._initPromise = this._initSvelteComponent();\r\n }\r\n\r\n // Re-assign onExecute method after super() call because parent class sets it to undefined\r\n this.onExecute = this._handleExecute.bind(this);\r\n }\r\n\r\n private async _initSvelteComponent() {\r\n if (this.template && !this.svelteComponentInfo) {\r\n this.svelteComponentInfo = await parseSvelteComponent(this.template);\r\n }\r\n }\r\n\r\n private async _handleExecute(ctx: IDBIHTMLComponentsV2ExecuteCtx<TNamespace>) {\r\n // Wait for Svelte component initialization if not yet completed\r\n if (this._initPromise) {\r\n await this._initPromise;\r\n }\r\n\r\n // Call user's onExecute callback first if provided\r\n if (this._userOnExecute) {\r\n this._userOnExecute(ctx);\r\n }\r\n\r\n // If using Svelte mode, find and execute the handler\r\n if (this.mode === 'svelte' && this.svelteComponentInfo) {\r\n const [elementName, ...handlerData] = ctx.data;\r\n\r\n if (typeof elementName === 'string') {\r\n // Check if this is a modal submit (elementName is the modal id)\r\n const modalHandlerInfo = this.svelteComponentInfo.modalHandlers.get(elementName);\r\n\r\n if (modalHandlerInfo) {\r\n // This is a modal submit - execute the onsubmit handler (or just resolve promise if no handler)\r\n this._executeModalSubmit(ctx, elementName, modalHandlerInfo.onsubmitHandler, handlerData);\r\n return;\r\n }\r\n\r\n // Find the handler info for this element (button, select, etc.)\r\n const handlerInfo = this.svelteComponentInfo.handlers.get(elementName);\r\n\r\n if (handlerInfo) {\r\n this._executeElementHandler(ctx, handlerInfo, handlerData);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Execute a modal submit handler\r\n */\r\n private _executeModalSubmit(\r\n ctx: IDBIHTMLComponentsV2ExecuteCtx<TNamespace>,\r\n modalId: string,\r\n handlerName: string | undefined,\r\n handlerData: any[]\r\n ) {\r\n // Extract current state from handlerData (refs that were passed)\r\n const currentState = handlerData[0] || {} as Record<string, any>;\r\n\r\n // Get ref id for lifecycle tracking (if available)\r\n const refId = (currentState as any)?.$ref || null;\r\n\r\n // Extract all field values from modal interaction (text inputs, selects, file uploads, etc.)\r\n const modalInteraction = ctx.interaction as any;\r\n const fields = this._extractModalFields(modalInteraction);\r\n\r\n // Check if there's a pending promise for this modal (from await showModal())\r\n // Use the modal's customId to find the pending promise\r\n const pendingKey = modalInteraction.customId;\r\n const pendingModal = this._pendingModals.get(pendingKey);\r\n\r\n if (pendingModal) {\r\n // Resolve the promise with fields and interaction\r\n pendingModal.resolve({\r\n fields,\r\n interaction: modalInteraction,\r\n ctx: ctx\r\n });\r\n this._pendingModals.delete(pendingKey);\r\n }\r\n\r\n // If no onsubmit handler defined, just return (promise-based usage)\r\n if (!handlerName) {\r\n return;\r\n }\r\n\r\n // Create handler context for modal submit\r\n const handlerContext = createHandlerContext(\r\n this.svelteComponentInfo!.scriptContent,\r\n typeof currentState === 'object' ? currentState : {},\r\n this,\r\n ctx,\r\n this._sourceDir,\r\n this.svelteComponentInfo!.inlineHandlers\r\n );\r\n\r\n const handlerFn = handlerContext.handlers[handlerName];\r\n\r\n if (handlerFn && typeof handlerFn === 'function') {\r\n try {\r\n // Store context for lifecycle management\r\n if (refId) {\r\n const existingContext = this._activeContexts.get(refId);\r\n if (existingContext && existingContext.destroyCallbacks) {\r\n handlerContext.destroyCallbacks.push(...existingContext.destroyCallbacks);\r\n }\r\n this._activeContexts.set(refId, handlerContext);\r\n }\r\n\r\n handlerContext.setInHandler(true);\r\n\r\n try {\r\n // Call handler with ctx and fields object\r\n handlerFn.call(this, handlerContext.wrappedCtx, fields, ...handlerData.slice(1));\r\n } finally {\r\n handlerContext.setInHandler(false);\r\n }\r\n\r\n handlerContext.runEffects();\r\n\r\n if (handlerContext.hasPendingRender()) {\r\n handlerContext.flushRender();\r\n }\r\n } catch (error) {\r\n // Re-throw the error so it's visible to the developer\r\n console.error(`[DBI-Svelte] Modal handler \"${handlerName}\" failed:`, error);\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Execute an element handler (button, select, etc.)\r\n */\r\n private _executeElementHandler(\r\n ctx: IDBIHTMLComponentsV2ExecuteCtx<TNamespace>,\r\n handlerInfo: any,\r\n handlerData: any[]\r\n ) {\r\n // Extract current state from handlerData (refs that were passed)\r\n // The second element in data array contains the current state\r\n const currentState = handlerData[0] || {} as Record<string, any>;\r\n\r\n // Get ref id for lifecycle tracking (if available)\r\n const refId = (currentState as any)?.$ref || null;\r\n\r\n // Check if this is first execution for this ref\r\n const isFirstExecution = refId && !this._activeContexts.has(refId);\r\n\r\n // Get existing context if any (to preserve lifecycle callbacks like intervals)\r\n const existingContext = refId ? this._activeContexts.get(refId) : null;\r\n\r\n // Create a NEW handler context for each execution with the current state\r\n // This ensures each interaction has its own isolated state\r\n // Pass 'this' so handlers can access component methods like toJSON()\r\n // Pass ctx so handlers can access ctx.interaction, ctx.data, ctx.locale, etc.\r\n const handlerContext = createHandlerContext(\r\n this.svelteComponentInfo!.scriptContent,\r\n typeof currentState === 'object' ? currentState : {},\r\n this,\r\n ctx,\r\n this._sourceDir,\r\n this.svelteComponentInfo!.inlineHandlers\r\n );\r\n\r\n const handlerFn = handlerContext.handlers[handlerInfo.handlerName];\r\n\r\n if (handlerFn && typeof handlerFn === 'function') {\r\n try {\r\n // Store context for lifecycle management\r\n if (refId) {\r\n // If there's an existing context, transfer its destroy callbacks to the new context\r\n // This preserves intervals/timers created in onMount\r\n if (existingContext && existingContext.destroyCallbacks) {\r\n // Merge existing destroy callbacks (don't run them!)\r\n handlerContext.destroyCallbacks.push(...existingContext.destroyCallbacks);\r\n }\r\n\r\n this._activeContexts.set(refId, handlerContext);\r\n\r\n // Wrap $unRef to call onDestroy when ref is deleted (only wrap once)\r\n const stateObj = currentState as any;\r\n if (stateObj.$unRef && !stateObj.__unRefWrapped__) {\r\n const originalUnRef = stateObj.$unRef.bind(stateObj);\r\n stateObj.$unRef = () => {\r\n // Run destroy callbacks before unref\r\n const ctx = this._activeContexts.get(refId);\r\n if (ctx && ctx.runDestroy) {\r\n ctx.runDestroy();\r\n }\r\n this._activeContexts.delete(refId);\r\n return originalUnRef();\r\n };\r\n stateObj.__unRefWrapped__ = true;\r\n }\r\n }\r\n\r\n // Run onMount callbacks only on first execution\r\n if (isFirstExecution && handlerContext.runMount) {\r\n handlerContext.runMount();\r\n }\r\n\r\n // Mark that we're inside handler execution (prevents auto-render during handler)\r\n handlerContext.setInHandler(true);\r\n\r\n try {\r\n // Bind 'this' to the DBIHTMLComponentsV2 instance so handlers can use this.toJSON()\r\n // Pass wrappedCtx so handlers use the proxy-wrapped ctx that tracks interaction calls\r\n // This ensures __asyncInteractionCalled__ flag is set when handler calls ctx.interaction.reply() etc.\r\n handlerFn.call(this, handlerContext.wrappedCtx, ...handlerData.slice(1));\r\n } finally {\r\n // Always reset handler execution flag\r\n handlerContext.setInHandler(false);\r\n }\r\n\r\n // Run effects after handler execution (state may have changed)\r\n handlerContext.runEffects();\r\n\r\n // If there are pending data changes and no interaction method was called,\r\n // flush the render now (synchronously uses interaction.update)\r\n if (handlerContext.hasPendingRender()) {\r\n handlerContext.flushRender();\r\n }\r\n } catch (error) {\r\n // Re-throw the error so it's visible to the developer\r\n console.error(`[DBI-Svelte] Handler \"${handlerInfo.handlerName}\" failed:`, error);\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n // Store last render's modals for showModal() to access\r\n // Note: Used internally by handler context, not truly private\r\n __lastRenderModals__: Map<string, any> | null = null;\r\n\r\n override async toJSON(arg: TDBIHTMLComponentsV2ToJSONArgs = {}): Promise<any> {\r\n if (this.mode === 'svelte' && this.template) {\r\n // Render Svelte component\r\n const result = await renderSvelteComponent(\r\n this.dbi as any,\r\n this.template,\r\n this.name,\r\n {\r\n data: arg.data,\r\n ttl: this.ttl\r\n }\r\n );\r\n\r\n // Store modals for showModal() to access\r\n this.__lastRenderModals__ = result.modals;\r\n\r\n return result.components;\r\n } else {\r\n // Use Eta template parsing (default)\r\n return parseHTMLComponentsV2(\r\n this.dbi as any,\r\n this.template!,\r\n this.name,\r\n {\r\n data: arg.data,\r\n ttl: this.ttl\r\n }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Send the component to an interaction or channel and initialize lifecycle hooks (onMount)\r\n * This is the recommended way to send Svelte components with intervals/timers\r\n * \r\n * @param target - Discord interaction or channel to send to\r\n * @param options - Send options including data, flags, content\r\n * \r\n * @example\r\n * ```ts\r\n * const showcase = dbi.interaction(\"product-showcase\");\r\n * \r\n * // Send as interaction reply\r\n * await showcase.send(interaction, { data: { count: 0 } });\r\n * \r\n * // Send to a channel directly\r\n * const result = await showcase.send(channel, { data: { count: 0 } });\r\n * \r\n * // Send as followUp (if already replied)\r\n * const result = await showcase.send(interaction, { data: { count: 0 }, followUp: true });\r\n * \r\n * // Manual re-render from outside\r\n * await result.render();\r\n * ```\r\n */\r\n async send(target: any, options: TDBIHTMLComponentsV2SendOptions = {}): Promise<TDBIHTMLComponentsV2SendResult> {\r\n // Wait for Svelte component initialization if not yet completed\r\n if (this._initPromise) {\r\n await this._initPromise;\r\n }\r\n\r\n const { data = {}, flags = [\"IsComponentsV2\"], content, ephemeral, reply, followUp } = options;\r\n\r\n // Render components (toJSON is async) - this also creates $ref in data if not present\r\n const components = await this.toJSON({ data });\r\n\r\n // Build message options\r\n const messageOptions: any = { components, flags };\r\n if (content) messageOptions.content = content;\r\n if (ephemeral) messageOptions.flags = [...flags, \"Ephemeral\"];\r\n\r\n // Detect target type and send accordingly\r\n let message: any;\r\n const isInteraction = target.reply && target.user; // Interactions have both reply method and user property\r\n const isChannel = target.send && !target.user; // Channels have send but no user\r\n\r\n try {\r\n if (isInteraction) {\r\n if (followUp) {\r\n message = await target.followUp(messageOptions);\r\n } else {\r\n message = await target.reply(messageOptions);\r\n }\r\n } else if (isChannel) {\r\n message = await target.send(messageOptions);\r\n } else {\r\n throw new Error(\"Invalid target: must be an interaction or channel\");\r\n }\r\n } catch (error: any) {\r\n // Check if it's a Discord API error and enhance it with helpful context\r\n if (error.code || error.rawError || (error.message && error.message.includes('Invalid Form Body'))) {\r\n const source = this.file ? fs.readFileSync(this.file, 'utf-8') : this.template;\r\n throw parseDiscordAPIError(error, source, this.name);\r\n }\r\n throw error;\r\n }\r\n\r\n // If Svelte mode, create initial handler context and run onMount\r\n // After toJSON, data.$ref is guaranteed to exist (created in renderSvelteComponent)\r\n if (this.mode === 'svelte' && this.svelteComponentInfo && data.$ref) {\r\n const refId = data.$ref;\r\n\r\n // Create handler context with a fake ctx that has the message\r\n const fakeCtx = {\r\n interaction: {\r\n replied: true,\r\n deferred: false,\r\n message: message,\r\n }\r\n };\r\n\r\n const handlerContext = createHandlerContext(\r\n this.svelteComponentInfo.scriptContent,\r\n data,\r\n this,\r\n fakeCtx,\r\n this._sourceDir,\r\n this.svelteComponentInfo.inlineHandlers\r\n );\r\n\r\n // Store the context for lifecycle management\r\n this._activeContexts.set(refId, handlerContext);\r\n\r\n // Wrap $unRef to call onDestroy when ref is deleted\r\n if (data.$unRef) {\r\n const originalUnRef = data.$unRef.bind(data);\r\n data.$unRef = () => {\r\n if (handlerContext.runDestroy) {\r\n handlerContext.runDestroy();\r\n }\r\n this._activeContexts.delete(refId);\r\n return originalUnRef();\r\n };\r\n }\r\n\r\n // Run onMount callbacks\r\n handlerContext.runMount();\r\n\r\n // Run initial effects\r\n handlerContext.runEffects();\r\n\r\n // Return result object with render() method for manual re-rendering\r\n const component = this;\r\n return {\r\n message,\r\n data,\r\n render: async () => {\r\n // Run pre-render callbacks (async)\r\n await handlerContext.runPreRender();\r\n\r\n // Re-render the component\r\n const components = await component.toJSON({ data });\r\n await message.edit({\r\n components,\r\n flags: [\"IsComponentsV2\"],\r\n });\r\n\r\n // Run after-render callbacks\r\n handlerContext.runAfterRender();\r\n },\r\n destroy: () => component.destroy(data)\r\n } as TDBIHTMLComponentsV2SendResult;\r\n }\r\n\r\n // For non-Svelte mode, return simple result object\r\n return {\r\n message,\r\n data,\r\n render: async () => {\r\n const components = await this.toJSON({ data });\r\n await message.edit({\r\n components,\r\n flags: [\"IsComponentsV2\"],\r\n });\r\n },\r\n destroy: () => this.destroy(data)\r\n } as TDBIHTMLComponentsV2SendResult;\r\n }\r\n\r\n /**\r\n * Destroy a component instance by ref ID or data object\r\n * This runs onDestroy callbacks (clears intervals/timers) and removes the ref\r\n * \r\n * @param refOrData - Either a ref ID string or the data object with $ref\r\n * @returns true if destroyed, false if not found\r\n * \r\n * @example\r\n * ```ts\r\n * // Destroy by data object\r\n * showcase.destroy(data);\r\n * \r\n * // Destroy by ref ID\r\n * showcase.destroy(data.$ref);\r\n * \r\n * // Destroy all active instances of this component\r\n * showcase.destroyAll();\r\n * ```\r\n */\r\n destroy(refOrData: string | Record<string, any>): boolean {\r\n const refId = typeof refOrData === 'string' ? refOrData : refOrData?.$ref;\r\n\r\n if (!refId) {\r\n return false;\r\n }\r\n\r\n const context = this._activeContexts.get(refId);\r\n if (context) {\r\n // Run destroy callbacks (clears intervals, timers, etc.)\r\n if (context.runDestroy) {\r\n context.runDestroy();\r\n }\r\n this._activeContexts.delete(refId);\r\n }\r\n\r\n // Also delete from DBI refs store\r\n this.dbi.data.refs.delete(refId);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Extract all field values from a modal interaction\r\n * Supports text inputs, select menus (string, user, role, mentionable, channel), and file uploads\r\n * \r\n * Returns an object where keys are the custom_id of each component and values are:\r\n * - For text inputs: string value\r\n * - For string selects: string[] of selected values\r\n * - For user selects: string[] of user IDs\r\n * - For role selects: string[] of role IDs\r\n * - For mentionable selects: { users: string[], roles: string[] }\r\n * - For channel selects: string[] of channel IDs\r\n * - For file uploads: attachment objects array\r\n */\r\n private _extractModalFields(modalInteraction: any): Record<string, any> {\r\n const fields: Record<string, any> = {};\r\n\r\n // Handle classic text input fields via ModalSubmitFields\r\n if (modalInteraction.fields && modalInteraction.fields.fields) {\r\n for (const [customId, field] of modalInteraction.fields.fields) {\r\n // Text input - field.value is the string\r\n // For select menus, value might be an array\r\n fields[customId] = field.values || field.value;\r\n }\r\n }\r\n\r\n // Handle new modal components from interaction.data.components\r\n // The new modal structure uses Label wrappers with nested components\r\n const data = modalInteraction.data || (modalInteraction as any).data;\r\n if (data && data.components) {\r\n this._extractFieldsFromComponents(data.components, fields);\r\n }\r\n\r\n // Also check for components directly on the interaction (some Discord.js versions)\r\n if (modalInteraction.components && Array.isArray(modalInteraction.components)) {\r\n this._extractFieldsFromInteractionComponents(modalInteraction.components, fields);\r\n }\r\n\r\n return fields;\r\n }\r\n\r\n /**\r\n * Extract fields from Discord.js style interaction components (ActionRow objects)\r\n */\r\n private _extractFieldsFromInteractionComponents(components: any[], fields: Record<string, any>) {\r\n for (const row of components) {\r\n // ActionRow has components property\r\n const rowComponents = row.components || [];\r\n for (const component of rowComponents) {\r\n const customId = component.customId || component.custom_id || component.id;\r\n if (!customId) continue;\r\n\r\n // Check component type\r\n const type = component.type;\r\n\r\n // Text Input (type 4)\r\n if (type === 4 || component.value !== undefined) {\r\n fields[customId] = component.value || '';\r\n }\r\n\r\n // Select menus (types 3, 5, 6, 7, 8) - check for values array\r\n if (component.values !== undefined) {\r\n fields[customId] = component.values;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Recursively extract field values from component structure\r\n */\r\n private _extractFieldsFromComponents(components: any[], fields: Record<string, any>) {\r\n for (const component of components) {\r\n const type = component.type;\r\n // Support both custom_id and id for backward compatibility\r\n const customId = component.custom_id || component.id;\r\n\r\n // Type 18 = Label/Field - can have nested component or components\r\n if (type === 18) {\r\n if (component.component) {\r\n this._extractFieldsFromComponents([component.component], fields);\r\n }\r\n if (component.components) {\r\n this._extractFieldsFromComponents(component.components, fields);\r\n }\r\n continue;\r\n }\r\n\r\n // Type 1 = Action Row - has nested components array\r\n if (type === 1 && component.components) {\r\n this._extractFieldsFromComponents(component.components, fields);\r\n continue;\r\n }\r\n\r\n if (!customId) continue;\r\n\r\n switch (type) {\r\n case 4: // Text Input\r\n fields[customId] = component.value || '';\r\n break;\r\n\r\n case 3: // String Select\r\n fields[customId] = component.values || [];\r\n break;\r\n\r\n case 5: // User Select\r\n fields[customId] = component.values || [];\r\n break;\r\n\r\n case 6: // Role Select\r\n fields[customId] = component.values || [];\r\n break;\r\n\r\n case 7: // Mentionable Select - can have both users and roles\r\n // Discord returns resolved data for mentionables\r\n fields[customId] = {\r\n values: component.values || [],\r\n users: component.resolved?.users ? Object.keys(component.resolved.users) : [],\r\n roles: component.resolved?.roles ? Object.keys(component.resolved.roles) : []\r\n };\r\n break;\r\n\r\n case 8: // Channel Select\r\n fields[customId] = component.values || [];\r\n break;\r\n\r\n case 19: // File Upload\r\n // File uploads come through as attachments\r\n fields[customId] = component.attachments || [];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Destroy all active instances of this component\r\n * Useful for cleanup when the bot shuts down or component is unloaded\r\n * \r\n * @returns Number of instances destroyed\r\n */\r\n destroyAll(): number {\r\n let count = 0;\r\n for (const [refId, context] of this._activeContexts) {\r\n if (context.runDestroy) {\r\n context.runDestroy();\r\n }\r\n this.dbi.data.refs.delete(refId);\r\n count++;\r\n }\r\n this._activeContexts.clear();\r\n return count;\r\n }\r\n\r\n handlers?: any[] = [];\r\n}"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/types/Components/HTMLComponentsV2/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { NamespaceEnums } from \"../../../../generated/namespaceData\";\r\nimport { DBI } from \"../../../DBI\";\r\nimport { DBIBaseInteraction, DBIRateLimit, IDBIBaseExecuteCtx, TDBIReferencedData } from \"../../Interaction\";\r\nimport { parseHTMLComponentsV2 } from \"./parser\";\r\nimport { renderSvelteComponent, renderSvelteComponentFromFile, SvelteRenderResult } from \"./svelteRenderer\";\r\nimport { parseSvelteComponent, createHandlerContext, HandlerContextResult } from \"./svelteParser\";\r\nimport { createEnhancedError, isComponentValidationError, parseDiscordComponentError, ComponentErrorInfo, ParsedDiscordError } from \"./errorParser\";\r\nimport fs from \"fs\";\r\n\r\n// Re-export error parser utilities for external use\r\nexport { createEnhancedError, isComponentValidationError, parseDiscordComponentError, ComponentErrorInfo, ParsedDiscordError } from \"./errorParser\";\r\n\r\n/**\r\n * Parse Discord API error and provide helpful context about which HTML element caused the error\r\n * Uses the enhanced error parser for detailed, developer-friendly messages\r\n */\r\nfunction parseDiscordAPIError(error: any, source?: string, componentName?: string, components?: any[]): Error {\r\n // Use the new enhanced error parser\r\n if (isComponentValidationError(error)) {\r\n return createEnhancedError(error, components, source, componentName);\r\n }\r\n return error;\r\n}\r\n\r\nexport type TDBIHTMLComponentsV2Omitted<TNamespace extends NamespaceEnums> = Omit<DBIHTMLComponentsV2<TNamespace>, \"type\" | \"dbi\" | \"toJSON\" | \"description\" | \"send\" | \"destroy\" | \"destroyAll\" | \"__lastRenderModals__\" | \"_pendingModals\" | \"_initPromise\"> & {\r\n /**\r\n * Use 'svelte' for Svelte 5 components, 'eta' for Eta templates (default)\r\n */\r\n mode?: 'svelte' | 'eta';\r\n /**\r\n * Callback executed when the component interaction is triggered\r\n */\r\n onExecute?: (ctx: IDBIHTMLComponentsV2ExecuteCtx<TNamespace>) => void;\r\n};\r\n\r\nexport type TDBIHTMLComponentsV2ToJSONArgs = {\r\n data?: Record<string, any>;\r\n}\r\n\r\nexport interface TDBIHTMLComponentsV2SendOptions {\r\n data?: Record<string, any>;\r\n flags?: string[];\r\n content?: string;\r\n ephemeral?: boolean;\r\n /** If true, uses interaction.reply(). If false or unset, auto-detects based on target type */\r\n reply?: boolean;\r\n /** If true, uses interaction.followUp() instead of reply() */\r\n followUp?: boolean;\r\n}\r\n\r\n/**\r\n * Result object returned by send() method\r\n * Includes the Discord message and a render() method for manual re-rendering\r\n */\r\nexport interface TDBIHTMLComponentsV2SendResult {\r\n /** The Discord message object returned from send/reply/followUp */\r\n message: any;\r\n /** The data object with reactive state (includes $ref) */\r\n data: Record<string, any>;\r\n /** Manually trigger a re-render of the component */\r\n render: () => Promise<void>;\r\n /** Destroy this component instance (clears intervals, timers, removes ref) */\r\n destroy: () => boolean;\r\n}\r\n\r\nexport interface IDBIHTMLComponentsV2ExecuteCtx<TNamespace extends NamespaceEnums> extends IDBIBaseExecuteCtx<TNamespace> {\r\n data: TDBIReferencedData[];\r\n}\r\n\r\nexport class DBIHTMLComponentsV2<TNamespace extends NamespaceEnums> extends DBIBaseInteraction<TNamespace> {\r\n template?: string;\r\n file?: string;\r\n mode: 'svelte' | 'eta' = 'eta';\r\n private svelteComponentInfo: any = null;\r\n private _userOnExecute?: (ctx: IDBIHTMLComponentsV2ExecuteCtx<TNamespace>) => void;\r\n /** The directory of the source file (used for resolving relative imports) */\r\n private _sourceDir?: string;\r\n\r\n // Store handler contexts per ref for lifecycle management\r\n // Key: ref id, Value: handlerContext with lifecycle hooks\r\n private _activeContexts: Map<string, any> = new Map();\r\n\r\n // Store pending modal promises for await showModal() support\r\n // Key: modal customId, Value: { resolve, reject } functions\r\n _pendingModals: Map<string, { resolve: (result: any) => void; reject: (error: any) => void }> = new Map();\r\n\r\n // Track initialization promise\r\n private _initPromise: Promise<void> | null = null;\r\n\r\n constructor(dbi: DBI<TNamespace>, args: TDBIHTMLComponentsV2Omitted<TNamespace>) {\r\n // Store user's onExecute callback before passing to super\r\n const userOnExecute = (args as any).onExecute;\r\n\r\n // Remove onExecute from args so it doesn't override the class method\r\n const argsWithoutOnExecute = { ...args };\r\n delete (argsWithoutOnExecute as any).onExecute;\r\n\r\n super(dbi, {\r\n ...(argsWithoutOnExecute as any),\r\n type: \"HTMLComponentsV2\",\r\n });\r\n this.template = args.template || (args.file ? fs.readFileSync(args.file, \"utf-8\") : undefined);\r\n this.file = args.file;\r\n this.name = args.name;\r\n this.handlers = args.handlers || [];\r\n this.mode = args.mode || 'eta';\r\n\r\n // Store source directory for resolving relative imports in Svelte components\r\n if (this.file) {\r\n const path = require(\"path\");\r\n this._sourceDir = path.dirname(path.resolve(this.file));\r\n }\r\n\r\n // Store user's onExecute callback if provided\r\n if (userOnExecute) {\r\n this._userOnExecute = userOnExecute;\r\n }\r\n\r\n // Pre-extract Svelte handlers at registration time (lazy loaded)\r\n if (this.mode === 'svelte' && this.template) {\r\n // Store the promise so we can await it in _handleExecute\r\n this._initPromise = this._initSvelteComponent();\r\n }\r\n\r\n // Re-assign onExecute method after super() call because parent class sets it to undefined\r\n this.onExecute = this._handleExecute.bind(this);\r\n }\r\n\r\n private async _initSvelteComponent() {\r\n if (this.template && !this.svelteComponentInfo) {\r\n this.svelteComponentInfo = await parseSvelteComponent(this.template);\r\n }\r\n }\r\n\r\n private async _handleExecute(ctx: IDBIHTMLComponentsV2ExecuteCtx<TNamespace>) {\r\n // Wait for Svelte component initialization if not yet completed\r\n if (this._initPromise) {\r\n await this._initPromise;\r\n }\r\n\r\n // Call user's onExecute callback first if provided\r\n if (this._userOnExecute) {\r\n this._userOnExecute(ctx);\r\n }\r\n\r\n // If using Svelte mode, find and execute the handler\r\n if (this.mode === 'svelte' && this.svelteComponentInfo) {\r\n const [elementName, ...handlerData] = ctx.data;\r\n\r\n if (typeof elementName === 'string') {\r\n // Check if this is a modal submit (elementName is the modal id)\r\n const modalHandlerInfo = this.svelteComponentInfo.modalHandlers.get(elementName);\r\n\r\n if (modalHandlerInfo) {\r\n // This is a modal submit - execute the onsubmit handler (or just resolve promise if no handler)\r\n this._executeModalSubmit(ctx, elementName, modalHandlerInfo.onsubmitHandler, handlerData);\r\n return;\r\n }\r\n\r\n // Find the handler info for this element (button, select, etc.)\r\n const handlerInfo = this.svelteComponentInfo.handlers.get(elementName);\r\n\r\n if (handlerInfo) {\r\n this._executeElementHandler(ctx, handlerInfo, handlerData);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Execute a modal submit handler\r\n */\r\n private _executeModalSubmit(\r\n ctx: IDBIHTMLComponentsV2ExecuteCtx<TNamespace>,\r\n modalId: string,\r\n handlerName: string | undefined,\r\n handlerData: any[]\r\n ) {\r\n // Extract current state from handlerData (refs that were passed)\r\n const currentState = handlerData[0] || {} as Record<string, any>;\r\n\r\n // Get ref id for lifecycle tracking (if available)\r\n const refId = (currentState as any)?.$ref || null;\r\n\r\n // Extract all field values from modal interaction (text inputs, selects, file uploads, etc.)\r\n const modalInteraction = ctx.interaction as any;\r\n const fields = this._extractModalFields(modalInteraction);\r\n\r\n // Check if there's a pending promise for this modal (from await showModal())\r\n // Use the modal's customId to find the pending promise\r\n const pendingKey = modalInteraction.customId;\r\n const pendingModal = this._pendingModals.get(pendingKey);\r\n\r\n if (pendingModal) {\r\n // Resolve the promise with fields and interaction\r\n pendingModal.resolve({\r\n fields,\r\n interaction: modalInteraction,\r\n ctx: ctx\r\n });\r\n this._pendingModals.delete(pendingKey);\r\n }\r\n\r\n // If no onsubmit handler defined, just return (promise-based usage)\r\n if (!handlerName) {\r\n return;\r\n }\r\n\r\n // Create handler context for modal submit\r\n const handlerContext = createHandlerContext(\r\n this.svelteComponentInfo!.scriptContent,\r\n typeof currentState === 'object' ? currentState : {},\r\n this,\r\n ctx,\r\n this._sourceDir,\r\n this.svelteComponentInfo!.inlineHandlers\r\n );\r\n\r\n const handlerFn = handlerContext.handlers[handlerName];\r\n\r\n if (handlerFn && typeof handlerFn === 'function') {\r\n try {\r\n // Store context for lifecycle management\r\n if (refId) {\r\n const existingContext = this._activeContexts.get(refId);\r\n if (existingContext && existingContext.destroyCallbacks) {\r\n handlerContext.destroyCallbacks.push(...existingContext.destroyCallbacks);\r\n }\r\n this._activeContexts.set(refId, handlerContext);\r\n }\r\n\r\n handlerContext.setInHandler(true);\r\n\r\n try {\r\n // Call handler with ctx and fields object\r\n handlerFn.call(this, handlerContext.wrappedCtx, fields, ...handlerData.slice(1));\r\n } finally {\r\n handlerContext.setInHandler(false);\r\n }\r\n\r\n handlerContext.runEffects();\r\n\r\n if (handlerContext.hasPendingRender()) {\r\n handlerContext.flushRender();\r\n }\r\n } catch (error) {\r\n // Re-throw the error so it's visible to the developer\r\n console.error(`[DBI-Svelte] Modal handler \"${handlerName}\" failed:`, error);\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Execute an element handler (button, select, etc.)\r\n */\r\n private _executeElementHandler(\r\n ctx: IDBIHTMLComponentsV2ExecuteCtx<TNamespace>,\r\n handlerInfo: any,\r\n handlerData: any[]\r\n ) {\r\n // Extract current state from handlerData (refs that were passed)\r\n // The second element in data array contains the current state\r\n const currentState = handlerData[0] || {} as Record<string, any>;\r\n\r\n // Get ref id for lifecycle tracking (if available)\r\n const refId = (currentState as any)?.$ref || null;\r\n\r\n // Check if this is first execution for this ref\r\n const isFirstExecution = refId && !this._activeContexts.has(refId);\r\n\r\n // Get existing context if any (to preserve lifecycle callbacks like intervals)\r\n const existingContext = refId ? this._activeContexts.get(refId) : null;\r\n\r\n // Create a NEW handler context for each execution with the current state\r\n // This ensures each interaction has its own isolated state\r\n // Pass 'this' so handlers can access component methods like toJSON()\r\n // Pass ctx so handlers can access ctx.interaction, ctx.data, ctx.locale, etc.\r\n const handlerContext = createHandlerContext(\r\n this.svelteComponentInfo!.scriptContent,\r\n typeof currentState === 'object' ? currentState : {},\r\n this,\r\n ctx,\r\n this._sourceDir,\r\n this.svelteComponentInfo!.inlineHandlers\r\n );\r\n\r\n const handlerFn = handlerContext.handlers[handlerInfo.handlerName];\r\n\r\n if (handlerFn && typeof handlerFn === 'function') {\r\n try {\r\n // Store context for lifecycle management\r\n if (refId) {\r\n // If there's an existing context, transfer its destroy callbacks to the new context\r\n // This preserves intervals/timers created in onMount\r\n if (existingContext && existingContext.destroyCallbacks) {\r\n // Merge existing destroy callbacks (don't run them!)\r\n handlerContext.destroyCallbacks.push(...existingContext.destroyCallbacks);\r\n }\r\n\r\n this._activeContexts.set(refId, handlerContext);\r\n\r\n // Wrap $unRef to call onDestroy when ref is deleted (only wrap once)\r\n const stateObj = currentState as any;\r\n if (stateObj.$unRef && !stateObj.__unRefWrapped__) {\r\n const originalUnRef = stateObj.$unRef.bind(stateObj);\r\n stateObj.$unRef = () => {\r\n // Run destroy callbacks before unref\r\n const ctx = this._activeContexts.get(refId);\r\n if (ctx && ctx.runDestroy) {\r\n ctx.runDestroy();\r\n }\r\n this._activeContexts.delete(refId);\r\n return originalUnRef();\r\n };\r\n stateObj.__unRefWrapped__ = true;\r\n }\r\n }\r\n\r\n // Run onMount callbacks only on first execution\r\n if (isFirstExecution && handlerContext.runMount) {\r\n handlerContext.runMount();\r\n }\r\n\r\n // Mark that we're inside handler execution (prevents auto-render during handler)\r\n handlerContext.setInHandler(true);\r\n\r\n try {\r\n // Bind 'this' to the DBIHTMLComponentsV2 instance so handlers can use this.toJSON()\r\n // Pass wrappedCtx so handlers use the proxy-wrapped ctx that tracks interaction calls\r\n // This ensures __asyncInteractionCalled__ flag is set when handler calls ctx.interaction.reply() etc.\r\n handlerFn.call(this, handlerContext.wrappedCtx, ...handlerData.slice(1));\r\n } finally {\r\n // Always reset handler execution flag\r\n handlerContext.setInHandler(false);\r\n }\r\n\r\n // Run effects after handler execution (state may have changed)\r\n handlerContext.runEffects();\r\n\r\n // If there are pending data changes and no interaction method was called,\r\n // flush the render now (synchronously uses interaction.update)\r\n if (handlerContext.hasPendingRender()) {\r\n handlerContext.flushRender();\r\n }\r\n } catch (error) {\r\n // Re-throw the error so it's visible to the developer\r\n console.error(`[DBI-Svelte] Handler \"${handlerInfo.handlerName}\" failed:`, error);\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n // Store last render's modals for showModal() to access\r\n // Note: Used internally by handler context, not truly private\r\n __lastRenderModals__: Map<string, any> | null = null;\r\n\r\n override async toJSON(arg: TDBIHTMLComponentsV2ToJSONArgs = {}): Promise<any> {\r\n if (this.mode === 'svelte' && this.template) {\r\n // Render Svelte component\r\n const result = await renderSvelteComponent(\r\n this.dbi as any,\r\n this.template,\r\n this.name,\r\n {\r\n data: arg.data,\r\n ttl: this.ttl\r\n }\r\n );\r\n\r\n // Store modals for showModal() to access\r\n this.__lastRenderModals__ = result.modals;\r\n\r\n return result.components;\r\n } else {\r\n // Use Eta template parsing (default)\r\n return parseHTMLComponentsV2(\r\n this.dbi as any,\r\n this.template!,\r\n this.name,\r\n {\r\n data: arg.data,\r\n ttl: this.ttl\r\n }\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Send the component to an interaction or channel and initialize lifecycle hooks (onMount)\r\n * This is the recommended way to send Svelte components with intervals/timers\r\n * \r\n * @param target - Discord interaction or channel to send to\r\n * @param options - Send options including data, flags, content\r\n * \r\n * @example\r\n * ```ts\r\n * const showcase = dbi.interaction(\"product-showcase\");\r\n * \r\n * // Send as interaction reply\r\n * await showcase.send(interaction, { data: { count: 0 } });\r\n * \r\n * // Send to a channel directly\r\n * const result = await showcase.send(channel, { data: { count: 0 } });\r\n * \r\n * // Send as followUp (if already replied)\r\n * const result = await showcase.send(interaction, { data: { count: 0 }, followUp: true });\r\n * \r\n * // Manual re-render from outside\r\n * await result.render();\r\n * ```\r\n */\r\n async send(target: any, options: TDBIHTMLComponentsV2SendOptions = {}): Promise<TDBIHTMLComponentsV2SendResult> {\r\n // Wait for Svelte component initialization if not yet completed\r\n if (this._initPromise) {\r\n await this._initPromise;\r\n }\r\n\r\n const { data = {}, flags = [\"IsComponentsV2\"], content, ephemeral, reply, followUp } = options;\r\n\r\n // Render components (toJSON is async) - this also creates $ref in data if not present\r\n const components = await this.toJSON({ data });\r\n\r\n // Build message options\r\n const messageOptions: any = { components, flags };\r\n if (content) messageOptions.content = content;\r\n if (ephemeral) messageOptions.flags = [...flags, \"Ephemeral\"];\r\n\r\n // Detect target type and send accordingly\r\n let message: any;\r\n const isInteraction = target.reply && target.user; // Interactions have both reply method and user property\r\n const isChannel = target.send && !target.user; // Channels have send but no user\r\n\r\n try {\r\n if (isInteraction) {\r\n if (followUp) {\r\n message = await target.followUp(messageOptions);\r\n } else {\r\n message = await target.reply(messageOptions);\r\n }\r\n } else if (isChannel) {\r\n message = await target.send(messageOptions);\r\n } else {\r\n throw new Error(\"Invalid target: must be an interaction or channel\");\r\n }\r\n } catch (error: any) {\r\n // Check if it's a Discord API error and enhance it with helpful context\r\n if (error.code || error.rawError || (error.message && error.message.includes('Invalid Form Body'))) {\r\n const source = this.file ? fs.readFileSync(this.file, 'utf-8') : this.template;\r\n throw parseDiscordAPIError(error, source, this.name, components);\r\n }\r\n throw error;\r\n }\r\n\r\n // If Svelte mode, create initial handler context and run onMount\r\n // After toJSON, data.$ref is guaranteed to exist (created in renderSvelteComponent)\r\n if (this.mode === 'svelte' && this.svelteComponentInfo && data.$ref) {\r\n const refId = data.$ref;\r\n\r\n // Create handler context with a fake ctx that has the message\r\n const fakeCtx = {\r\n interaction: {\r\n replied: true,\r\n deferred: false,\r\n message: message,\r\n }\r\n };\r\n\r\n const handlerContext = createHandlerContext(\r\n this.svelteComponentInfo.scriptContent,\r\n data,\r\n this,\r\n fakeCtx,\r\n this._sourceDir,\r\n this.svelteComponentInfo.inlineHandlers\r\n );\r\n\r\n // Store the context for lifecycle management\r\n this._activeContexts.set(refId, handlerContext);\r\n\r\n // Wrap $unRef to call onDestroy when ref is deleted\r\n if (data.$unRef) {\r\n const originalUnRef = data.$unRef.bind(data);\r\n data.$unRef = () => {\r\n if (handlerContext.runDestroy) {\r\n handlerContext.runDestroy();\r\n }\r\n this._activeContexts.delete(refId);\r\n return originalUnRef();\r\n };\r\n }\r\n\r\n // Run onMount callbacks\r\n handlerContext.runMount();\r\n\r\n // Run initial effects\r\n handlerContext.runEffects();\r\n\r\n // Return result object with render() method for manual re-rendering\r\n const component = this;\r\n return {\r\n message,\r\n data,\r\n render: async () => {\r\n // Run pre-render callbacks (async)\r\n await handlerContext.runPreRender();\r\n\r\n // Re-render the component\r\n const components = await component.toJSON({ data });\r\n await message.edit({\r\n components,\r\n flags: [\"IsComponentsV2\"],\r\n });\r\n\r\n // Run after-render callbacks\r\n handlerContext.runAfterRender();\r\n },\r\n destroy: () => component.destroy(data)\r\n } as TDBIHTMLComponentsV2SendResult;\r\n }\r\n\r\n // For non-Svelte mode, return simple result object\r\n return {\r\n message,\r\n data,\r\n render: async () => {\r\n const components = await this.toJSON({ data });\r\n await message.edit({\r\n components,\r\n flags: [\"IsComponentsV2\"],\r\n });\r\n },\r\n destroy: () => this.destroy(data)\r\n } as TDBIHTMLComponentsV2SendResult;\r\n }\r\n\r\n /**\r\n * Destroy a component instance by ref ID or data object\r\n * This runs onDestroy callbacks (clears intervals/timers) and removes the ref\r\n * \r\n * @param refOrData - Either a ref ID string or the data object with $ref\r\n * @returns true if destroyed, false if not found\r\n * \r\n * @example\r\n * ```ts\r\n * // Destroy by data object\r\n * showcase.destroy(data);\r\n * \r\n * // Destroy by ref ID\r\n * showcase.destroy(data.$ref);\r\n * \r\n * // Destroy all active instances of this component\r\n * showcase.destroyAll();\r\n * ```\r\n */\r\n destroy(refOrData: string | Record<string, any>): boolean {\r\n const refId = typeof refOrData === 'string' ? refOrData : refOrData?.$ref;\r\n\r\n if (!refId) {\r\n return false;\r\n }\r\n\r\n const context = this._activeContexts.get(refId);\r\n if (context) {\r\n // Run destroy callbacks (clears intervals, timers, etc.)\r\n if (context.runDestroy) {\r\n context.runDestroy();\r\n }\r\n this._activeContexts.delete(refId);\r\n }\r\n\r\n // Also delete from DBI refs store\r\n this.dbi.data.refs.delete(refId);\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Extract all field values from a modal interaction\r\n * Supports text inputs, select menus (string, user, role, mentionable, channel), and file uploads\r\n * \r\n * Returns an object where keys are the custom_id of each component and values are:\r\n * - For text inputs: string value\r\n * - For string selects: string[] of selected values\r\n * - For user selects: string[] of user IDs\r\n * - For role selects: string[] of role IDs\r\n * - For mentionable selects: { users: string[], roles: string[] }\r\n * - For channel selects: string[] of channel IDs\r\n * - For file uploads: attachment objects array\r\n */\r\n private _extractModalFields(modalInteraction: any): Record<string, any> {\r\n const fields: Record<string, any> = {};\r\n\r\n // Handle classic text input fields via ModalSubmitFields\r\n if (modalInteraction.fields && modalInteraction.fields.fields) {\r\n for (const [customId, field] of modalInteraction.fields.fields) {\r\n // Text input - field.value is the string\r\n // For select menus, value might be an array\r\n fields[customId] = field.values || field.value;\r\n }\r\n }\r\n\r\n // Handle new modal components from interaction.data.components\r\n // The new modal structure uses Label wrappers with nested components\r\n const data = modalInteraction.data || (modalInteraction as any).data;\r\n if (data && data.components) {\r\n this._extractFieldsFromComponents(data.components, fields);\r\n }\r\n\r\n // Also check for components directly on the interaction (some Discord.js versions)\r\n if (modalInteraction.components && Array.isArray(modalInteraction.components)) {\r\n this._extractFieldsFromInteractionComponents(modalInteraction.components, fields);\r\n }\r\n\r\n return fields;\r\n }\r\n\r\n /**\r\n * Extract fields from Discord.js style interaction components (ActionRow objects)\r\n */\r\n private _extractFieldsFromInteractionComponents(components: any[], fields: Record<string, any>) {\r\n for (const row of components) {\r\n // ActionRow has components property\r\n const rowComponents = row.components || [];\r\n for (const component of rowComponents) {\r\n const customId = component.customId || component.custom_id || component.id;\r\n if (!customId) continue;\r\n\r\n // Check component type\r\n const type = component.type;\r\n\r\n // Text Input (type 4)\r\n if (type === 4 || component.value !== undefined) {\r\n fields[customId] = component.value || '';\r\n }\r\n\r\n // Select menus (types 3, 5, 6, 7, 8) - check for values array\r\n if (component.values !== undefined) {\r\n fields[customId] = component.values;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Recursively extract field values from component structure\r\n */\r\n private _extractFieldsFromComponents(components: any[], fields: Record<string, any>) {\r\n for (const component of components) {\r\n const type = component.type;\r\n // Support both custom_id and id for backward compatibility\r\n const customId = component.custom_id || component.id;\r\n\r\n // Type 18 = Label/Field - can have nested component or components\r\n if (type === 18) {\r\n if (component.component) {\r\n this._extractFieldsFromComponents([component.component], fields);\r\n }\r\n if (component.components) {\r\n this._extractFieldsFromComponents(component.components, fields);\r\n }\r\n continue;\r\n }\r\n\r\n // Type 1 = Action Row - has nested components array\r\n if (type === 1 && component.components) {\r\n this._extractFieldsFromComponents(component.components, fields);\r\n continue;\r\n }\r\n\r\n if (!customId) continue;\r\n\r\n switch (type) {\r\n case 4: // Text Input\r\n fields[customId] = component.value || '';\r\n break;\r\n\r\n case 3: // String Select\r\n fields[customId] = component.values || [];\r\n break;\r\n\r\n case 5: // User Select\r\n fields[customId] = component.values || [];\r\n break;\r\n\r\n case 6: // Role Select\r\n fields[customId] = component.values || [];\r\n break;\r\n\r\n case 7: // Mentionable Select - can have both users and roles\r\n // Discord returns resolved data for mentionables\r\n fields[customId] = {\r\n values: component.values || [],\r\n users: component.resolved?.users ? Object.keys(component.resolved.users) : [],\r\n roles: component.resolved?.roles ? Object.keys(component.resolved.roles) : []\r\n };\r\n break;\r\n\r\n case 8: // Channel Select\r\n fields[customId] = component.values || [];\r\n break;\r\n\r\n case 19: // File Upload\r\n // File uploads come through as attachments\r\n fields[customId] = component.attachments || [];\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Destroy all active instances of this component\r\n * Useful for cleanup when the bot shuts down or component is unloaded\r\n * \r\n * @returns Number of instances destroyed\r\n */\r\n destroyAll(): number {\r\n let count = 0;\r\n for (const [refId, context] of this._activeContexts) {\r\n if (context.runDestroy) {\r\n context.runDestroy();\r\n }\r\n this.dbi.data.refs.delete(refId);\r\n count++;\r\n }\r\n this._activeContexts.clear();\r\n return count;\r\n }\r\n\r\n handlers?: any[] = [];\r\n}"]}
@@ -1 +1 @@
1
- {"version":3,"file":"svelteParser.d.ts","sourceRoot":"","sources":["../../../../../src/types/Components/HTMLComponentsV2/svelteParser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"svelteParser.d.ts","sourceRoot":"","sources":["../../../../../src/types/Components/HTMLComponentsV2/svelteParser.ts"],"names":[],"mappings":"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"}
@@ -917,16 +917,14 @@ function createHandlerContext(scriptContent, initialData = {}, component, ctx, s
917
917
  });
918
918
  }
919
919
 
920
- // Rate-limit aware edit function with retry
921
- function __safeEdit__(editFn, retryCount) {
920
+ // Rate-limit aware edit function with retry and enhanced error handling
921
+ function __safeEdit__(editFn, retryCount, componentsForError) {
922
922
  retryCount = retryCount || 0;
923
923
  var maxRetries = 3;
924
924
 
925
925
  return editFn().then(function(result) {
926
- console.log("[DBI-Svelte DEBUG] __safeEdit__ success");
927
926
  return result;
928
927
  }).catch(function(err) {
929
- console.error("[DBI-Svelte DEBUG] __safeEdit__ error:", err.message || err);
930
928
  // Check for rate limit (429)
931
929
  if (err.status === 429 || (err.message && err.message.includes('rate limit'))) {
932
930
  var retryAfter = err.retry_after || err.retryAfter || 1;
@@ -937,14 +935,59 @@ function createHandlerContext(scriptContent, initialData = {}, component, ctx, s
937
935
  setTimeout(function() {
938
936
  __isRateLimited__ = false;
939
937
  if (retryCount < maxRetries) {
940
- resolve(__safeEdit__(editFn, retryCount + 1));
938
+ resolve(__safeEdit__(editFn, retryCount + 1, componentsForError));
941
939
  } else {
942
940
  resolve();
943
941
  }
944
942
  }, retryAfter * 1000);
945
943
  });
946
944
  }
947
- // Log and re-throw non-rate-limit errors
945
+
946
+ // Check if it's a component validation error and enhance it
947
+ if (err.code === 50035 || err.rawError?.code === 50035 ||
948
+ (err.message && (err.message.includes('Invalid Form Body') || err.message.includes('BASE_TYPE')))) {
949
+ // Create enhanced error message
950
+ var errorMsg = err.message || '';
951
+ var enhancedMsg = '\\n╔══════════════════════════════════════════════════════════════╗\\n';
952
+ enhancedMsg += '║ Discord Components V2 Validation Error ║\\n';
953
+ enhancedMsg += '╠══════════════════════════════════════════════════════════════╣\\n';
954
+
955
+ // Parse error paths from message
956
+ var errorLines = errorMsg.split('\\n');
957
+ for (var i = 0; i < errorLines.length; i++) {
958
+ var line = errorLines[i];
959
+ var match = line.match(/([\\w\\[\\]\\.]+)\\[([A-Z_]+)\\]:\\s*(.+)/);
960
+ if (match) {
961
+ var path = match[1];
962
+ var code = match[2];
963
+ var msg = match[3];
964
+
965
+ enhancedMsg += '║\\n';
966
+ enhancedMsg += '║ ❌ Path: ' + path + '\\n';
967
+ enhancedMsg += '║ ├─ Code: ' + code + '\\n';
968
+ enhancedMsg += '║ ├─ Message: ' + msg + '\\n';
969
+
970
+ // Add helpful hints based on error code
971
+ if (code === 'BASE_TYPE_REQUIRED') {
972
+ enhancedMsg += '║ └─ Fix: This field is required - check if the element has all required attributes\\n';
973
+ } else if (code === 'BASE_TYPE_BAD_LENGTH') {
974
+ enhancedMsg += '║ └─ Fix: Wrong number of items - Discord has min/max limits for components\\n';
975
+ } else if (code.includes('MAX_LENGTH') || code.includes('MIN_LENGTH')) {
976
+ enhancedMsg += '║ └─ Fix: Content length issue - adjust text or number of items\\n';
977
+ }
978
+ }
979
+ }
980
+
981
+ enhancedMsg += '║\\n';
982
+ enhancedMsg += '╚══════════════════════════════════════════════════════════════╝';
983
+
984
+ var enhancedError = new Error('[DBI-Svelte] Component validation error:\\n' + enhancedMsg + '\\n\\nOriginal: ' + errorMsg);
985
+ enhancedError.originalError = err;
986
+ enhancedError.type = 'discord-component-validation';
987
+ throw enhancedError;
988
+ }
989
+
990
+ // Re-throw other errors
948
991
  throw err;
949
992
  });
950
993
  }
@@ -987,28 +1030,16 @@ function createHandlerContext(scriptContent, initialData = {}, component, ctx, s
987
1030
 
988
1031
  // Actual render execution
989
1032
  async function __executeRender__() {
990
- console.log("[DBI-Svelte DEBUG] __executeRender__ called");
991
1033
  // Run pre-render callbacks (async, awaited)
992
1034
  await __runPreRender__();
993
1035
 
994
- console.log("[DBI-Svelte DEBUG] Calling toJSON with data:", JSON.stringify(__data__).substring(0, 200));
995
1036
  var components = await __component__.toJSON({ data: __data__ });
996
- console.log("[DBI-Svelte DEBUG] toJSON returned", components ? "components" : "null");
997
1037
  var result;
998
1038
 
999
1039
  // Try to use current interaction if available
1000
1040
  if (__ctx__ && __ctx__.interaction) {
1001
1041
  try {
1002
1042
  var i = __ctx__.interaction;
1003
- console.log("[DBI-Svelte DEBUG] interaction available, replied:", i.replied, "deferred:", i.deferred, "__interactionDeferred__:", __interactionDeferred__);
1004
- console.log("[DBI-Svelte DEBUG] components count:", components ? components.length : 0);
1005
- if (components && components[0]) {
1006
- console.log("[DBI-Svelte DEBUG] first component type:", components[0].type);
1007
- // Log first text content if it's a text_display
1008
- if (components[0].type === 10 && components[0].content) {
1009
- console.log("[DBI-Svelte DEBUG] first text content:", components[0].content.substring(0, 100));
1010
- }
1011
- }
1012
1043
 
1013
1044
  // Update last message reference
1014
1045
  if (i.message) {
@@ -1017,23 +1048,21 @@ function createHandlerContext(scriptContent, initialData = {}, component, ctx, s
1017
1048
 
1018
1049
  // Check if interaction was deferred (our flag) or Discord.js flags
1019
1050
  if (i.replied || i.deferred || __interactionDeferred__) {
1020
- console.log("[DBI-Svelte DEBUG] Using message.edit (deferred path)");
1021
1051
  // Already replied/deferred, use message.edit with rate limit handling
1022
1052
  result = await __safeEdit__(function() {
1023
1053
  return i.message.edit({
1024
1054
  components: components,
1025
1055
  flags: ["IsComponentsV2"],
1026
1056
  });
1027
- });
1057
+ }, 0, components);
1028
1058
  } else {
1029
- console.log("[DBI-Svelte DEBUG] Using interaction.update");
1030
1059
  // Not replied yet, use update with rate limit handling
1031
1060
  result = await __safeEdit__(function() {
1032
1061
  return i.update({
1033
1062
  components: components,
1034
1063
  flags: ["IsComponentsV2"],
1035
1064
  });
1036
- });
1065
+ }, 0, components);
1037
1066
  }
1038
1067
 
1039
1068
  // Run after-render callbacks
@@ -1052,7 +1081,7 @@ function createHandlerContext(scriptContent, initialData = {}, component, ctx, s
1052
1081
  components: components,
1053
1082
  flags: ["IsComponentsV2"],
1054
1083
  });
1055
- });
1084
+ }, 0, components);
1056
1085
 
1057
1086
  // Run after-render callbacks
1058
1087
  __runAfterRender__();
@@ -1185,10 +1214,8 @@ function createHandlerContext(scriptContent, initialData = {}, component, ctx, s
1185
1214
  // After the reply completes, flush any pending renders using throttled render
1186
1215
  if (result && typeof result.then === 'function') {
1187
1216
  result.then(function() {
1188
- console.log("[DBI-Svelte DEBUG] " + prop + " completed, hasDataChanges:", __hasDataChanges__, "autoRenderEnabled:", __autoRenderEnabled__);
1189
1217
  if (__hasDataChanges__ && __autoRenderEnabled__) {
1190
1218
  __hasDataChanges__ = false;
1191
- console.log("[DBI-Svelte DEBUG] Triggering render after " + prop);
1192
1219
  // Use throttled render which handles rate limits
1193
1220
  __throttledRender__(false);
1194
1221
  }