@mostfeatured/dbi 0.2.19 → 0.2.21

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.
@@ -24,6 +24,20 @@ export interface TDBIHTMLComponentsV2SendOptions {
24
24
  /** If true, uses interaction.followUp() instead of reply() */
25
25
  followUp?: boolean;
26
26
  }
27
+ /**
28
+ * Result object returned by send() method
29
+ * Includes the Discord message and a render() method for manual re-rendering
30
+ */
31
+ export interface TDBIHTMLComponentsV2SendResult {
32
+ /** The Discord message object returned from send/reply/followUp */
33
+ message: any;
34
+ /** The data object with reactive state (includes $ref) */
35
+ data: Record<string, any>;
36
+ /** Manually trigger a re-render of the component */
37
+ render: () => Promise<void>;
38
+ /** Destroy this component instance (clears intervals, timers, removes ref) */
39
+ destroy: () => boolean;
40
+ }
27
41
  export interface IDBIHTMLComponentsV2ExecuteCtx<TNamespace extends NamespaceEnums> extends IDBIBaseExecuteCtx<TNamespace> {
28
42
  data: TDBIReferencedData[];
29
43
  }
@@ -69,13 +83,16 @@ export declare class DBIHTMLComponentsV2<TNamespace extends NamespaceEnums> exte
69
83
  * await showcase.send(interaction, { data: { count: 0 } });
70
84
  *
71
85
  * // Send to a channel directly
72
- * await showcase.send(channel, { data: { count: 0 } });
86
+ * const result = await showcase.send(channel, { data: { count: 0 } });
73
87
  *
74
88
  * // Send as followUp (if already replied)
75
- * await showcase.send(interaction, { data: { count: 0 }, followUp: true });
89
+ * const result = await showcase.send(interaction, { data: { count: 0 }, followUp: true });
90
+ *
91
+ * // Manual re-render from outside
92
+ * await result.render();
76
93
  * ```
77
94
  */
78
- send(target: any, options?: TDBIHTMLComponentsV2SendOptions): Promise<any>;
95
+ send(target: any, options?: TDBIHTMLComponentsV2SendOptions): Promise<TDBIHTMLComponentsV2SendResult>;
79
96
  /**
80
97
  * Destroy a component instance by ref ID or data object
81
98
  * This runs onDestroy callbacks (clears intervals/timers) and removes the ref
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/types/Components/HTMLComponentsV2/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/types/Components/HTMLComponentsV2/index.ts"],"names":[],"mappings":"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"}
@@ -404,10 +404,13 @@ class DBIHTMLComponentsV2 extends Interaction_1.DBIBaseInteraction {
404
404
  * await showcase.send(interaction, { data: { count: 0 } });
405
405
  *
406
406
  * // Send to a channel directly
407
- * await showcase.send(channel, { data: { count: 0 } });
407
+ * const result = await showcase.send(channel, { data: { count: 0 } });
408
408
  *
409
409
  * // Send as followUp (if already replied)
410
- * await showcase.send(interaction, { data: { count: 0 }, followUp: true });
410
+ * const result = await showcase.send(interaction, { data: { count: 0 }, followUp: true });
411
+ *
412
+ * // Manual re-render from outside
413
+ * await result.render();
411
414
  * ```
412
415
  */
413
416
  async send(target, options = {}) {
@@ -482,8 +485,39 @@ class DBIHTMLComponentsV2 extends Interaction_1.DBIBaseInteraction {
482
485
  handlerContext.runMount();
483
486
  // Run initial effects
484
487
  handlerContext.runEffects();
488
+ // Return result object with render() method for manual re-rendering
489
+ const component = this;
490
+ return {
491
+ message,
492
+ data,
493
+ render: async () => {
494
+ // Run pre-render callbacks (async)
495
+ await handlerContext.runPreRender();
496
+ // Re-render the component
497
+ const components = await component.toJSON({ data });
498
+ await message.edit({
499
+ components,
500
+ flags: ["IsComponentsV2"],
501
+ });
502
+ // Run after-render callbacks
503
+ handlerContext.runAfterRender();
504
+ },
505
+ destroy: () => component.destroy(data)
506
+ };
485
507
  }
486
- return message;
508
+ // For non-Svelte mode, return simple result object
509
+ return {
510
+ message,
511
+ data,
512
+ render: async () => {
513
+ const components = await this.toJSON({ data });
514
+ await message.edit({
515
+ components,
516
+ flags: ["IsComponentsV2"],
517
+ });
518
+ },
519
+ destroy: () => this.destroy(data)
520
+ };
487
521
  }
488
522
  /**
489
523
  * Destroy a component instance by ref ID or data object
@@ -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\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 );\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 // Modal handler execution failed\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 );\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 // Handler execution failed\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 * await showcase.send(channel, { data: { count: 0 } });\r\n * \r\n * // Send as followUp (if already replied)\r\n * await showcase.send(interaction, { data: { count: 0 }, followUp: true });\r\n * ```\r\n */\r\n async send(target: any, options: TDBIHTMLComponentsV2SendOptions = {}): Promise<any> {\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 );\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\r\n return message;\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 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 );\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 // Modal handler execution failed\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 );\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 // Handler execution failed\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 );\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}"]}
@@ -49,9 +49,14 @@ export interface HandlerContextResult {
49
49
  wrappedCtx: any;
50
50
  mountCallbacks: Function[];
51
51
  destroyCallbacks: Function[];
52
+ preRenderCallbacks: Function[];
53
+ afterRenderCallbacks: Function[];
52
54
  runMount: () => void;
53
55
  runDestroy: () => void;
56
+ runPreRender: () => Promise<void>;
57
+ runAfterRender: () => void;
54
58
  setInHandler: (value: boolean) => void;
59
+ render: (immediate?: boolean) => Promise<void>;
55
60
  }
56
61
  /**
57
62
  * Create a handler context from script content
@@ -1 +1 @@
1
- {"version":3,"file":"svelteParser.d.ts","sourceRoot":"","sources":["../../../../../src/types/Components/HTMLComponentsV2/svelteParser.ts"],"names":[],"mappings":"AA+DA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,cAAc,GAAG,aAAa,GAAG,mBAAmB,GAAG,cAAc,GAAG,eAAe,CAAC;IAC9F,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACzC,gDAAgD;IAChD,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,0DAA0D;IAC1D,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAyQnH;AA+GD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,mBAAmB,EAClC,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAC9B,aAAa,GAAE,MAAkB,GAChC,uBAAuB,EAAE,CAiH3B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAiB/E;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAChC,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,UAAU,EAAE,GAAG,CAAC;IAEhB,cAAc,EAAE,QAAQ,EAAE,CAAC;IAC3B,gBAAgB,EAAE,QAAQ,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,IAAI,CAAC;IAEvB,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AA2GD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAosBvK"}
1
+ {"version":3,"file":"svelteParser.d.ts","sourceRoot":"","sources":["../../../../../src/types/Components/HTMLComponentsV2/svelteParser.ts"],"names":[],"mappings":"AA+DA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,cAAc,GAAG,aAAa,GAAG,mBAAmB,GAAG,cAAc,GAAG,eAAe,CAAC;IAC9F,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACzC,gDAAgD;IAChD,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,0DAA0D;IAC1D,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAyQnH;AA+GD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,mBAAmB,EAClC,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAC9B,aAAa,GAAE,MAAkB,GAChC,uBAAuB,EAAE,CAiH3B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAiB/E;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnC,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAChC,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,UAAU,EAAE,GAAG,CAAC;IAEhB,cAAc,EAAE,QAAQ,EAAE,CAAC;IAC3B,gBAAgB,EAAE,QAAQ,EAAE,CAAC;IAC7B,kBAAkB,EAAE,QAAQ,EAAE,CAAC;IAC/B,oBAAoB,EAAE,QAAQ,EAAE,CAAC;IACjC,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,cAAc,EAAE,MAAM,IAAI,CAAC;IAE3B,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAEvC,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAChD;AA2GD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,oBAAoB,CAiwBvK"}
@@ -714,6 +714,8 @@ function createHandlerContext(scriptContent, initialData = {}, component, ctx, s
714
714
  // Lifecycle callbacks
715
715
  var __mountCallbacks__ = [];
716
716
  var __destroyCallbacks__ = [];
717
+ var __preRenderCallbacks__ = [];
718
+ var __afterRenderCallbacks__ = [];
717
719
  var __isMounted__ = false;
718
720
 
719
721
  // Store last message reference for background updates (intervals, timeouts)
@@ -741,6 +743,38 @@ function createHandlerContext(scriptContent, initialData = {}, component, ctx, s
741
743
  __destroyCallbacks__.push(fn);
742
744
  }
743
745
 
746
+ // Lifecycle: onPreRender - called before each render (async, awaited)
747
+ function onPreRender(fn) {
748
+ __preRenderCallbacks__.push(fn);
749
+ }
750
+
751
+ // Lifecycle: onAfterRender - called after each render completes
752
+ function onAfterRender(fn) {
753
+ __afterRenderCallbacks__.push(fn);
754
+ }
755
+
756
+ // Run all pre-render callbacks (async)
757
+ async function __runPreRender__() {
758
+ for (var i = 0; i < __preRenderCallbacks__.length; i++) {
759
+ try {
760
+ await __preRenderCallbacks__[i]();
761
+ } catch (err) {
762
+ // Pre-render callback failed
763
+ }
764
+ }
765
+ }
766
+
767
+ // Run all after-render callbacks
768
+ function __runAfterRender__() {
769
+ for (var i = 0; i < __afterRenderCallbacks__.length; i++) {
770
+ try {
771
+ __afterRenderCallbacks__[i]();
772
+ } catch (err) {
773
+ // After-render callback failed
774
+ }
775
+ }
776
+ }
777
+
744
778
  // Modal store - stores rendered modal definitions
745
779
  var __modals__ = new Map();
746
780
 
@@ -902,7 +936,11 @@ function createHandlerContext(scriptContent, initialData = {}, component, ctx, s
902
936
 
903
937
  // Actual render execution
904
938
  async function __executeRender__() {
939
+ // Run pre-render callbacks (async, awaited)
940
+ await __runPreRender__();
941
+
905
942
  var components = await __component__.toJSON({ data: __data__ });
943
+ var result;
906
944
 
907
945
  // Try to use current interaction if available
908
946
  if (__ctx__ && __ctx__.interaction) {
@@ -916,7 +954,7 @@ function createHandlerContext(scriptContent, initialData = {}, component, ctx, s
916
954
 
917
955
  if (i.replied || i.deferred) {
918
956
  // Already replied, use message.edit with rate limit handling
919
- return __safeEdit__(function() {
957
+ result = await __safeEdit__(function() {
920
958
  return i.message.edit({
921
959
  components: components,
922
960
  flags: ["IsComponentsV2"],
@@ -924,13 +962,17 @@ function createHandlerContext(scriptContent, initialData = {}, component, ctx, s
924
962
  });
925
963
  } else {
926
964
  // Not replied yet, use update with rate limit handling
927
- return __safeEdit__(function() {
965
+ result = await __safeEdit__(function() {
928
966
  return i.update({
929
967
  components: components,
930
968
  flags: ["IsComponentsV2"],
931
969
  });
932
970
  });
933
971
  }
972
+
973
+ // Run after-render callbacks
974
+ __runAfterRender__();
975
+ return result;
934
976
  } catch (err) {
935
977
  // Silently fail
936
978
  }
@@ -938,12 +980,16 @@ function createHandlerContext(scriptContent, initialData = {}, component, ctx, s
938
980
 
939
981
  // Fallback: Use last message reference (for intervals/timeouts outside interaction)
940
982
  if (__lastMessage__) {
941
- return __safeEdit__(function() {
983
+ result = await __safeEdit__(function() {
942
984
  return __lastMessage__.edit({
943
985
  components: components,
944
986
  flags: ["IsComponentsV2"],
945
987
  });
946
988
  });
989
+
990
+ // Run after-render callbacks
991
+ __runAfterRender__();
992
+ return result;
947
993
  }
948
994
 
949
995
  return Promise.resolve();
@@ -1247,9 +1293,14 @@ function createHandlerContext(scriptContent, initialData = {}, component, ctx, s
1247
1293
  wrappedCtx: ctx,
1248
1294
  mountCallbacks: __mountCallbacks__,
1249
1295
  destroyCallbacks: __destroyCallbacks__,
1296
+ preRenderCallbacks: __preRenderCallbacks__,
1297
+ afterRenderCallbacks: __afterRenderCallbacks__,
1250
1298
  runMount: __runMount__,
1251
1299
  runDestroy: __runDestroy__,
1252
- setInHandler: __setInHandler__
1300
+ runPreRender: __runPreRender__,
1301
+ runAfterRender: __runAfterRender__,
1302
+ setInHandler: __setInHandler__,
1303
+ render: render
1253
1304
  };
1254
1305
  };
1255
1306
  `;
@@ -1287,9 +1338,14 @@ function createHandlerContext(scriptContent, initialData = {}, component, ctx, s
1287
1338
  wrappedCtx: result.wrappedCtx || ctx,
1288
1339
  mountCallbacks: result.mountCallbacks || [],
1289
1340
  destroyCallbacks: result.destroyCallbacks || [],
1341
+ preRenderCallbacks: result.preRenderCallbacks || [],
1342
+ afterRenderCallbacks: result.afterRenderCallbacks || [],
1290
1343
  runMount: result.runMount || (() => { }),
1291
1344
  runDestroy: result.runDestroy || (() => { }),
1292
- setInHandler: result.setInHandler || (() => { })
1345
+ runPreRender: result.runPreRender || (async () => { }),
1346
+ runAfterRender: result.runAfterRender || (() => { }),
1347
+ setInHandler: result.setInHandler || (() => { }),
1348
+ render: result.render || (() => Promise.resolve())
1293
1349
  };
1294
1350
  }
1295
1351
  catch (error) {
@@ -1316,9 +1372,14 @@ function createHandlerContext(scriptContent, initialData = {}, component, ctx, s
1316
1372
  wrappedCtx: ctx,
1317
1373
  mountCallbacks: [],
1318
1374
  destroyCallbacks: [],
1375
+ preRenderCallbacks: [],
1376
+ afterRenderCallbacks: [],
1319
1377
  runMount: () => { },
1320
1378
  runDestroy: () => { },
1321
- setInHandler: () => { }
1379
+ runPreRender: async () => { },
1380
+ runAfterRender: () => { },
1381
+ setInHandler: () => { },
1382
+ render: () => Promise.resolve()
1322
1383
  };
1323
1384
  }
1324
1385
  /**