@mostfeatured/dbi 0.2.31 → 0.2.32

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 +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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"}
@@ -149,6 +149,8 @@ ${nextLine ? `${lineNum + 1} | ${nextLine}` : ''}
149
149
  // Track inline handlers (arrow functions or function expressions in event attributes)
150
150
  const inlineHandlers = new Map();
151
151
  let inlineHandlerCounter = 0;
152
+ // Track handler attributes to remove from source (handler, onclick, onchange, etc.)
153
+ const attributesToRemove = [];
152
154
  // Walk through HTML nodes to find event handlers
153
155
  walkSvelteAst(ast.html || ast.fragment, (node, walkContext) => {
154
156
  if (node.type === "Element" || node.type === "InlineComponent" || node.type === "RegularElement" || node.type === "Component") {
@@ -192,6 +194,10 @@ ${nextLine ? `${lineNum + 1} | ${nextLine}` : ''}
192
194
  if (handlerName) {
193
195
  modalInfo.onsubmitHandler = handlerName;
194
196
  }
197
+ // Track this attribute for removal from source (onsubmit shouldn't be in HTML)
198
+ if (attr.start !== undefined && attr.end !== undefined) {
199
+ attributesToRemove.push({ start: attr.start, end: attr.end });
200
+ }
195
201
  break;
196
202
  }
197
203
  }
@@ -275,6 +281,10 @@ ${nextLine ? `${lineNum + 1} | ${nextLine}` : ''}
275
281
  if (isInline && inlineCode) {
276
282
  inlineHandlers.set(handlerName, inlineCode);
277
283
  }
284
+ // Track this attribute for removal from source
285
+ if (attr.start !== undefined && attr.end !== undefined) {
286
+ attributesToRemove.push({ start: attr.start, end: attr.end });
287
+ }
278
288
  break;
279
289
  }
280
290
  }
@@ -337,11 +347,24 @@ ${nextLine ? `${lineNum + 1} | ${nextLine}` : ''}
337
347
  });
338
348
  }
339
349
  });
340
- // Inject auto-generated names into the source
341
- // Sort by position descending so we don't mess up offsets
350
+ // Process source modifications:
351
+ // 1. Remove handler attributes (onclick, onchange, handler) - they shouldn't be in final HTML
352
+ // 2. Inject auto-generated names for elements that need them
353
+ //
354
+ // We need to apply these in reverse position order to maintain correct offsets
342
355
  let processedSource = source;
343
- const sortedElements = [...elementsNeedingNames].sort((a, b) => b.node.start - a.node.start);
344
- for (const { node, name, eachContext } of sortedElements) {
356
+ const modifications = [];
357
+ // Add attribute removals
358
+ for (const { start, end } of attributesToRemove) {
359
+ // Also remove any leading whitespace before the attribute
360
+ let actualStart = start;
361
+ while (actualStart > 0 && (source[actualStart - 1] === ' ' || source[actualStart - 1] === '\t')) {
362
+ actualStart--;
363
+ }
364
+ modifications.push({ type: 'remove', start: actualStart, end, sortKey: actualStart });
365
+ }
366
+ // Add name injections
367
+ for (const { node, name, eachContext } of elementsNeedingNames) {
345
368
  // Find the position right after the opening tag name
346
369
  // e.g., <button ...> -> insert after "button"
347
370
  const tagEnd = node.start + 1 + node.name.length; // +1 for '<'
@@ -370,7 +393,24 @@ ${nextLine ? `${lineNum + 1} | ${nextLine}` : ''}
370
393
  // Static name - use quotes
371
394
  nameAttrValue = `"${name}"`;
372
395
  }
373
- processedSource = processedSource.slice(0, tagEnd) + ` name=${nameAttrValue}` + processedSource.slice(tagEnd);
396
+ modifications.push({ type: 'insert', position: tagEnd, content: ` name=${nameAttrValue}`, sortKey: tagEnd });
397
+ }
398
+ // Sort by position descending so we don't mess up offsets
399
+ // For same position, insertions should come before removals
400
+ modifications.sort((a, b) => {
401
+ if (b.sortKey !== a.sortKey)
402
+ return b.sortKey - a.sortKey;
403
+ // Same position: insert before remove (so remove accounts for inserted content if needed)
404
+ return a.type === 'insert' ? -1 : 1;
405
+ });
406
+ // Apply all modifications
407
+ for (const mod of modifications) {
408
+ if (mod.type === 'remove') {
409
+ processedSource = processedSource.slice(0, mod.start) + processedSource.slice(mod.end);
410
+ }
411
+ else {
412
+ processedSource = processedSource.slice(0, mod.position) + mod.content + processedSource.slice(mod.position);
413
+ }
374
414
  }
375
415
  // Extract declared props from $props() destructuring
376
416
  const declaredProps = [];
@@ -1 +1 @@
1
- {"version":3,"file":"svelteParser.js","sourceRoot":"","sources":["../../../../../src/types/Components/HTMLComponentsV2/svelteParser.ts"],"names":[],"mappings":"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","sourcesContent":["import * as stuffs from \"stuffs\";\r\n\r\n// Lazy imports to avoid issues with package managers that don't properly hoist dependencies\r\nlet _parse: typeof import(\"svelte/compiler\").parse;\r\n\r\nasync function ensureImports() {\r\n if (!_parse) {\r\n const svelteCompiler = await import(\"svelte/compiler\");\r\n _parse = svelteCompiler.parse;\r\n }\r\n}\r\n\r\n/**\r\n * Context passed to walker callback containing parent information\r\n */\r\ninterface WalkContext {\r\n /** Stack of parent nodes from root to current */\r\n parents: any[];\r\n /** Information about enclosing {#each} blocks */\r\n eachBlocks: Array<{\r\n node: any;\r\n /** The iteration variable name (e.g., \"item\" in {#each items as item}) */\r\n iterVar: string;\r\n /** The index variable name if specified (e.g., \"i\" in {#each items as item, i}) */\r\n indexVar?: string;\r\n /** Expression for unique key (iterVar.id, iterVar.name, or index) */\r\n keyExpr: string;\r\n }>;\r\n}\r\n\r\n/**\r\n * Simple AST walker for Svelte AST nodes with parent tracking\r\n */\r\nfunction walkSvelteAst(node: any, callback: (node: any, context: WalkContext) => void, context?: WalkContext) {\r\n if (!node || typeof node !== 'object') return;\r\n\r\n // Initialize context if not provided\r\n const ctx: WalkContext = context || { parents: [], eachBlocks: [] };\r\n\r\n callback(node, ctx);\r\n\r\n // Create new context for children with this node as parent\r\n const childContext: WalkContext = {\r\n parents: [...ctx.parents, node],\r\n eachBlocks: [...ctx.eachBlocks]\r\n };\r\n\r\n // If this is an EachBlock, add it to the context for children\r\n if (node.type === 'EachBlock') {\r\n const iterVar = node.context?.name || node.context?.type === 'Identifier' ? node.context.name : 'item';\r\n const indexVar = node.index;\r\n\r\n // Determine best key expression for unique naming\r\n // Priority: explicit key > iter.id > iter.name > index > counter\r\n let keyExpr = indexVar || `__idx_${ctx.eachBlocks.length}`;\r\n\r\n childContext.eachBlocks = [...ctx.eachBlocks, {\r\n node,\r\n iterVar,\r\n indexVar,\r\n keyExpr\r\n }];\r\n }\r\n\r\n // Walk children based on node type\r\n if (node.children && Array.isArray(node.children)) {\r\n for (const child of node.children) {\r\n walkSvelteAst(child, callback, childContext);\r\n }\r\n }\r\n if (node.fragment && node.fragment.nodes) {\r\n for (const child of node.fragment.nodes) {\r\n walkSvelteAst(child, callback, childContext);\r\n }\r\n }\r\n if (node.nodes && Array.isArray(node.nodes)) {\r\n for (const child of node.nodes) {\r\n walkSvelteAst(child, callback, childContext);\r\n }\r\n }\r\n // Handle {#each} body\r\n if (node.body && node.type === 'EachBlock') {\r\n if (node.body.nodes) {\r\n for (const child of node.body.nodes) {\r\n walkSvelteAst(child, callback, childContext);\r\n }\r\n } else if (Array.isArray(node.body)) {\r\n for (const child of node.body) {\r\n walkSvelteAst(child, callback, childContext);\r\n }\r\n } else {\r\n walkSvelteAst(node.body, callback, childContext);\r\n }\r\n } else if (node.body) {\r\n if (Array.isArray(node.body)) {\r\n for (const child of node.body) {\r\n walkSvelteAst(child, callback, childContext);\r\n }\r\n } else {\r\n walkSvelteAst(node.body, callback, childContext);\r\n }\r\n }\r\n // Handle other potential child properties\r\n if (node.else) {\r\n walkSvelteAst(node.else, callback, childContext);\r\n }\r\n if (node.consequent) {\r\n walkSvelteAst(node.consequent, callback, childContext);\r\n }\r\n if (node.alternate) {\r\n walkSvelteAst(node.alternate, callback, childContext);\r\n }\r\n if (node.then) {\r\n walkSvelteAst(node.then, callback, childContext);\r\n }\r\n if (node.catch) {\r\n walkSvelteAst(node.catch, callback, childContext);\r\n }\r\n}\r\n\r\nexport interface SvelteHandlerInfo {\r\n name: string;\r\n handlerName: string;\r\n eventType: string; // onclick, onchange, onsubmit, etc.\r\n element: string; // button, string-select, components (for modal), etc.\r\n /** If this is an inline handler, contains the extracted source code */\r\n inlineCode?: string;\r\n /** Whether this handler is an inline arrow function or function expression */\r\n isInline?: boolean;\r\n /** Whether this handler has a dynamic name (inside {#each}) - use prefix matching */\r\n isDynamicName?: boolean;\r\n}\r\n\r\nexport interface ModalHandlerInfo {\r\n modalId: string;\r\n onsubmitHandler?: string; // Handler function name for onsubmit\r\n}\r\n\r\nexport interface SvelteValidationWarning {\r\n type: 'missing-data' | 'unused-data' | 'undefined-handler' | 'syntax-error' | 'runtime-error';\r\n message: string;\r\n details?: string;\r\n}\r\n\r\nexport interface SvelteComponentInfo {\r\n handlers: Map<string, SvelteHandlerInfo>;\r\n /** Modal onsubmit handlers keyed by modal id */\r\n modalHandlers: Map<string, ModalHandlerInfo>;\r\n scriptContent: string;\r\n processedSource: string; // Source with auto-generated names injected\r\n /** Props extracted from $props() destructuring */\r\n declaredProps: string[];\r\n /** Props that have default values (don't require data) */\r\n propsWithDefaults: string[];\r\n /** Function names declared in the script */\r\n declaredFunctions: string[];\r\n /** Inline handler code extracted from template (keyed by generated handler name) */\r\n inlineHandlers: Map<string, string>;\r\n}\r\n\r\n/**\r\n * Parse a Svelte component and extract event handlers\r\n * Also injects auto-generated names into elements that have handlers but no name\r\n */\r\nexport async function parseSvelteComponent(source: string, data?: Record<string, any>): Promise<SvelteComponentInfo> {\r\n await ensureImports();\r\n\r\n let ast;\r\n try {\r\n ast = _parse(source);\r\n } catch (parseError: any) {\r\n // Format Svelte parse error with helpful details\r\n const errorMessage = parseError.message || 'Unknown parse error';\r\n const location = parseError.start || parseError.loc;\r\n let details = errorMessage;\r\n\r\n if (location) {\r\n const lines = source.split('\\n');\r\n const lineNum = location.line || 1;\r\n const column = location.column || 0;\r\n const errorLine = lines[lineNum - 1] || '';\r\n const prevLine = lines[lineNum - 2] || '';\r\n const nextLine = lines[lineNum] || '';\r\n\r\n details = `\r\nSvelte Parse Error at line ${lineNum}, column ${column}:\r\n${errorMessage}\r\n\r\n${lineNum > 1 ? `${lineNum - 1} | ${prevLine}\\n` : ''}${lineNum} | ${errorLine}\r\n${' '.repeat(String(lineNum).length + 3 + column)}^\r\n${nextLine ? `${lineNum + 1} | ${nextLine}` : ''}\r\n`.trim();\r\n }\r\n\r\n const enhancedError = new Error(`[DBI-Svelte] Failed to parse Svelte component:\\n${details}`);\r\n (enhancedError as any).originalError = parseError;\r\n (enhancedError as any).type = 'svelte-parse-error';\r\n throw enhancedError;\r\n }\r\n\r\n const handlers = new Map<string, SvelteHandlerInfo>();\r\n const modalHandlers = new Map<string, ModalHandlerInfo>();\r\n let scriptContent = \"\";\r\n\r\n // Extract script content\r\n if (ast.instance) {\r\n scriptContent = source.substring(ast.instance.content.start, ast.instance.content.end);\r\n }\r\n\r\n // Track elements that need auto-generated names (node -> name mapping)\r\n // We'll inject these into the source after the walk\r\n const elementsNeedingNames: Array<{\r\n node: any;\r\n name: string;\r\n handlerName: string;\r\n eventType: string;\r\n element: string;\r\n /** If inside {#each}, contains info for dynamic name generation */\r\n eachContext?: Array<{\r\n iterVar: string;\r\n indexVar?: string;\r\n keyExpr: string;\r\n }>;\r\n }> = [];\r\n let autoNameCounter = 0;\r\n\r\n // Track inline handlers (arrow functions or function expressions in event attributes)\r\n const inlineHandlers = new Map<string, string>();\r\n let inlineHandlerCounter = 0;\r\n\r\n // Walk through HTML nodes to find event handlers\r\n walkSvelteAst(ast.html || ast.fragment, (node: any, walkContext: WalkContext) => {\r\n if (node.type === \"Element\" || node.type === \"InlineComponent\" || node.type === \"RegularElement\" || node.type === \"Component\") {\r\n const attributes = node.attributes || [];\r\n const nodeName = node.name.toLowerCase();\r\n\r\n // Special handling for <components type=\"modal\"> elements\r\n if (nodeName === \"components\") {\r\n const typeAttr = attributes.find((attr: any) =>\r\n attr.type === \"Attribute\" && attr.name === \"type\"\r\n );\r\n const typeValue = typeAttr ? getAttributeValue(typeAttr) : null;\r\n\r\n if (typeValue === \"modal\") {\r\n // This is a modal definition - extract id and onsubmit handler\r\n const idAttr = attributes.find((attr: any) =>\r\n attr.type === \"Attribute\" && attr.name === \"id\"\r\n );\r\n const modalId = idAttr ? getAttributeValue(idAttr) : null;\r\n\r\n if (modalId) {\r\n const modalInfo: ModalHandlerInfo = { modalId };\r\n\r\n // Find onsubmit handler\r\n for (const attr of attributes) {\r\n const isOnSubmit = (attr.type === \"Attribute\" && attr.name === \"onsubmit\") ||\r\n (attr.type === \"EventHandler\" && attr.name === \"submit\");\r\n\r\n if (isOnSubmit) {\r\n let handlerName = \"\";\r\n\r\n if (attr.type === \"Attribute\" && Array.isArray(attr.value)) {\r\n const exprValue = attr.value.find((v: any) => v.type === \"ExpressionTag\" || v.type === \"MustacheTag\");\r\n if (exprValue && exprValue.expression) {\r\n if (exprValue.expression.type === \"Identifier\") {\r\n handlerName = exprValue.expression.name;\r\n } else if (exprValue.expression.type === \"CallExpression\" && exprValue.expression.callee) {\r\n handlerName = exprValue.expression.callee.name;\r\n }\r\n }\r\n } else if (attr.expression) {\r\n if (attr.expression.type === \"Identifier\") {\r\n handlerName = attr.expression.name;\r\n } else if (attr.expression.type === \"CallExpression\" && attr.expression.callee) {\r\n handlerName = attr.expression.callee.name;\r\n }\r\n }\r\n\r\n if (handlerName) {\r\n modalInfo.onsubmitHandler = handlerName;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n modalHandlers.set(modalId, modalInfo);\r\n }\r\n }\r\n return; // Don't process <components> as regular elements\r\n }\r\n\r\n // Find name attribute\r\n const nameAttr = attributes.find((attr: any) =>\r\n attr.type === \"Attribute\" && attr.name === \"name\"\r\n );\r\n\r\n // Check if element has an onclick/onchange/handler and get the handler info\r\n let foundHandler: { eventType: string; handlerName: string; inlineCode?: string; isInline?: boolean } | null = null;\r\n\r\n for (const attr of attributes) {\r\n const isEventHandler = attr.type === \"EventHandler\";\r\n const isOnAttribute = attr.type === \"Attribute\" && attr.name && attr.name.startsWith(\"on\");\r\n const isHandlerAttribute = attr.type === \"Attribute\" && attr.name === \"handler\";\r\n\r\n if (isEventHandler || isOnAttribute || isHandlerAttribute) {\r\n // For \"handler\" attribute, use the element type to determine eventType\r\n // button -> onclick, select -> onchange\r\n let eventType = attr.name;\r\n if (isHandlerAttribute) {\r\n const elementName = node.name.toLowerCase();\r\n if (elementName === \"button\") {\r\n eventType = \"onclick\";\r\n } else if (elementName.includes(\"select\")) {\r\n eventType = \"onchange\";\r\n } else {\r\n eventType = \"handler\"; // fallback\r\n }\r\n }\r\n let handlerName = \"\";\r\n let inlineCode: string | undefined;\r\n let isInline = false;\r\n\r\n if (attr.type === \"Attribute\" && Array.isArray(attr.value)) {\r\n const exprValue = attr.value.find((v: any) => v.type === \"ExpressionTag\" || v.type === \"MustacheTag\");\r\n if (exprValue && exprValue.expression) {\r\n if (exprValue.expression.type === \"Identifier\") {\r\n handlerName = exprValue.expression.name;\r\n } else if (exprValue.expression.type === \"CallExpression\" && exprValue.expression.callee) {\r\n handlerName = exprValue.expression.callee.name;\r\n } else if (exprValue.expression.type === \"ArrowFunctionExpression\" || exprValue.expression.type === \"FunctionExpression\") {\r\n // Inline arrow function or function expression - extract the code\r\n isInline = true;\r\n handlerName = `__inline_handler_${inlineHandlerCounter++}`;\r\n // Extract the source code from the expression\r\n const expr = exprValue.expression;\r\n if (expr.start !== undefined && expr.end !== undefined) {\r\n inlineCode = source.substring(expr.start, expr.end);\r\n }\r\n }\r\n }\r\n } else if (attr.expression) {\r\n if (attr.expression.type === \"Identifier\") {\r\n handlerName = attr.expression.name;\r\n } else if (attr.expression.type === \"CallExpression\" && attr.expression.callee) {\r\n handlerName = attr.expression.callee.name;\r\n } else if (attr.expression.type === \"MemberExpression\") {\r\n handlerName = extractMemberExpressionName(attr.expression);\r\n } else if (attr.expression.type === \"ArrowFunctionExpression\" || attr.expression.type === \"FunctionExpression\") {\r\n // Inline arrow function or function expression - extract the code\r\n isInline = true;\r\n handlerName = `__inline_handler_${inlineHandlerCounter++}`;\r\n // Extract the source code from the expression\r\n const expr = attr.expression;\r\n if (expr.start !== undefined && expr.end !== undefined) {\r\n inlineCode = source.substring(expr.start, expr.end);\r\n }\r\n }\r\n }\r\n\r\n if (handlerName) {\r\n foundHandler = { eventType, handlerName, inlineCode, isInline };\r\n // If it's an inline handler, store the code\r\n if (isInline && inlineCode) {\r\n inlineHandlers.set(handlerName, inlineCode);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!foundHandler) return; // No handler found, skip\r\n\r\n let componentName: string;\r\n const isInsideEach = walkContext.eachBlocks.length > 0;\r\n\r\n if (nameAttr) {\r\n componentName = getAttributeValue(nameAttr);\r\n } else {\r\n // No name attribute - generate one\r\n // If inside {#each}, we need a DYNAMIC name using the loop variable\r\n const positionKey = `${node.name.toLowerCase()}_${autoNameCounter++}`;\r\n\r\n if (isInsideEach) {\r\n // Inside {#each} - we'll inject a dynamic name expression\r\n // The actual name will be generated at runtime using loop variables\r\n componentName = `__auto_${positionKey}`;\r\n } else {\r\n // Not in loop - use static deterministic name\r\n // If data is provided, use/store in $autoNames for persistence across re-renders\r\n if (data) {\r\n if (!data.$autoNames) {\r\n data.$autoNames = {};\r\n }\r\n if (!data.$autoNames[positionKey]) {\r\n data.$autoNames[positionKey] = `__auto_${positionKey}`;\r\n }\r\n componentName = data.$autoNames[positionKey];\r\n } else {\r\n componentName = `__auto_${positionKey}`;\r\n }\r\n }\r\n\r\n // Track this element for source injection\r\n elementsNeedingNames.push({\r\n node,\r\n name: componentName,\r\n handlerName: foundHandler.handlerName,\r\n eventType: foundHandler.eventType,\r\n element: node.name.toLowerCase(),\r\n eachContext: isInsideEach ? walkContext.eachBlocks.map(b => ({\r\n iterVar: b.iterVar,\r\n indexVar: b.indexVar,\r\n keyExpr: b.keyExpr\r\n })) : undefined\r\n });\r\n }\r\n\r\n // Add to handlers map\r\n handlers.set(componentName, {\r\n name: componentName,\r\n handlerName: foundHandler.handlerName,\r\n eventType: foundHandler.eventType,\r\n element: node.name.toLowerCase(),\r\n inlineCode: foundHandler.inlineCode,\r\n isInline: foundHandler.isInline,\r\n isDynamicName: isInsideEach,\r\n });\r\n }\r\n });\r\n\r\n // Inject auto-generated names into the source\r\n // Sort by position descending so we don't mess up offsets\r\n let processedSource = source;\r\n const sortedElements = [...elementsNeedingNames].sort((a, b) => b.node.start - a.node.start);\r\n\r\n for (const { node, name, eachContext } of sortedElements) {\r\n // Find the position right after the opening tag name\r\n // e.g., <button ...> -> insert after \"button\"\r\n const tagEnd = node.start + 1 + node.name.length; // +1 for '<'\r\n\r\n let nameAttrValue: string;\r\n\r\n if (eachContext && eachContext.length > 0) {\r\n // Inside {#each} - generate dynamic name expression using loop variables\r\n // Build a unique key from all nested loop contexts\r\n // Priority: item.id > item.name > index\r\n const keyParts: string[] = [name];\r\n\r\n for (let i = 0; i < eachContext.length; i++) {\r\n const ctx = eachContext[i];\r\n // Use index variable if available, otherwise use a property from iter var\r\n if (ctx.indexVar) {\r\n keyParts.push(`\\${${ctx.indexVar}}`);\r\n } else {\r\n // Try common unique identifiers: id, name, key, value\r\n // Using the iter var directly as fallback\r\n keyParts.push(`\\${${ctx.iterVar}?.id ?? ${ctx.iterVar}?.name ?? ${ctx.iterVar}?.key ?? ${ctx.iterVar}?.value ?? JSON.stringify(${ctx.iterVar}).slice(0,20)}`);\r\n }\r\n }\r\n\r\n // Use backtick template literal for dynamic name\r\n nameAttrValue = `{\\`${keyParts.join('_')}\\`}`;\r\n } else {\r\n // Static name - use quotes\r\n nameAttrValue = `\"${name}\"`;\r\n }\r\n\r\n processedSource = processedSource.slice(0, tagEnd) + ` name=${nameAttrValue}` + processedSource.slice(tagEnd);\r\n }\r\n\r\n // Extract declared props from $props() destructuring\r\n const declaredProps: string[] = [];\r\n const propsWithDefaults: string[] = [];\r\n const propsMatch = scriptContent.match(/(?:const|let)\\s+\\{([\\s\\S]*?)\\}\\s*=\\s*\\$props\\(\\)/);\r\n if (propsMatch) {\r\n const propsContent = propsMatch[1];\r\n // Remove comments first\r\n const cleanedContent = propsContent\r\n .replace(/\\/\\/.*$/gm, '')\r\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\r\n const props = parsePropsContent(cleanedContent);\r\n for (const prop of props) {\r\n if (prop.name) {\r\n declaredProps.push(prop.name);\r\n if (prop.defaultValue !== undefined) {\r\n propsWithDefaults.push(prop.name);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Extract declared function names\r\n const declaredFunctions: string[] = [];\r\n const funcRegex = /(?:async\\s+)?function\\s+(\\w+)\\s*\\(/g;\r\n let funcMatch;\r\n while ((funcMatch = funcRegex.exec(scriptContent)) !== null) {\r\n declaredFunctions.push(funcMatch[1]);\r\n }\r\n // Also match arrow functions assigned to variables: const/let/var name = (async) () =>\r\n const arrowRegex = /(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\([^)]*\\)\\s*=>/g;\r\n while ((funcMatch = arrowRegex.exec(scriptContent)) !== null) {\r\n declaredFunctions.push(funcMatch[1]);\r\n }\r\n\r\n return {\r\n handlers,\r\n modalHandlers,\r\n scriptContent,\r\n processedSource,\r\n declaredProps,\r\n propsWithDefaults,\r\n declaredFunctions,\r\n inlineHandlers\r\n };\r\n}\r\n\r\n/**\r\n * Extract the full name from a MemberExpression (e.g., obj.method)\r\n */\r\nfunction extractMemberExpressionName(expr: any): string {\r\n if (expr.type === \"Identifier\") {\r\n return expr.name;\r\n }\r\n if (expr.type === \"MemberExpression\") {\r\n const object = extractMemberExpressionName(expr.object);\r\n const property = expr.property.name || expr.property.value;\r\n return `${object}.${property}`;\r\n }\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Get the value from an attribute\r\n */\r\nfunction getAttributeValue(attr: any): string {\r\n if (!attr.value) return \"\";\r\n\r\n if (Array.isArray(attr.value)) {\r\n // Static text value\r\n if (attr.value[0]?.type === \"Text\") {\r\n return attr.value[0].data;\r\n }\r\n // Expression value\r\n if (attr.value[0]?.expression) {\r\n return extractExpressionValue(attr.value[0].expression);\r\n }\r\n }\r\n\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Extract value from an expression\r\n */\r\nfunction extractExpressionValue(expr: any): string {\r\n if (expr.type === \"Identifier\") {\r\n return expr.name;\r\n }\r\n if (expr.type === \"Literal\") {\r\n return String(expr.value);\r\n }\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Parse $props() destructuring content with proper brace/bracket counting\r\n * Handles nested objects like: { name, options = { a: 1, b: [1, 2] }, count = 0 }\r\n */\r\nfunction parsePropsContent(content: string): Array<{ name: string; defaultValue?: string }> {\r\n const props: Array<{ name: string; defaultValue?: string }> = [];\r\n let current = '';\r\n let braceCount = 0;\r\n let bracketCount = 0;\r\n let parenCount = 0;\r\n let inString: string | null = null;\r\n\r\n for (let i = 0; i <= content.length; i++) {\r\n const char = content[i];\r\n const prevChar = i > 0 ? content[i - 1] : '';\r\n\r\n // Handle string boundaries\r\n if ((char === '\"' || char === \"'\" || char === '`') && prevChar !== '\\\\') {\r\n if (inString === char) {\r\n inString = null;\r\n } else if (!inString) {\r\n inString = char;\r\n }\r\n }\r\n\r\n // Only process structural characters when not in a string\r\n if (!inString) {\r\n if (char === '{') braceCount++;\r\n else if (char === '}') braceCount--;\r\n else if (char === '[') bracketCount++;\r\n else if (char === ']') bracketCount--;\r\n else if (char === '(') parenCount++;\r\n else if (char === ')') parenCount--;\r\n\r\n // Split on comma only when at top level (no nested braces/brackets/parens)\r\n if ((char === ',' || i === content.length) && braceCount === 0 && bracketCount === 0 && parenCount === 0) {\r\n const trimmed = current.trim();\r\n if (trimmed) {\r\n // Parse \"name = defaultValue\" or just \"name\"\r\n const equalsIndex = trimmed.indexOf('=');\r\n if (equalsIndex > 0) {\r\n const name = trimmed.substring(0, equalsIndex).trim();\r\n const defaultValue = trimmed.substring(equalsIndex + 1).trim();\r\n props.push({ name, defaultValue });\r\n } else {\r\n props.push({ name: trimmed });\r\n }\r\n }\r\n current = '';\r\n continue;\r\n }\r\n }\r\n\r\n if (i < content.length) {\r\n current += char;\r\n }\r\n }\r\n\r\n return props;\r\n}\r\n\r\n/**\r\n * Validate a Svelte component and return warnings\r\n * Call this during development/registration to catch potential issues early\r\n */\r\nexport function validateSvelteComponent(\r\n componentInfo: SvelteComponentInfo,\r\n data: Record<string, any> = {},\r\n componentName: string = 'unknown'\r\n): SvelteValidationWarning[] {\r\n const warnings: SvelteValidationWarning[] = [];\r\n\r\n // Skip internal props/data keys (used by the framework)\r\n const internalKeys = ['$ref', '$unRef', '__unRefWrapped__', '$autoNames', 'data'];\r\n\r\n // 1. Check for props declared but not provided in data (missing required data)\r\n // Skip props that have default values - they don't require data\r\n for (const prop of componentInfo.declaredProps) {\r\n if (internalKeys.includes(prop)) continue;\r\n if (componentInfo.propsWithDefaults.includes(prop)) continue; // Has default, not required\r\n if (!(prop in data)) {\r\n warnings.push({\r\n type: 'missing-data',\r\n message: `[${componentName}] Prop \"${prop}\" is declared in $props() without a default value but not provided in data`,\r\n details: `Add \"${prop}\" to your data object or provide a default value in $props()`\r\n });\r\n }\r\n }\r\n\r\n // 2. Check for data provided but not declared in props (potential typo or unused)\r\n for (const key of Object.keys(data)) {\r\n if (internalKeys.includes(key)) continue;\r\n if (key.startsWith('$')) continue; // Skip all $-prefixed internal keys\r\n if (!componentInfo.declaredProps.includes(key)) {\r\n warnings.push({\r\n type: 'unused-data',\r\n message: `[${componentName}] Data key \"${key}\" is provided but not declared in $props()`,\r\n details: `This data won't be accessible in the component. Add it to $props() destructuring.`\r\n });\r\n }\r\n }\r\n\r\n // 3. Check for undefined handlers referenced in elements\r\n // Skip inline handlers (they are extracted from template, not defined in script)\r\n for (const [elementName, handlerInfo] of componentInfo.handlers) {\r\n // Skip inline handlers - they are defined in the template, not the script\r\n if (handlerInfo.isInline) continue;\r\n if (!componentInfo.declaredFunctions.includes(handlerInfo.handlerName)) {\r\n warnings.push({\r\n type: 'undefined-handler',\r\n message: `[${componentName}] Handler \"${handlerInfo.handlerName}\" referenced by <${handlerInfo.element} name=\"${elementName}\"> is not defined`,\r\n details: `Make sure to define \"function ${handlerInfo.handlerName}(ctx) { ... }\" in your script`\r\n });\r\n }\r\n }\r\n\r\n // 4. Check for undefined modal submit handlers\r\n for (const [modalId, modalInfo] of componentInfo.modalHandlers) {\r\n if (modalInfo.onsubmitHandler && !componentInfo.declaredFunctions.includes(modalInfo.onsubmitHandler)) {\r\n warnings.push({\r\n type: 'undefined-handler',\r\n message: `[${componentName}] Modal submit handler \"${modalInfo.onsubmitHandler}\" for modal \"${modalId}\" is not defined`,\r\n details: `Make sure to define \"function ${modalInfo.onsubmitHandler}(ctx, fields) { ... }\" in your script`\r\n });\r\n }\r\n }\r\n\r\n // 5. Check for modal handler signatures (ctx parameter is optional for regular handlers)\r\n // Only modal handlers MUST have fields parameter to access submitted data\r\n const handlerFunctionRegex = /(?:async\\s+)?function\\s+(\\w+)\\s*\\(\\s*(\\w*)\\s*(?:,\\s*(\\w+))?\\s*\\)/g;\r\n let match;\r\n const scriptContent = componentInfo.scriptContent;\r\n\r\n while ((match = handlerFunctionRegex.exec(scriptContent)) !== null) {\r\n const funcName = match[1];\r\n const firstParam = match[2];\r\n const secondParam = match[3];\r\n\r\n // Only check modal handlers - they need 'fields' param to access form data\r\n const isModalHandler = Array.from(componentInfo.modalHandlers.values()).some(m => m.onsubmitHandler === funcName);\r\n\r\n if (isModalHandler && !secondParam) {\r\n warnings.push({\r\n type: 'syntax-error',\r\n message: `[${componentName}] Modal handler \"${funcName}\" should have \"ctx\" and \"fields\" parameters`,\r\n details: `Change to \"function ${funcName}(ctx, fields) { ... }\" to receive submitted form data`\r\n });\r\n }\r\n }\r\n\r\n // 6. Check for common template mistakes\r\n const templateContent = componentInfo.processedSource;\r\n\r\n // Check for onclick= without braces (common mistake)\r\n const badOnClickRegex = /onclick\\s*=\\s*[\"']([^\"']+)[\"']/gi;\r\n while ((match = badOnClickRegex.exec(templateContent)) !== null) {\r\n if (!match[1].startsWith('{')) {\r\n warnings.push({\r\n type: 'syntax-error',\r\n message: `[${componentName}] onclick handler should use curly braces: onclick={${match[1]}}`,\r\n details: `String values are not valid for event handlers. Use onclick={handlerName} syntax.`\r\n });\r\n }\r\n }\r\n\r\n // Check for undefined variables in {expression} blocks (basic check)\r\n const expressionRegex = /\\{([^}]+)\\}/g;\r\n const knownIdentifiers = new Set([\r\n ...componentInfo.declaredProps,\r\n ...componentInfo.declaredFunctions,\r\n // Common Svelte/JS globals\r\n 'true', 'false', 'null', 'undefined', 'console', 'Math', 'JSON', 'Array', 'Object',\r\n 'Date', 'Number', 'String', 'Boolean', 'Promise', 'Map', 'Set',\r\n // Common Svelte constructs\r\n '#if', '/if', '#each', '/each', '#await', '/await', ':else', ':then', ':catch',\r\n '@html', '@debug', '@const'\r\n ]);\r\n\r\n // Add variables from script (let, const, var declarations)\r\n const varDeclRegex = /(?:let|const|var)\\s+(\\w+)/g;\r\n while ((match = varDeclRegex.exec(scriptContent)) !== null) {\r\n knownIdentifiers.add(match[1]);\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\n/**\r\n * Log validation warnings to console with colors\r\n */\r\nexport function logValidationWarnings(warnings: SvelteValidationWarning[]): void {\r\n if (warnings.length === 0) return;\r\n\r\n console.warn(`\\n⚠️ Svelte Component Validation Warnings (${warnings.length}):`);\r\n\r\n for (const warning of warnings) {\r\n const icon = warning.type === 'missing-data' ? '❌' :\r\n warning.type === 'unused-data' ? '⚠️' :\r\n warning.type === 'undefined-handler' ? '🔗' :\r\n warning.type === 'syntax-error' ? '💥' : '⚡';\r\n\r\n console.warn(` ${icon} ${warning.message}`);\r\n if (warning.details) {\r\n console.warn(` └─ ${warning.details}`);\r\n }\r\n }\r\n console.warn('');\r\n}\r\n\r\nexport interface HandlerContextResult {\r\n handlers: Record<string, Function>;\r\n effects: Function[];\r\n runEffects: () => void;\r\n hasPendingRender: () => boolean;\r\n flushRender: () => Promise<void>;\r\n wrappedCtx: any; // Proxy-wrapped ctx for passing to handlers\r\n // Lifecycle hooks\r\n mountCallbacks: Function[];\r\n destroyCallbacks: Function[];\r\n preRenderCallbacks: Function[];\r\n afterRenderCallbacks: Function[];\r\n runMount: () => void;\r\n runDestroy: () => void;\r\n runPreRender: () => Promise<void>;\r\n runAfterRender: () => void;\r\n // Handler execution tracking\r\n setInHandler: (value: boolean) => void;\r\n // Manual render function\r\n render: (immediate?: boolean) => Promise<void>;\r\n}\r\n\r\n/**\r\n * Parse import statements from script and extract module info\r\n */\r\ninterface ImportInfo {\r\n moduleName: string;\r\n imports: { name: string; alias?: string }[];\r\n isDefault: boolean;\r\n defaultName?: string;\r\n}\r\n\r\nfunction parseImports(script: string): { imports: ImportInfo[]; cleanedScript: string } {\r\n const imports: ImportInfo[] = [];\r\n\r\n // Match: import { a, b as c } from \"module\"\r\n // Match: import name from \"module\"\r\n // Match: import * as name from \"module\"\r\n const importRegex = /import\\s+(?:(\\w+)\\s*,?\\s*)?(?:\\{\\s*([^}]+)\\s*\\})?(?:\\*\\s+as\\s+(\\w+))?\\s+from\\s+[\"']([^\"']+)[\"'];?/g;\r\n\r\n let cleanedScript = script;\r\n let match;\r\n\r\n while ((match = importRegex.exec(script)) !== null) {\r\n const [fullMatch, defaultImport, namedImports, namespaceImport, moduleName] = match;\r\n\r\n // Skip svelte internal imports - we provide these ourselves\r\n if (moduleName === 'svelte' || moduleName.startsWith('svelte/')) {\r\n cleanedScript = cleanedScript.replace(fullMatch, '');\r\n continue;\r\n }\r\n\r\n const importInfo: ImportInfo = {\r\n moduleName,\r\n imports: [],\r\n isDefault: false\r\n };\r\n\r\n // Default import: import name from \"module\"\r\n if (defaultImport) {\r\n importInfo.isDefault = true;\r\n importInfo.defaultName = defaultImport;\r\n }\r\n\r\n // Namespace import: import * as name from \"module\"\r\n if (namespaceImport) {\r\n importInfo.isDefault = true;\r\n importInfo.defaultName = namespaceImport;\r\n }\r\n\r\n // Named imports: import { a, b as c } from \"module\"\r\n if (namedImports) {\r\n const parts = namedImports.split(',').map(s => s.trim()).filter(Boolean);\r\n for (const part of parts) {\r\n const aliasMatch = part.match(/^(\\w+)\\s+as\\s+(\\w+)$/);\r\n if (aliasMatch) {\r\n importInfo.imports.push({ name: aliasMatch[1], alias: aliasMatch[2] });\r\n } else {\r\n importInfo.imports.push({ name: part });\r\n }\r\n }\r\n }\r\n\r\n imports.push(importInfo);\r\n cleanedScript = cleanedScript.replace(fullMatch, '');\r\n }\r\n\r\n return { imports, cleanedScript };\r\n}\r\n\r\n/**\r\n * Load modules and create injection variables\r\n */\r\nfunction loadModules(imports: ImportInfo[], sourceDir?: string): { modules: Record<string, any>; varDeclarations: string } {\r\n const modules: Record<string, any> = {};\r\n const declarations: string[] = [];\r\n const path = require(\"path\");\r\n\r\n for (const importInfo of imports) {\r\n try {\r\n // Resolve relative paths from source file directory\r\n const resolvedPath = importInfo.moduleName.startsWith('.') && sourceDir\r\n ? path.resolve(sourceDir, importInfo.moduleName)\r\n : importInfo.moduleName;\r\n // Try to require the module\r\n const mod = require(resolvedPath);\r\n\r\n if (importInfo.isDefault && importInfo.defaultName) {\r\n // Default or namespace import\r\n modules[importInfo.defaultName] = mod.default || mod;\r\n declarations.push(`var ${importInfo.defaultName} = __modules__[\"${importInfo.defaultName}\"];`);\r\n }\r\n\r\n // Named imports\r\n for (const imp of importInfo.imports) {\r\n const varName = imp.alias || imp.name;\r\n modules[varName] = mod[imp.name];\r\n declarations.push(`var ${varName} = __modules__[\"${varName}\"];`);\r\n }\r\n } catch (err) {\r\n // Module import failed\r\n }\r\n }\r\n\r\n return { modules, varDeclarations: declarations.join('\\n') };\r\n}\r\n\r\n/**\r\n * Create a handler context from script content\r\n * This evaluates the Svelte script and returns the handler functions and effects\r\n * @param sourceDir - The directory of the source file (used for resolving relative imports)\r\n * @param inlineHandlers - Map of inline handler names to their source code (extracted from template)\r\n */\r\nexport function createHandlerContext(scriptContent: string, initialData: Record<string, any> = {}, component?: any, ctx?: any, sourceDir?: string, inlineHandlers?: Map<string, string>): HandlerContextResult {\r\n const handlers: Record<string, Function> = {};\r\n const effects: Function[] = [];\r\n\r\n try {\r\n // Parse and extract imports first\r\n const { imports, cleanedScript } = parseImports(scriptContent);\r\n const { modules, varDeclarations } = loadModules(imports, sourceDir);\r\n\r\n // Extract only function declarations from the script\r\n const functionNames = extractFunctionNames(cleanedScript);\r\n\r\n // Extract $effect calls and convert them to collectable functions\r\n const effectBodies = extractEffectBodies(cleanedScript);\r\n\r\n // Process script to be safe for evaluation:\r\n // 1. Remove reactive declarations (let x = $state(...))\r\n // 2. Remove $props destructuring\r\n // 3. Convert $effect to __registerEffect__\r\n // 4. Keep only function declarations\r\n\r\n // First, remove comments from the script to avoid regex issues with braces in comments\r\n let scriptWithoutComments = cleanedScript\r\n // Remove single-line comments (but preserve the newline)\r\n .replace(/\\/\\/.*$/gm, '')\r\n // Remove multi-line comments\r\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\r\n\r\n let processedScript = scriptWithoutComments\r\n // Remove $state declarations completely or make them var\r\n .replace(/(?:const|let)\\s+(\\w+)\\s*=\\s*\\$state\\(([^)]*)\\);?/g, 'var $1 = $2;')\r\n // Remove $derived declarations but keep the value\r\n .replace(/(?:const|let)\\s+(\\w+)\\s*=\\s*\\$derived\\(([^)]+)\\);?/g, 'var $1 = $2;')\r\n // Convert $effect calls to __registerEffect__ calls\r\n .replace(/\\$effect\\s*\\(\\s*((?:function\\s*\\([^)]*\\)|\\([^)]*\\)\\s*=>|\\(\\)\\s*=>)[^}]*\\{[\\s\\S]*?\\}\\s*)\\);?/g, '__registerEffect__($1);')\r\n // Simpler $effect pattern: $effect(() => { ... })\r\n .replace(/\\$effect\\s*\\(\\s*\\(\\)\\s*=>\\s*\\{([\\s\\S]*?)\\}\\s*\\);?/g, '__registerEffect__(function() {$1});');\r\n\r\n // Handle $props destructuring with proper brace counting (supports nested objects like { options = { a: 1 } })\r\n processedScript = processedScript.replace(/(?:const|let)\\s+\\{([\\s\\S]*?)\\}\\s*=\\s*\\$props\\(\\);?/g, (match) => {\r\n // Find the opening brace after 'const' or 'let'\r\n const letIndex = match.indexOf('{');\r\n if (letIndex === -1) return match;\r\n\r\n // Use brace counting to find the matching closing brace\r\n let braceCount = 0;\r\n let startIndex = letIndex;\r\n let endIndex = -1;\r\n\r\n for (let i = startIndex; i < match.length; i++) {\r\n if (match[i] === '{') braceCount++;\r\n else if (match[i] === '}') {\r\n braceCount--;\r\n if (braceCount === 0) {\r\n endIndex = i;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (endIndex === -1) return match;\r\n\r\n // Extract the content between braces\r\n const content = match.substring(startIndex + 1, endIndex);\r\n\r\n // Parse props with proper handling of nested braces\r\n const props = parsePropsContent(content);\r\n\r\n // Generate prop accessors that read from data at access time\r\n // Use a special pattern: define both the initial var AND a __propGetters__ object\r\n // that inline handlers can use to get current values\r\n const propDefs = props.map(prop => {\r\n if (!prop.name || prop.name === 'data') return '';\r\n if (prop.defaultValue !== undefined) {\r\n return `var ${prop.name} = data.${prop.name} ?? ${prop.defaultValue}; __propGetters__.${prop.name} = function() { return data.${prop.name} ?? ${prop.defaultValue}; };`;\r\n }\r\n return `var ${prop.name} = data.${prop.name}; __propGetters__.${prop.name} = function() { return data.${prop.name}; };`;\r\n }).filter(Boolean).join('\\n');\r\n\r\n return propDefs;\r\n });\r\n\r\n // Add module variable declarations at the beginning of processed script\r\n if (varDeclarations) {\r\n processedScript = varDeclarations + '\\n\\n' + processedScript;\r\n }\r\n\r\n // Wrap everything in an IIFE that takes data and component as parameters\r\n // This ensures data and 'this' are always available in the function scope\r\n // Also provides helper functions: render(), update() and rerender()\r\n // Data is wrapped in a Proxy for automatic reactivity\r\n // Interaction methods (reply, followUp, deferReply) are wrapped to auto-render after completion\r\n const wrappedScript = `\r\n return function(__data__, __component__, __ctx__, __modules__) {\r\n __modules__ = __modules__ || {};\r\n var self = __component__;\r\n var __effects__ = [];\r\n var __renderPending__ = false;\r\n var __autoRenderEnabled__ = true;\r\n var __hasDataChanges__ = false;\r\n \r\n // Prop getters for accessing current data values (used by inline handlers)\r\n var __propGetters__ = {};\r\n \r\n // Lifecycle callbacks\r\n var __mountCallbacks__ = [];\r\n var __destroyCallbacks__ = [];\r\n var __preRenderCallbacks__ = [];\r\n var __afterRenderCallbacks__ = [];\r\n var __isMounted__ = false;\r\n \r\n // Store last message reference for background updates (intervals, timeouts)\r\n var __lastMessage__ = __ctx__?.interaction?.message || null;\r\n \r\n // Throttle configuration\r\n var __throttleMinInterval__ = 250; // Minimum ms between renders\r\n var __lastRenderTime__ = 0;\r\n var __pendingRenderTimeout__ = null;\r\n var __isRateLimited__ = false;\r\n var __rateLimitEndTime__ = 0;\r\n \r\n function __registerEffect__(fn) {\r\n __effects__.push(fn);\r\n }\r\n \r\n // Lifecycle: onMount - called when component is first rendered\r\n // If callback returns a function, that function is called on destroy\r\n function onMount(fn) {\r\n __mountCallbacks__.push(fn);\r\n }\r\n \r\n // Lifecycle: onDestroy - called when ref is cleaned up\r\n function onDestroy(fn) {\r\n __destroyCallbacks__.push(fn);\r\n }\r\n \r\n // Lifecycle: onPreRender - called before each render (async, awaited)\r\n function onPreRender(fn) {\r\n __preRenderCallbacks__.push(fn);\r\n }\r\n \r\n // Lifecycle: onAfterRender - called after each render completes\r\n function onAfterRender(fn) {\r\n __afterRenderCallbacks__.push(fn);\r\n }\r\n \r\n // Run all pre-render callbacks (async)\r\n async function __runPreRender__() {\r\n for (var i = 0; i < __preRenderCallbacks__.length; i++) {\r\n try {\r\n await __preRenderCallbacks__[i]();\r\n } catch (err) {\r\n console.error(\"[DBI-Svelte] Pre-render callback failed:\", err);\r\n throw err;\r\n }\r\n }\r\n }\r\n \r\n // Run all after-render callbacks\r\n function __runAfterRender__() {\r\n for (var i = 0; i < __afterRenderCallbacks__.length; i++) {\r\n try {\r\n __afterRenderCallbacks__[i]();\r\n } catch (err) {\r\n console.error(\"[DBI-Svelte] After-render callback failed:\", err);\r\n throw err;\r\n }\r\n }\r\n }\r\n \r\n // Modal store - stores rendered modal definitions\r\n var __modals__ = new Map();\r\n \r\n // Register a modal (called internally when modals are parsed)\r\n function __registerModal__(modalId, modalDef) {\r\n __modals__.set(modalId, modalDef);\r\n }\r\n \r\n // Show a modal by ID and return a Promise that resolves with the submitted fields\r\n // Modal definitions are rendered from <components type=\"modal\" id=\"xxx\">\r\n // Usage: \r\n // await showModal(\"edit-product\"); // Just show, use onsubmit handler\r\n // const { fields, interaction } = await showModal(\"edit-product\"); // Get response\r\n // await showModal(\"edit-product\", { timeout: 60000 }); // 60 second timeout\r\n // await showModal(\"edit-product\", { timeout: 0 }); // No timeout (unlimited)\r\n function showModal(modalId, options) {\r\n if (!__ctx__ || !__ctx__.interaction) {\r\n return Promise.reject(new Error(\"showModal requires an interaction context\"));\r\n }\r\n \r\n // Default timeout: 10 minutes (600000ms), 0 = no timeout\r\n var timeout = (options && typeof options.timeout === 'number') ? options.timeout : 600000;\r\n \r\n // Disable auto-render IMMEDIATELY since we're showing a modal\r\n // This prevents flushRender from trying to update after modal is shown\r\n __autoRenderEnabled__ = false;\r\n __asyncInteractionCalled__ = true;\r\n \r\n // Create a promise that will be resolved when modal is submitted\r\n return new Promise(async function(resolve, reject) {\r\n var timeoutId = null;\r\n var modal = null;\r\n \r\n try {\r\n // Re-render to get latest modal definitions (reactive)\r\n var renderResult = await __component__.toJSON({ data: __data__ });\r\n \r\n // Get modals from the render result stored on component\r\n var modals = __component__.__lastRenderModals__;\r\n if (!modals) {\r\n reject(new Error(\"No modals defined in this component. Use <components type=\\\\\"modal\\\\\" id=\\\\\"...\\\\\">\")); \r\n return;\r\n }\r\n \r\n modal = modals.get(modalId);\r\n if (!modal) {\r\n reject(new Error(\"Modal '\" + modalId + \"' not found. Available modals: \" + Array.from(modals.keys()).join(\", \")));\r\n return;\r\n }\r\n \r\n // Wrapped resolve/reject to clear timeout\r\n var wrappedResolve = function(result) {\r\n if (timeoutId) clearTimeout(timeoutId);\r\n resolve(result);\r\n };\r\n var wrappedReject = function(error) {\r\n if (timeoutId) clearTimeout(timeoutId);\r\n reject(error);\r\n };\r\n \r\n // Store the promise resolver in component's pending modals map\r\n // This will be resolved when modal submit interaction is received\r\n __component__._pendingModals.set(modal.customId, { resolve: wrappedResolve, reject: wrappedReject });\r\n \r\n // Set up timeout if enabled (timeout > 0)\r\n if (timeout > 0) {\r\n timeoutId = setTimeout(function() {\r\n // Clean up pending modal\r\n __component__._pendingModals.delete(modal.customId);\r\n reject(new Error(\"Modal '\" + modalId + \"' timed out after \" + timeout + \"ms\"));\r\n }, timeout);\r\n }\r\n \r\n // Show the modal using the interaction\r\n var i = __ctx__.interaction;\r\n \r\n // Modal must be shown immediately - no deferral allowed\r\n await i.showModal({\r\n title: modal.title,\r\n customId: modal.customId,\r\n components: modal.components\r\n });\r\n \r\n // Note: Promise resolves later when modal is submitted\r\n // If you don't await for the response, the promise just hangs (which is fine)\r\n } catch (err) {\r\n // Clean up pending modal and timeout if show failed\r\n if (timeoutId) clearTimeout(timeoutId);\r\n if (modal && modal.customId) {\r\n __component__._pendingModals.delete(modal.customId);\r\n }\r\n reject(new Error(\"Failed to show modal: \" + (err.message || err)));\r\n }\r\n });\r\n }\r\n \r\n // Rate-limit aware edit function with retry and enhanced error handling\r\n function __safeEdit__(editFn, retryCount, componentsForError) {\r\n retryCount = retryCount || 0;\r\n var maxRetries = 3;\r\n \r\n return editFn().then(function(result) {\r\n return result;\r\n }).catch(function(err) {\r\n // Check for rate limit (429)\r\n if (err.status === 429 || (err.message && err.message.includes('rate limit'))) {\r\n var retryAfter = err.retry_after || err.retryAfter || 1;\r\n __isRateLimited__ = true;\r\n __rateLimitEndTime__ = Date.now() + (retryAfter * 1000);\r\n \r\n return new Promise(function(resolve) {\r\n setTimeout(function() {\r\n __isRateLimited__ = false;\r\n if (retryCount < maxRetries) {\r\n resolve(__safeEdit__(editFn, retryCount + 1, componentsForError));\r\n } else {\r\n resolve();\r\n }\r\n }, retryAfter * 1000);\r\n });\r\n }\r\n \r\n // Check if it's a component validation error and enhance it\r\n if (err.code === 50035 || err.rawError?.code === 50035 || \r\n (err.message && (err.message.includes('Invalid Form Body') || err.message.includes('BASE_TYPE')))) {\r\n // Create enhanced error message\r\n var errorMsg = err.message || '';\r\n var enhancedMsg = '\\\\n╔══════════════════════════════════════════════════════════════╗\\\\n';\r\n enhancedMsg += '║ Discord Components V2 Validation Error ║\\\\n';\r\n enhancedMsg += '╠══════════════════════════════════════════════════════════════╣\\\\n';\r\n \r\n // Parse error paths from message\r\n var errorLines = errorMsg.split('\\\\n');\r\n for (var i = 0; i < errorLines.length; i++) {\r\n var line = errorLines[i];\r\n var match = line.match(/([\\\\w\\\\[\\\\]\\\\.]+)\\\\[([A-Z_]+)\\\\]:\\\\s*(.+)/);\r\n if (match) {\r\n var path = match[1];\r\n var code = match[2];\r\n var msg = match[3];\r\n \r\n enhancedMsg += '║\\\\n';\r\n enhancedMsg += '║ ❌ Path: ' + path + '\\\\n';\r\n enhancedMsg += '║ ├─ Code: ' + code + '\\\\n';\r\n enhancedMsg += '║ ├─ Message: ' + msg + '\\\\n';\r\n \r\n // Add helpful hints based on error code\r\n if (code === 'BASE_TYPE_REQUIRED') {\r\n enhancedMsg += '║ └─ Fix: This field is required - check if the element has all required attributes\\\\n';\r\n } else if (code === 'BASE_TYPE_BAD_LENGTH') {\r\n enhancedMsg += '║ └─ Fix: Wrong number of items - Discord has min/max limits for components\\\\n';\r\n } else if (code.includes('MAX_LENGTH') || code.includes('MIN_LENGTH')) {\r\n enhancedMsg += '║ └─ Fix: Content length issue - adjust text or number of items\\\\n';\r\n }\r\n }\r\n }\r\n \r\n enhancedMsg += '║\\\\n';\r\n enhancedMsg += '╚══════════════════════════════════════════════════════════════╝';\r\n \r\n var enhancedError = new Error('[DBI-Svelte] Component validation error:\\\\n' + enhancedMsg + '\\\\n\\\\nOriginal: ' + errorMsg);\r\n enhancedError.originalError = err;\r\n enhancedError.type = 'discord-component-validation';\r\n throw enhancedError;\r\n }\r\n \r\n // Re-throw other errors\r\n throw err;\r\n });\r\n }\r\n \r\n // Throttled render - ensures minimum interval between renders\r\n function __throttledRender__(immediate) {\r\n var now = Date.now();\r\n var timeSinceLastRender = now - __lastRenderTime__;\r\n var waitTime = 0;\r\n \r\n // If rate limited, calculate wait time\r\n if (__isRateLimited__ && __rateLimitEndTime__ > now) {\r\n waitTime = Math.max(waitTime, __rateLimitEndTime__ - now);\r\n }\r\n \r\n // If within throttle interval, schedule for later\r\n if (!immediate && timeSinceLastRender < __throttleMinInterval__) {\r\n waitTime = Math.max(waitTime, __throttleMinInterval__ - timeSinceLastRender);\r\n }\r\n \r\n // Clear any pending render\r\n if (__pendingRenderTimeout__) {\r\n clearTimeout(__pendingRenderTimeout__);\r\n __pendingRenderTimeout__ = null;\r\n }\r\n \r\n if (waitTime > 0) {\r\n return new Promise(function(resolve) {\r\n __pendingRenderTimeout__ = setTimeout(function() {\r\n __pendingRenderTimeout__ = null;\r\n __lastRenderTime__ = Date.now();\r\n resolve(__executeRender__());\r\n }, waitTime);\r\n });\r\n }\r\n \r\n __lastRenderTime__ = now;\r\n return __executeRender__();\r\n }\r\n \r\n // Actual render execution\r\n async function __executeRender__() {\r\n // Run pre-render callbacks (async, awaited)\r\n await __runPreRender__();\r\n \r\n var components = await __component__.toJSON({ data: __data__ });\r\n var result;\r\n \r\n // Try to use current interaction if available\r\n if (__ctx__ && __ctx__.interaction) {\r\n try {\r\n var i = __ctx__.interaction;\r\n \r\n // Update last message reference\r\n if (i.message) {\r\n __lastMessage__ = i.message;\r\n }\r\n \r\n // Check if interaction was deferred (our flag) or Discord.js flags\r\n if (i.replied || i.deferred || __interactionDeferred__) {\r\n // Already replied/deferred, use message.edit with rate limit handling\r\n result = await __safeEdit__(function() {\r\n return i.message.edit({\r\n components: components,\r\n flags: [\"IsComponentsV2\"],\r\n });\r\n }, 0, components);\r\n } else {\r\n // Not replied yet, use update with rate limit handling\r\n result = await __safeEdit__(function() {\r\n return i.update({\r\n components: components,\r\n flags: [\"IsComponentsV2\"],\r\n });\r\n }, 0, components);\r\n }\r\n \r\n // Run after-render callbacks\r\n __runAfterRender__();\r\n return result;\r\n } catch (err) {\r\n console.error(\"[DBI-Svelte] Render failed:\", err);\r\n throw err;\r\n }\r\n }\r\n \r\n // Fallback: Use last message reference (for intervals/timeouts outside interaction)\r\n if (__lastMessage__) {\r\n result = await __safeEdit__(function() {\r\n return __lastMessage__.edit({\r\n components: components,\r\n flags: [\"IsComponentsV2\"],\r\n });\r\n }, 0, components);\r\n \r\n // Run after-render callbacks\r\n __runAfterRender__();\r\n return result;\r\n }\r\n \r\n return Promise.resolve();\r\n }\r\n \r\n // Helper: Auto-detect whether to use update() or rerender()\r\n // If interaction was already replied/deferred, use message.edit\r\n // Otherwise use interaction.update\r\n function render(immediate) {\r\n return __throttledRender__(immediate);\r\n }\r\n \r\n // Track if we're inside a handler execution\r\n var __inHandlerExecution__ = false;\r\n \r\n // Track pending low-priority updates (from intervals/timeouts)\r\n var __pendingLowPriorityRender__ = false;\r\n \r\n // Mark that we have pending data changes\r\n function __markDataChanged__() {\r\n __hasDataChanges__ = true;\r\n \r\n // If we're NOT inside a handler (e.g., interval/timeout), trigger render immediately\r\n // The throttle will prevent too many renders\r\n if (!__inHandlerExecution__ && __autoRenderEnabled__ && __lastMessage__) {\r\n __hasDataChanges__ = false;\r\n __throttledRender__(false);\r\n }\r\n }\r\n \r\n // Low-priority update - used for background tasks like intervals\r\n // If a handler is currently running, skip this update (the handler's update will include our changes)\r\n function lowPriorityUpdate(callback) {\r\n if (__inHandlerExecution__) {\r\n // Handler is running - just update data, skip render\r\n // The handler will render when it finishes\r\n if (callback) callback();\r\n return;\r\n }\r\n \r\n // No handler running - proceed with update\r\n if (callback) callback();\r\n }\r\n \r\n // Flush pending render (called after interaction methods complete)\r\n function __flushRender__() {\r\n if (__hasDataChanges__ && __autoRenderEnabled__) {\r\n __hasDataChanges__ = false;\r\n render();\r\n }\r\n }\r\n \r\n // Create reactive proxy for data\r\n // Also properly forwards Object.keys/values/entries operations\r\n function __createReactiveProxy__(target, path) {\r\n if (typeof target !== 'object' || target === null) return target;\r\n \r\n return new Proxy(target, {\r\n get: function(obj, prop) {\r\n var value = obj[prop];\r\n // Wrap nested objects in proxy too\r\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\r\n return __createReactiveProxy__(value, path + '.' + String(prop));\r\n }\r\n return value;\r\n },\r\n set: function(obj, prop, value) {\r\n var oldValue = obj[prop];\r\n obj[prop] = value;\r\n // Only mark as changed if value actually changed\r\n if (oldValue !== value) {\r\n __markDataChanged__();\r\n }\r\n return true;\r\n },\r\n // Forward Object.keys/values/entries operations\r\n ownKeys: function(target) {\r\n return Reflect.ownKeys(target);\r\n },\r\n getOwnPropertyDescriptor: function(target, prop) {\r\n return Reflect.getOwnPropertyDescriptor(target, prop);\r\n },\r\n has: function(target, prop) {\r\n return Reflect.has(target, prop);\r\n }\r\n });\r\n }\r\n \r\n // Wrap data in reactive proxy\r\n var data = __createReactiveProxy__(__data__, 'data');\r\n \r\n // Track if an async interaction method was called\r\n var __asyncInteractionCalled__ = false;\r\n \r\n // Track if interaction was deferred (deferUpdate/deferReply)\r\n var __interactionDeferred__ = false;\r\n \r\n // Wrap interaction methods to auto-render after completion\r\n var interaction = null;\r\n var ctx = null;\r\n \r\n if (__ctx__ && __ctx__.interaction) {\r\n var originalInteraction = __ctx__.interaction;\r\n \r\n // Create a proxy for interaction that wraps reply/followUp/deferReply\r\n // Also properly forwards Object.keys/values/entries operations\r\n // Uses Reflect.get to properly handle getters with correct 'this' binding\r\n interaction = new Proxy(originalInteraction, {\r\n get: function(target, prop, receiver) {\r\n // Use Reflect.get to properly handle getters (like 'roles', 'users', etc.)\r\n // This ensures 'this' context is correct for Discord.js Collection getters\r\n var value = Reflect.get(target, prop, target);\r\n \r\n // Wrap methods that \"consume\" the interaction (reply, followUp, defer)\r\n if (prop === 'reply' || prop === 'followUp' || prop === 'deferReply' || prop === 'deferUpdate') {\r\n return function() {\r\n // Mark that async interaction was called - this prevents sync flush at handler end\r\n __asyncInteractionCalled__ = true;\r\n \r\n // Mark as deferred for deferUpdate/deferReply\r\n if (prop === 'deferUpdate' || prop === 'deferReply') {\r\n __interactionDeferred__ = true;\r\n }\r\n \r\n var result = value.apply(target, arguments);\r\n // After the reply completes, flush any pending renders using throttled render\r\n if (result && typeof result.then === 'function') {\r\n result.then(function() {\r\n if (__hasDataChanges__ && __autoRenderEnabled__) {\r\n __hasDataChanges__ = false;\r\n // Use throttled render which handles rate limits\r\n __throttledRender__(false);\r\n }\r\n }).catch(function(err) {\r\n console.error(\"[DBI-Svelte] Render after \" + prop + \" failed:\", err);\r\n });\r\n }\r\n return result;\r\n };\r\n }\r\n \r\n // Wrap update method - this one renders directly, no need to flush after\r\n if (prop === 'update') {\r\n return function() {\r\n __autoRenderEnabled__ = false; // Disable auto since we're doing manual update\r\n __asyncInteractionCalled__ = true;\r\n return value.apply(target, arguments);\r\n };\r\n }\r\n \r\n // Bind functions to original target\r\n if (typeof value === 'function') {\r\n return value.bind(target);\r\n }\r\n \r\n return value;\r\n },\r\n // Forward Object.keys/values/entries operations\r\n ownKeys: function(target) {\r\n return Reflect.ownKeys(target);\r\n },\r\n getOwnPropertyDescriptor: function(target, prop) {\r\n return Reflect.getOwnPropertyDescriptor(target, prop);\r\n },\r\n has: function(target, prop) {\r\n return Reflect.has(target, prop);\r\n }\r\n });\r\n \r\n // Create wrapped ctx with the proxied interaction\r\n // Also properly forwards Object.keys/values/entries operations\r\n ctx = new Proxy(__ctx__, {\r\n get: function(target, prop, receiver) {\r\n if (prop === 'interaction') {\r\n return interaction;\r\n }\r\n // Use Reflect.get for proper getter handling\r\n return Reflect.get(target, prop, target);\r\n },\r\n // Forward Object.keys/values/entries operations\r\n ownKeys: function(target) {\r\n return Reflect.ownKeys(target);\r\n },\r\n getOwnPropertyDescriptor: function(target, prop) {\r\n return Reflect.getOwnPropertyDescriptor(target, prop);\r\n },\r\n has: function(target, prop) {\r\n return Reflect.has(target, prop);\r\n }\r\n });\r\n }\r\n \r\n // Helper: Force update message using interaction.update (for button clicks without reply)\r\n // Helper: Force update message using interaction.update (for button clicks without reply)\r\n async function update() {\r\n if (!__ctx__ || !__ctx__.interaction) {\r\n return Promise.resolve();\r\n }\r\n __autoRenderEnabled__ = false; // Disable auto-render since manual update called\r\n var components = await __component__.toJSON({ data: __data__ });\r\n return __safeEdit__(function() {\r\n return __ctx__.interaction.update({\r\n components: components,\r\n flags: [\"IsComponentsV2\"],\r\n });\r\n });\r\n }\r\n \r\n // Helper: Force re-render message using message.edit (after reply/followUp)\r\n async function rerender() {\r\n if (!__ctx__ || !__ctx__.interaction || !__ctx__.interaction.message) {\r\n return Promise.resolve();\r\n }\r\n __autoRenderEnabled__ = false; // Disable auto-render since manual rerender called\r\n var components = await __component__.toJSON({ data: __data__ });\r\n return __safeEdit__(function() {\r\n return __ctx__.interaction.message.edit({\r\n components: components,\r\n flags: [\"IsComponentsV2\"],\r\n });\r\n });\r\n }\r\n \r\n // Helper: Disable auto-render (for handlers that don't need UI update)\r\n function noRender() {\r\n __autoRenderEnabled__ = false;\r\n }\r\n \r\n // Helper: Set throttle interval (minimum ms between renders)\r\n function setThrottle(ms) {\r\n __throttleMinInterval__ = ms;\r\n }\r\n \r\n // Helper: Destroy this component instance (clears intervals, timers, removes ref)\r\n // Call this when you want to clean up the component manually\r\n function destroy() {\r\n // Run all destroy callbacks (clears intervals, timers, etc.)\r\n __runDestroy__();\r\n \r\n // Clear the ref from DBI store if available\r\n if (__data__ && __data__.$ref && __component__ && __component__.dbi) {\r\n __component__.dbi.data.refs.delete(__data__.$ref);\r\n }\r\n \r\n // Disable further auto-renders\r\n __autoRenderEnabled__ = false;\r\n }\r\n \r\n // Check if there are pending data changes that need SYNC render\r\n // Returns false if async interaction was called (reply/followUp will handle render)\r\n function __hasPendingRender__() {\r\n return __hasDataChanges__ && __autoRenderEnabled__ && !__asyncInteractionCalled__;\r\n }\r\n \r\n // Synchronous flush for when handler completes without async interaction\r\n // Only called when no reply/followUp was made - uses throttled render\r\n function __syncFlushRender__() {\r\n if (__hasDataChanges__ && __autoRenderEnabled__ && !__asyncInteractionCalled__) {\r\n __hasDataChanges__ = false;\r\n return __throttledRender__(true); // immediate=true for sync flush\r\n }\r\n return Promise.resolve();\r\n }\r\n \r\n // Run all mount callbacks, if callback returns a function add it to destroy callbacks\r\n function __runMount__() {\r\n if (__isMounted__) return;\r\n __isMounted__ = true;\r\n for (var i = 0; i < __mountCallbacks__.length; i++) {\r\n try {\r\n var result = __mountCallbacks__[i]();\r\n // If mount callback returns a function, add it to destroy callbacks\r\n if (typeof result === 'function') {\r\n __destroyCallbacks__.push(result);\r\n }\r\n } catch (err) {\r\n console.error(\"[DBI-Svelte] onMount callback failed:\", err);\r\n throw err;\r\n }\r\n }\r\n }\r\n \r\n // Run all destroy callbacks\r\n function __runDestroy__() {\r\n for (var i = 0; i < __destroyCallbacks__.length; i++) {\r\n try {\r\n __destroyCallbacks__[i]();\r\n } catch (err) {\r\n console.error(\"[DBI-Svelte] onDestroy callback failed:\", err);\r\n throw err;\r\n }\r\n }\r\n // Clear pending timeouts\r\n if (__pendingRenderTimeout__) {\r\n clearTimeout(__pendingRenderTimeout__);\r\n __pendingRenderTimeout__ = null;\r\n }\r\n }\r\n \r\n // Set handler execution flag\r\n function __setInHandler__(value) {\r\n __inHandlerExecution__ = value;\r\n }\r\n \r\n ${processedScript}\r\n \r\n // Inline handlers from template (extracted arrow functions/function expressions)\r\n ${Array.from(inlineHandlers || new Map()).map(([name, code]) => {\r\n // Wrap the inline code as a named function\r\n // If it's an arrow function, convert to regular function for proper 'this' binding\r\n if (code.trim().startsWith('async')) {\r\n // async arrow function or async function\r\n if (code.includes('=>')) {\r\n // async arrow function: async (ctx) => { ... } or async () => { ... }\r\n return `var ${name} = ${code};`;\r\n } else {\r\n // async function expression: async function(ctx) { ... }\r\n return `var ${name} = ${code};`;\r\n }\r\n } else if (code.includes('=>')) {\r\n // Regular arrow function: (ctx) => { ... } or () => { ... }\r\n return `var ${name} = ${code};`;\r\n } else {\r\n // Regular function expression: function(ctx) { ... }\r\n return `var ${name} = ${code};`;\r\n }\r\n }).join('\\n')}\r\n \r\n return { \r\n handlers: { ${[...functionNames, ...Array.from(inlineHandlers || new Map()).map(([name]) => name)].filter(Boolean).join(\", \")} },\r\n effects: __effects__,\r\n hasPendingRender: __hasPendingRender__,\r\n flushRender: __syncFlushRender__,\r\n wrappedCtx: ctx,\r\n mountCallbacks: __mountCallbacks__,\r\n destroyCallbacks: __destroyCallbacks__,\r\n preRenderCallbacks: __preRenderCallbacks__,\r\n afterRenderCallbacks: __afterRenderCallbacks__,\r\n runMount: __runMount__,\r\n runDestroy: __runDestroy__,\r\n runPreRender: __runPreRender__,\r\n runAfterRender: __runAfterRender__,\r\n setInHandler: __setInHandler__,\r\n render: render\r\n };\r\n };\r\n `;\r\n\r\n // Create the factory function\r\n const factoryFunc = new Function('console', wrappedScript);\r\n const createHandlers = factoryFunc(console);\r\n\r\n // Execute with the actual data, component, ctx, and imported modules to get handlers with proper closure\r\n let result;\r\n try {\r\n result = createHandlers(initialData, component, ctx, modules);\r\n } catch (execError) {\r\n throw execError;\r\n }\r\n\r\n Object.assign(handlers, result.handlers || {});\r\n effects.push(...(result.effects || []));\r\n\r\n // Return full result including render helpers\r\n // Function to run all effects\r\n const runEffects = () => {\r\n for (const effect of effects) {\r\n try {\r\n effect();\r\n } catch (error) {\r\n // Effect failed\r\n }\r\n }\r\n };\r\n\r\n return {\r\n handlers,\r\n effects,\r\n runEffects,\r\n hasPendingRender: result.hasPendingRender || (() => false),\r\n flushRender: result.flushRender || (() => Promise.resolve()),\r\n wrappedCtx: result.wrappedCtx || ctx,\r\n mountCallbacks: result.mountCallbacks || [],\r\n destroyCallbacks: result.destroyCallbacks || [],\r\n preRenderCallbacks: result.preRenderCallbacks || [],\r\n afterRenderCallbacks: result.afterRenderCallbacks || [],\r\n runMount: result.runMount || (() => { }),\r\n runDestroy: result.runDestroy || (() => { }),\r\n runPreRender: result.runPreRender || (async () => { }),\r\n runAfterRender: result.runAfterRender || (() => { }),\r\n setInHandler: result.setInHandler || (() => { }),\r\n render: result.render || (() => Promise.resolve())\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] createHandlerContext failed:\", error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Extract $effect callback bodies from script content\r\n */\r\nfunction extractEffectBodies(script: string): string[] {\r\n const bodies: string[] = [];\r\n // Match $effect(() => { ... }) or $effect(function() { ... })\r\n const effectRegex = /\\$effect\\s*\\(\\s*(?:(?:function\\s*\\([^)]*\\)|\\([^)]*\\)\\s*=>|\\(\\)\\s*=>)\\s*\\{([\\s\\S]*?)\\})\\s*\\)/g;\r\n let match;\r\n while ((match = effectRegex.exec(script)) !== null) {\r\n bodies.push(match[1]);\r\n }\r\n return bodies;\r\n}\r\n\r\n/**\r\n * Extract function names from script content (excluding effect callbacks)\r\n */\r\nfunction extractFunctionNames(script: string): string[] {\r\n const names: string[] = [];\r\n\r\n // Match function declarations: function name() {}\r\n const functionDeclRegex = /function\\s+(\\w+)\\s*\\(/g;\r\n let match;\r\n while ((match = functionDeclRegex.exec(script)) !== null) {\r\n names.push(match[1]);\r\n }\r\n\r\n // Match function expressions: const name = function() {}\r\n const functionExprRegex = /(?:const|let|var)\\s+(\\w+)\\s*=\\s*function\\s*\\(/g;\r\n while ((match = functionExprRegex.exec(script)) !== null) {\r\n names.push(match[1]);\r\n }\r\n\r\n // Match arrow functions: const name = () => {}\r\n const arrowFunctionRegex = /(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\([^)]*\\)\\s*=>/g;\r\n while ((match = arrowFunctionRegex.exec(script)) !== null) {\r\n names.push(match[1]);\r\n }\r\n\r\n // Match arrow functions without parentheses: const name = x => {}\r\n const simpleArrowRegex = /(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\w+\\s*=>/g;\r\n while ((match = simpleArrowRegex.exec(script)) !== null) {\r\n names.push(match[1]);\r\n }\r\n\r\n return [...new Set(names)]; // Remove duplicates\r\n}\r\n"]}
1
+ {"version":3,"file":"svelteParser.js","sourceRoot":"","sources":["../../../../../src/types/Components/HTMLComponentsV2/svelteParser.ts"],"names":[],"mappings":"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","sourcesContent":["import * as stuffs from \"stuffs\";\r\n\r\n// Lazy imports to avoid issues with package managers that don't properly hoist dependencies\r\nlet _parse: typeof import(\"svelte/compiler\").parse;\r\n\r\nasync function ensureImports() {\r\n if (!_parse) {\r\n const svelteCompiler = await import(\"svelte/compiler\");\r\n _parse = svelteCompiler.parse;\r\n }\r\n}\r\n\r\n/**\r\n * Context passed to walker callback containing parent information\r\n */\r\ninterface WalkContext {\r\n /** Stack of parent nodes from root to current */\r\n parents: any[];\r\n /** Information about enclosing {#each} blocks */\r\n eachBlocks: Array<{\r\n node: any;\r\n /** The iteration variable name (e.g., \"item\" in {#each items as item}) */\r\n iterVar: string;\r\n /** The index variable name if specified (e.g., \"i\" in {#each items as item, i}) */\r\n indexVar?: string;\r\n /** Expression for unique key (iterVar.id, iterVar.name, or index) */\r\n keyExpr: string;\r\n }>;\r\n}\r\n\r\n/**\r\n * Simple AST walker for Svelte AST nodes with parent tracking\r\n */\r\nfunction walkSvelteAst(node: any, callback: (node: any, context: WalkContext) => void, context?: WalkContext) {\r\n if (!node || typeof node !== 'object') return;\r\n\r\n // Initialize context if not provided\r\n const ctx: WalkContext = context || { parents: [], eachBlocks: [] };\r\n\r\n callback(node, ctx);\r\n\r\n // Create new context for children with this node as parent\r\n const childContext: WalkContext = {\r\n parents: [...ctx.parents, node],\r\n eachBlocks: [...ctx.eachBlocks]\r\n };\r\n\r\n // If this is an EachBlock, add it to the context for children\r\n if (node.type === 'EachBlock') {\r\n const iterVar = node.context?.name || node.context?.type === 'Identifier' ? node.context.name : 'item';\r\n const indexVar = node.index;\r\n\r\n // Determine best key expression for unique naming\r\n // Priority: explicit key > iter.id > iter.name > index > counter\r\n let keyExpr = indexVar || `__idx_${ctx.eachBlocks.length}`;\r\n\r\n childContext.eachBlocks = [...ctx.eachBlocks, {\r\n node,\r\n iterVar,\r\n indexVar,\r\n keyExpr\r\n }];\r\n }\r\n\r\n // Walk children based on node type\r\n if (node.children && Array.isArray(node.children)) {\r\n for (const child of node.children) {\r\n walkSvelteAst(child, callback, childContext);\r\n }\r\n }\r\n if (node.fragment && node.fragment.nodes) {\r\n for (const child of node.fragment.nodes) {\r\n walkSvelteAst(child, callback, childContext);\r\n }\r\n }\r\n if (node.nodes && Array.isArray(node.nodes)) {\r\n for (const child of node.nodes) {\r\n walkSvelteAst(child, callback, childContext);\r\n }\r\n }\r\n // Handle {#each} body\r\n if (node.body && node.type === 'EachBlock') {\r\n if (node.body.nodes) {\r\n for (const child of node.body.nodes) {\r\n walkSvelteAst(child, callback, childContext);\r\n }\r\n } else if (Array.isArray(node.body)) {\r\n for (const child of node.body) {\r\n walkSvelteAst(child, callback, childContext);\r\n }\r\n } else {\r\n walkSvelteAst(node.body, callback, childContext);\r\n }\r\n } else if (node.body) {\r\n if (Array.isArray(node.body)) {\r\n for (const child of node.body) {\r\n walkSvelteAst(child, callback, childContext);\r\n }\r\n } else {\r\n walkSvelteAst(node.body, callback, childContext);\r\n }\r\n }\r\n // Handle other potential child properties\r\n if (node.else) {\r\n walkSvelteAst(node.else, callback, childContext);\r\n }\r\n if (node.consequent) {\r\n walkSvelteAst(node.consequent, callback, childContext);\r\n }\r\n if (node.alternate) {\r\n walkSvelteAst(node.alternate, callback, childContext);\r\n }\r\n if (node.then) {\r\n walkSvelteAst(node.then, callback, childContext);\r\n }\r\n if (node.catch) {\r\n walkSvelteAst(node.catch, callback, childContext);\r\n }\r\n}\r\n\r\nexport interface SvelteHandlerInfo {\r\n name: string;\r\n handlerName: string;\r\n eventType: string; // onclick, onchange, onsubmit, etc.\r\n element: string; // button, string-select, components (for modal), etc.\r\n /** If this is an inline handler, contains the extracted source code */\r\n inlineCode?: string;\r\n /** Whether this handler is an inline arrow function or function expression */\r\n isInline?: boolean;\r\n /** Whether this handler has a dynamic name (inside {#each}) - use prefix matching */\r\n isDynamicName?: boolean;\r\n}\r\n\r\nexport interface ModalHandlerInfo {\r\n modalId: string;\r\n onsubmitHandler?: string; // Handler function name for onsubmit\r\n}\r\n\r\nexport interface SvelteValidationWarning {\r\n type: 'missing-data' | 'unused-data' | 'undefined-handler' | 'syntax-error' | 'runtime-error';\r\n message: string;\r\n details?: string;\r\n}\r\n\r\nexport interface SvelteComponentInfo {\r\n handlers: Map<string, SvelteHandlerInfo>;\r\n /** Modal onsubmit handlers keyed by modal id */\r\n modalHandlers: Map<string, ModalHandlerInfo>;\r\n scriptContent: string;\r\n processedSource: string; // Source with auto-generated names injected\r\n /** Props extracted from $props() destructuring */\r\n declaredProps: string[];\r\n /** Props that have default values (don't require data) */\r\n propsWithDefaults: string[];\r\n /** Function names declared in the script */\r\n declaredFunctions: string[];\r\n /** Inline handler code extracted from template (keyed by generated handler name) */\r\n inlineHandlers: Map<string, string>;\r\n}\r\n\r\n/**\r\n * Parse a Svelte component and extract event handlers\r\n * Also injects auto-generated names into elements that have handlers but no name\r\n */\r\nexport async function parseSvelteComponent(source: string, data?: Record<string, any>): Promise<SvelteComponentInfo> {\r\n await ensureImports();\r\n\r\n let ast;\r\n try {\r\n ast = _parse(source);\r\n } catch (parseError: any) {\r\n // Format Svelte parse error with helpful details\r\n const errorMessage = parseError.message || 'Unknown parse error';\r\n const location = parseError.start || parseError.loc;\r\n let details = errorMessage;\r\n\r\n if (location) {\r\n const lines = source.split('\\n');\r\n const lineNum = location.line || 1;\r\n const column = location.column || 0;\r\n const errorLine = lines[lineNum - 1] || '';\r\n const prevLine = lines[lineNum - 2] || '';\r\n const nextLine = lines[lineNum] || '';\r\n\r\n details = `\r\nSvelte Parse Error at line ${lineNum}, column ${column}:\r\n${errorMessage}\r\n\r\n${lineNum > 1 ? `${lineNum - 1} | ${prevLine}\\n` : ''}${lineNum} | ${errorLine}\r\n${' '.repeat(String(lineNum).length + 3 + column)}^\r\n${nextLine ? `${lineNum + 1} | ${nextLine}` : ''}\r\n`.trim();\r\n }\r\n\r\n const enhancedError = new Error(`[DBI-Svelte] Failed to parse Svelte component:\\n${details}`);\r\n (enhancedError as any).originalError = parseError;\r\n (enhancedError as any).type = 'svelte-parse-error';\r\n throw enhancedError;\r\n }\r\n\r\n const handlers = new Map<string, SvelteHandlerInfo>();\r\n const modalHandlers = new Map<string, ModalHandlerInfo>();\r\n let scriptContent = \"\";\r\n\r\n // Extract script content\r\n if (ast.instance) {\r\n scriptContent = source.substring(ast.instance.content.start, ast.instance.content.end);\r\n }\r\n\r\n // Track elements that need auto-generated names (node -> name mapping)\r\n // We'll inject these into the source after the walk\r\n const elementsNeedingNames: Array<{\r\n node: any;\r\n name: string;\r\n handlerName: string;\r\n eventType: string;\r\n element: string;\r\n /** If inside {#each}, contains info for dynamic name generation */\r\n eachContext?: Array<{\r\n iterVar: string;\r\n indexVar?: string;\r\n keyExpr: string;\r\n }>;\r\n }> = [];\r\n let autoNameCounter = 0;\r\n\r\n // Track inline handlers (arrow functions or function expressions in event attributes)\r\n const inlineHandlers = new Map<string, string>();\r\n let inlineHandlerCounter = 0;\r\n\r\n // Track handler attributes to remove from source (handler, onclick, onchange, etc.)\r\n const attributesToRemove: Array<{ start: number; end: number }> = [];\r\n\r\n // Walk through HTML nodes to find event handlers\r\n walkSvelteAst(ast.html || ast.fragment, (node: any, walkContext: WalkContext) => {\r\n if (node.type === \"Element\" || node.type === \"InlineComponent\" || node.type === \"RegularElement\" || node.type === \"Component\") {\r\n const attributes = node.attributes || [];\r\n const nodeName = node.name.toLowerCase();\r\n\r\n // Special handling for <components type=\"modal\"> elements\r\n if (nodeName === \"components\") {\r\n const typeAttr = attributes.find((attr: any) =>\r\n attr.type === \"Attribute\" && attr.name === \"type\"\r\n );\r\n const typeValue = typeAttr ? getAttributeValue(typeAttr) : null;\r\n\r\n if (typeValue === \"modal\") {\r\n // This is a modal definition - extract id and onsubmit handler\r\n const idAttr = attributes.find((attr: any) =>\r\n attr.type === \"Attribute\" && attr.name === \"id\"\r\n );\r\n const modalId = idAttr ? getAttributeValue(idAttr) : null;\r\n\r\n if (modalId) {\r\n const modalInfo: ModalHandlerInfo = { modalId };\r\n\r\n // Find onsubmit handler\r\n for (const attr of attributes) {\r\n const isOnSubmit = (attr.type === \"Attribute\" && attr.name === \"onsubmit\") ||\r\n (attr.type === \"EventHandler\" && attr.name === \"submit\");\r\n\r\n if (isOnSubmit) {\r\n let handlerName = \"\";\r\n\r\n if (attr.type === \"Attribute\" && Array.isArray(attr.value)) {\r\n const exprValue = attr.value.find((v: any) => v.type === \"ExpressionTag\" || v.type === \"MustacheTag\");\r\n if (exprValue && exprValue.expression) {\r\n if (exprValue.expression.type === \"Identifier\") {\r\n handlerName = exprValue.expression.name;\r\n } else if (exprValue.expression.type === \"CallExpression\" && exprValue.expression.callee) {\r\n handlerName = exprValue.expression.callee.name;\r\n }\r\n }\r\n } else if (attr.expression) {\r\n if (attr.expression.type === \"Identifier\") {\r\n handlerName = attr.expression.name;\r\n } else if (attr.expression.type === \"CallExpression\" && attr.expression.callee) {\r\n handlerName = attr.expression.callee.name;\r\n }\r\n }\r\n\r\n if (handlerName) {\r\n modalInfo.onsubmitHandler = handlerName;\r\n }\r\n\r\n // Track this attribute for removal from source (onsubmit shouldn't be in HTML)\r\n if (attr.start !== undefined && attr.end !== undefined) {\r\n attributesToRemove.push({ start: attr.start, end: attr.end });\r\n }\r\n break;\r\n }\r\n }\r\n\r\n modalHandlers.set(modalId, modalInfo);\r\n }\r\n }\r\n return; // Don't process <components> as regular elements\r\n }\r\n\r\n // Find name attribute\r\n const nameAttr = attributes.find((attr: any) =>\r\n attr.type === \"Attribute\" && attr.name === \"name\"\r\n );\r\n\r\n // Check if element has an onclick/onchange/handler and get the handler info\r\n let foundHandler: { eventType: string; handlerName: string; inlineCode?: string; isInline?: boolean } | null = null;\r\n\r\n for (const attr of attributes) {\r\n const isEventHandler = attr.type === \"EventHandler\";\r\n const isOnAttribute = attr.type === \"Attribute\" && attr.name && attr.name.startsWith(\"on\");\r\n const isHandlerAttribute = attr.type === \"Attribute\" && attr.name === \"handler\";\r\n\r\n if (isEventHandler || isOnAttribute || isHandlerAttribute) {\r\n // For \"handler\" attribute, use the element type to determine eventType\r\n // button -> onclick, select -> onchange\r\n let eventType = attr.name;\r\n if (isHandlerAttribute) {\r\n const elementName = node.name.toLowerCase();\r\n if (elementName === \"button\") {\r\n eventType = \"onclick\";\r\n } else if (elementName.includes(\"select\")) {\r\n eventType = \"onchange\";\r\n } else {\r\n eventType = \"handler\"; // fallback\r\n }\r\n }\r\n let handlerName = \"\";\r\n let inlineCode: string | undefined;\r\n let isInline = false;\r\n\r\n if (attr.type === \"Attribute\" && Array.isArray(attr.value)) {\r\n const exprValue = attr.value.find((v: any) => v.type === \"ExpressionTag\" || v.type === \"MustacheTag\");\r\n if (exprValue && exprValue.expression) {\r\n if (exprValue.expression.type === \"Identifier\") {\r\n handlerName = exprValue.expression.name;\r\n } else if (exprValue.expression.type === \"CallExpression\" && exprValue.expression.callee) {\r\n handlerName = exprValue.expression.callee.name;\r\n } else if (exprValue.expression.type === \"ArrowFunctionExpression\" || exprValue.expression.type === \"FunctionExpression\") {\r\n // Inline arrow function or function expression - extract the code\r\n isInline = true;\r\n handlerName = `__inline_handler_${inlineHandlerCounter++}`;\r\n // Extract the source code from the expression\r\n const expr = exprValue.expression;\r\n if (expr.start !== undefined && expr.end !== undefined) {\r\n inlineCode = source.substring(expr.start, expr.end);\r\n }\r\n }\r\n }\r\n } else if (attr.expression) {\r\n if (attr.expression.type === \"Identifier\") {\r\n handlerName = attr.expression.name;\r\n } else if (attr.expression.type === \"CallExpression\" && attr.expression.callee) {\r\n handlerName = attr.expression.callee.name;\r\n } else if (attr.expression.type === \"MemberExpression\") {\r\n handlerName = extractMemberExpressionName(attr.expression);\r\n } else if (attr.expression.type === \"ArrowFunctionExpression\" || attr.expression.type === \"FunctionExpression\") {\r\n // Inline arrow function or function expression - extract the code\r\n isInline = true;\r\n handlerName = `__inline_handler_${inlineHandlerCounter++}`;\r\n // Extract the source code from the expression\r\n const expr = attr.expression;\r\n if (expr.start !== undefined && expr.end !== undefined) {\r\n inlineCode = source.substring(expr.start, expr.end);\r\n }\r\n }\r\n }\r\n\r\n if (handlerName) {\r\n foundHandler = { eventType, handlerName, inlineCode, isInline };\r\n // If it's an inline handler, store the code\r\n if (isInline && inlineCode) {\r\n inlineHandlers.set(handlerName, inlineCode);\r\n }\r\n // Track this attribute for removal from source\r\n if (attr.start !== undefined && attr.end !== undefined) {\r\n attributesToRemove.push({ start: attr.start, end: attr.end });\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (!foundHandler) return; // No handler found, skip\r\n\r\n let componentName: string;\r\n const isInsideEach = walkContext.eachBlocks.length > 0;\r\n\r\n if (nameAttr) {\r\n componentName = getAttributeValue(nameAttr);\r\n } else {\r\n // No name attribute - generate one\r\n // If inside {#each}, we need a DYNAMIC name using the loop variable\r\n const positionKey = `${node.name.toLowerCase()}_${autoNameCounter++}`;\r\n\r\n if (isInsideEach) {\r\n // Inside {#each} - we'll inject a dynamic name expression\r\n // The actual name will be generated at runtime using loop variables\r\n componentName = `__auto_${positionKey}`;\r\n } else {\r\n // Not in loop - use static deterministic name\r\n // If data is provided, use/store in $autoNames for persistence across re-renders\r\n if (data) {\r\n if (!data.$autoNames) {\r\n data.$autoNames = {};\r\n }\r\n if (!data.$autoNames[positionKey]) {\r\n data.$autoNames[positionKey] = `__auto_${positionKey}`;\r\n }\r\n componentName = data.$autoNames[positionKey];\r\n } else {\r\n componentName = `__auto_${positionKey}`;\r\n }\r\n }\r\n\r\n // Track this element for source injection\r\n elementsNeedingNames.push({\r\n node,\r\n name: componentName,\r\n handlerName: foundHandler.handlerName,\r\n eventType: foundHandler.eventType,\r\n element: node.name.toLowerCase(),\r\n eachContext: isInsideEach ? walkContext.eachBlocks.map(b => ({\r\n iterVar: b.iterVar,\r\n indexVar: b.indexVar,\r\n keyExpr: b.keyExpr\r\n })) : undefined\r\n });\r\n }\r\n\r\n // Add to handlers map\r\n handlers.set(componentName, {\r\n name: componentName,\r\n handlerName: foundHandler.handlerName,\r\n eventType: foundHandler.eventType,\r\n element: node.name.toLowerCase(),\r\n inlineCode: foundHandler.inlineCode,\r\n isInline: foundHandler.isInline,\r\n isDynamicName: isInsideEach,\r\n });\r\n }\r\n });\r\n\r\n // Process source modifications:\r\n // 1. Remove handler attributes (onclick, onchange, handler) - they shouldn't be in final HTML\r\n // 2. Inject auto-generated names for elements that need them\r\n // \r\n // We need to apply these in reverse position order to maintain correct offsets\r\n let processedSource = source;\r\n\r\n // Collect all modifications with their positions\r\n type SourceModification =\r\n | { type: 'remove'; start: number; end: number; sortKey: number }\r\n | { type: 'insert'; position: number; content: string; sortKey: number };\r\n\r\n const modifications: SourceModification[] = [];\r\n\r\n // Add attribute removals\r\n for (const { start, end } of attributesToRemove) {\r\n // Also remove any leading whitespace before the attribute\r\n let actualStart = start;\r\n while (actualStart > 0 && (source[actualStart - 1] === ' ' || source[actualStart - 1] === '\\t')) {\r\n actualStart--;\r\n }\r\n modifications.push({ type: 'remove', start: actualStart, end, sortKey: actualStart });\r\n }\r\n\r\n // Add name injections\r\n for (const { node, name, eachContext } of elementsNeedingNames) {\r\n // Find the position right after the opening tag name\r\n // e.g., <button ...> -> insert after \"button\"\r\n const tagEnd = node.start + 1 + node.name.length; // +1 for '<'\r\n\r\n let nameAttrValue: string;\r\n\r\n if (eachContext && eachContext.length > 0) {\r\n // Inside {#each} - generate dynamic name expression using loop variables\r\n // Build a unique key from all nested loop contexts\r\n // Priority: item.id > item.name > index\r\n const keyParts: string[] = [name];\r\n\r\n for (let i = 0; i < eachContext.length; i++) {\r\n const ctx = eachContext[i];\r\n // Use index variable if available, otherwise use a property from iter var\r\n if (ctx.indexVar) {\r\n keyParts.push(`\\${${ctx.indexVar}}`);\r\n } else {\r\n // Try common unique identifiers: id, name, key, value\r\n // Using the iter var directly as fallback\r\n keyParts.push(`\\${${ctx.iterVar}?.id ?? ${ctx.iterVar}?.name ?? ${ctx.iterVar}?.key ?? ${ctx.iterVar}?.value ?? JSON.stringify(${ctx.iterVar}).slice(0,20)}`);\r\n }\r\n }\r\n\r\n // Use backtick template literal for dynamic name\r\n nameAttrValue = `{\\`${keyParts.join('_')}\\`}`;\r\n } else {\r\n // Static name - use quotes\r\n nameAttrValue = `\"${name}\"`;\r\n }\r\n\r\n modifications.push({ type: 'insert', position: tagEnd, content: ` name=${nameAttrValue}`, sortKey: tagEnd });\r\n }\r\n\r\n // Sort by position descending so we don't mess up offsets\r\n // For same position, insertions should come before removals\r\n modifications.sort((a, b) => {\r\n if (b.sortKey !== a.sortKey) return b.sortKey - a.sortKey;\r\n // Same position: insert before remove (so remove accounts for inserted content if needed)\r\n return a.type === 'insert' ? -1 : 1;\r\n });\r\n\r\n // Apply all modifications\r\n for (const mod of modifications) {\r\n if (mod.type === 'remove') {\r\n processedSource = processedSource.slice(0, mod.start) + processedSource.slice(mod.end);\r\n } else {\r\n processedSource = processedSource.slice(0, mod.position) + mod.content + processedSource.slice(mod.position);\r\n }\r\n }\r\n\r\n // Extract declared props from $props() destructuring\r\n const declaredProps: string[] = [];\r\n const propsWithDefaults: string[] = [];\r\n const propsMatch = scriptContent.match(/(?:const|let)\\s+\\{([\\s\\S]*?)\\}\\s*=\\s*\\$props\\(\\)/);\r\n if (propsMatch) {\r\n const propsContent = propsMatch[1];\r\n // Remove comments first\r\n const cleanedContent = propsContent\r\n .replace(/\\/\\/.*$/gm, '')\r\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\r\n const props = parsePropsContent(cleanedContent);\r\n for (const prop of props) {\r\n if (prop.name) {\r\n declaredProps.push(prop.name);\r\n if (prop.defaultValue !== undefined) {\r\n propsWithDefaults.push(prop.name);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Extract declared function names\r\n const declaredFunctions: string[] = [];\r\n const funcRegex = /(?:async\\s+)?function\\s+(\\w+)\\s*\\(/g;\r\n let funcMatch;\r\n while ((funcMatch = funcRegex.exec(scriptContent)) !== null) {\r\n declaredFunctions.push(funcMatch[1]);\r\n }\r\n // Also match arrow functions assigned to variables: const/let/var name = (async) () =>\r\n const arrowRegex = /(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\([^)]*\\)\\s*=>/g;\r\n while ((funcMatch = arrowRegex.exec(scriptContent)) !== null) {\r\n declaredFunctions.push(funcMatch[1]);\r\n }\r\n\r\n return {\r\n handlers,\r\n modalHandlers,\r\n scriptContent,\r\n processedSource,\r\n declaredProps,\r\n propsWithDefaults,\r\n declaredFunctions,\r\n inlineHandlers\r\n };\r\n}\r\n\r\n/**\r\n * Extract the full name from a MemberExpression (e.g., obj.method)\r\n */\r\nfunction extractMemberExpressionName(expr: any): string {\r\n if (expr.type === \"Identifier\") {\r\n return expr.name;\r\n }\r\n if (expr.type === \"MemberExpression\") {\r\n const object = extractMemberExpressionName(expr.object);\r\n const property = expr.property.name || expr.property.value;\r\n return `${object}.${property}`;\r\n }\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Get the value from an attribute\r\n */\r\nfunction getAttributeValue(attr: any): string {\r\n if (!attr.value) return \"\";\r\n\r\n if (Array.isArray(attr.value)) {\r\n // Static text value\r\n if (attr.value[0]?.type === \"Text\") {\r\n return attr.value[0].data;\r\n }\r\n // Expression value\r\n if (attr.value[0]?.expression) {\r\n return extractExpressionValue(attr.value[0].expression);\r\n }\r\n }\r\n\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Extract value from an expression\r\n */\r\nfunction extractExpressionValue(expr: any): string {\r\n if (expr.type === \"Identifier\") {\r\n return expr.name;\r\n }\r\n if (expr.type === \"Literal\") {\r\n return String(expr.value);\r\n }\r\n return \"\";\r\n}\r\n\r\n/**\r\n * Parse $props() destructuring content with proper brace/bracket counting\r\n * Handles nested objects like: { name, options = { a: 1, b: [1, 2] }, count = 0 }\r\n */\r\nfunction parsePropsContent(content: string): Array<{ name: string; defaultValue?: string }> {\r\n const props: Array<{ name: string; defaultValue?: string }> = [];\r\n let current = '';\r\n let braceCount = 0;\r\n let bracketCount = 0;\r\n let parenCount = 0;\r\n let inString: string | null = null;\r\n\r\n for (let i = 0; i <= content.length; i++) {\r\n const char = content[i];\r\n const prevChar = i > 0 ? content[i - 1] : '';\r\n\r\n // Handle string boundaries\r\n if ((char === '\"' || char === \"'\" || char === '`') && prevChar !== '\\\\') {\r\n if (inString === char) {\r\n inString = null;\r\n } else if (!inString) {\r\n inString = char;\r\n }\r\n }\r\n\r\n // Only process structural characters when not in a string\r\n if (!inString) {\r\n if (char === '{') braceCount++;\r\n else if (char === '}') braceCount--;\r\n else if (char === '[') bracketCount++;\r\n else if (char === ']') bracketCount--;\r\n else if (char === '(') parenCount++;\r\n else if (char === ')') parenCount--;\r\n\r\n // Split on comma only when at top level (no nested braces/brackets/parens)\r\n if ((char === ',' || i === content.length) && braceCount === 0 && bracketCount === 0 && parenCount === 0) {\r\n const trimmed = current.trim();\r\n if (trimmed) {\r\n // Parse \"name = defaultValue\" or just \"name\"\r\n const equalsIndex = trimmed.indexOf('=');\r\n if (equalsIndex > 0) {\r\n const name = trimmed.substring(0, equalsIndex).trim();\r\n const defaultValue = trimmed.substring(equalsIndex + 1).trim();\r\n props.push({ name, defaultValue });\r\n } else {\r\n props.push({ name: trimmed });\r\n }\r\n }\r\n current = '';\r\n continue;\r\n }\r\n }\r\n\r\n if (i < content.length) {\r\n current += char;\r\n }\r\n }\r\n\r\n return props;\r\n}\r\n\r\n/**\r\n * Validate a Svelte component and return warnings\r\n * Call this during development/registration to catch potential issues early\r\n */\r\nexport function validateSvelteComponent(\r\n componentInfo: SvelteComponentInfo,\r\n data: Record<string, any> = {},\r\n componentName: string = 'unknown'\r\n): SvelteValidationWarning[] {\r\n const warnings: SvelteValidationWarning[] = [];\r\n\r\n // Skip internal props/data keys (used by the framework)\r\n const internalKeys = ['$ref', '$unRef', '__unRefWrapped__', '$autoNames', 'data'];\r\n\r\n // 1. Check for props declared but not provided in data (missing required data)\r\n // Skip props that have default values - they don't require data\r\n for (const prop of componentInfo.declaredProps) {\r\n if (internalKeys.includes(prop)) continue;\r\n if (componentInfo.propsWithDefaults.includes(prop)) continue; // Has default, not required\r\n if (!(prop in data)) {\r\n warnings.push({\r\n type: 'missing-data',\r\n message: `[${componentName}] Prop \"${prop}\" is declared in $props() without a default value but not provided in data`,\r\n details: `Add \"${prop}\" to your data object or provide a default value in $props()`\r\n });\r\n }\r\n }\r\n\r\n // 2. Check for data provided but not declared in props (potential typo or unused)\r\n for (const key of Object.keys(data)) {\r\n if (internalKeys.includes(key)) continue;\r\n if (key.startsWith('$')) continue; // Skip all $-prefixed internal keys\r\n if (!componentInfo.declaredProps.includes(key)) {\r\n warnings.push({\r\n type: 'unused-data',\r\n message: `[${componentName}] Data key \"${key}\" is provided but not declared in $props()`,\r\n details: `This data won't be accessible in the component. Add it to $props() destructuring.`\r\n });\r\n }\r\n }\r\n\r\n // 3. Check for undefined handlers referenced in elements\r\n // Skip inline handlers (they are extracted from template, not defined in script)\r\n for (const [elementName, handlerInfo] of componentInfo.handlers) {\r\n // Skip inline handlers - they are defined in the template, not the script\r\n if (handlerInfo.isInline) continue;\r\n if (!componentInfo.declaredFunctions.includes(handlerInfo.handlerName)) {\r\n warnings.push({\r\n type: 'undefined-handler',\r\n message: `[${componentName}] Handler \"${handlerInfo.handlerName}\" referenced by <${handlerInfo.element} name=\"${elementName}\"> is not defined`,\r\n details: `Make sure to define \"function ${handlerInfo.handlerName}(ctx) { ... }\" in your script`\r\n });\r\n }\r\n }\r\n\r\n // 4. Check for undefined modal submit handlers\r\n for (const [modalId, modalInfo] of componentInfo.modalHandlers) {\r\n if (modalInfo.onsubmitHandler && !componentInfo.declaredFunctions.includes(modalInfo.onsubmitHandler)) {\r\n warnings.push({\r\n type: 'undefined-handler',\r\n message: `[${componentName}] Modal submit handler \"${modalInfo.onsubmitHandler}\" for modal \"${modalId}\" is not defined`,\r\n details: `Make sure to define \"function ${modalInfo.onsubmitHandler}(ctx, fields) { ... }\" in your script`\r\n });\r\n }\r\n }\r\n\r\n // 5. Check for modal handler signatures (ctx parameter is optional for regular handlers)\r\n // Only modal handlers MUST have fields parameter to access submitted data\r\n const handlerFunctionRegex = /(?:async\\s+)?function\\s+(\\w+)\\s*\\(\\s*(\\w*)\\s*(?:,\\s*(\\w+))?\\s*\\)/g;\r\n let match;\r\n const scriptContent = componentInfo.scriptContent;\r\n\r\n while ((match = handlerFunctionRegex.exec(scriptContent)) !== null) {\r\n const funcName = match[1];\r\n const firstParam = match[2];\r\n const secondParam = match[3];\r\n\r\n // Only check modal handlers - they need 'fields' param to access form data\r\n const isModalHandler = Array.from(componentInfo.modalHandlers.values()).some(m => m.onsubmitHandler === funcName);\r\n\r\n if (isModalHandler && !secondParam) {\r\n warnings.push({\r\n type: 'syntax-error',\r\n message: `[${componentName}] Modal handler \"${funcName}\" should have \"ctx\" and \"fields\" parameters`,\r\n details: `Change to \"function ${funcName}(ctx, fields) { ... }\" to receive submitted form data`\r\n });\r\n }\r\n }\r\n\r\n // 6. Check for common template mistakes\r\n const templateContent = componentInfo.processedSource;\r\n\r\n // Check for onclick= without braces (common mistake)\r\n const badOnClickRegex = /onclick\\s*=\\s*[\"']([^\"']+)[\"']/gi;\r\n while ((match = badOnClickRegex.exec(templateContent)) !== null) {\r\n if (!match[1].startsWith('{')) {\r\n warnings.push({\r\n type: 'syntax-error',\r\n message: `[${componentName}] onclick handler should use curly braces: onclick={${match[1]}}`,\r\n details: `String values are not valid for event handlers. Use onclick={handlerName} syntax.`\r\n });\r\n }\r\n }\r\n\r\n // Check for undefined variables in {expression} blocks (basic check)\r\n const expressionRegex = /\\{([^}]+)\\}/g;\r\n const knownIdentifiers = new Set([\r\n ...componentInfo.declaredProps,\r\n ...componentInfo.declaredFunctions,\r\n // Common Svelte/JS globals\r\n 'true', 'false', 'null', 'undefined', 'console', 'Math', 'JSON', 'Array', 'Object',\r\n 'Date', 'Number', 'String', 'Boolean', 'Promise', 'Map', 'Set',\r\n // Common Svelte constructs\r\n '#if', '/if', '#each', '/each', '#await', '/await', ':else', ':then', ':catch',\r\n '@html', '@debug', '@const'\r\n ]);\r\n\r\n // Add variables from script (let, const, var declarations)\r\n const varDeclRegex = /(?:let|const|var)\\s+(\\w+)/g;\r\n while ((match = varDeclRegex.exec(scriptContent)) !== null) {\r\n knownIdentifiers.add(match[1]);\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\n/**\r\n * Log validation warnings to console with colors\r\n */\r\nexport function logValidationWarnings(warnings: SvelteValidationWarning[]): void {\r\n if (warnings.length === 0) return;\r\n\r\n console.warn(`\\n⚠️ Svelte Component Validation Warnings (${warnings.length}):`);\r\n\r\n for (const warning of warnings) {\r\n const icon = warning.type === 'missing-data' ? '❌' :\r\n warning.type === 'unused-data' ? '⚠️' :\r\n warning.type === 'undefined-handler' ? '🔗' :\r\n warning.type === 'syntax-error' ? '💥' : '⚡';\r\n\r\n console.warn(` ${icon} ${warning.message}`);\r\n if (warning.details) {\r\n console.warn(` └─ ${warning.details}`);\r\n }\r\n }\r\n console.warn('');\r\n}\r\n\r\nexport interface HandlerContextResult {\r\n handlers: Record<string, Function>;\r\n effects: Function[];\r\n runEffects: () => void;\r\n hasPendingRender: () => boolean;\r\n flushRender: () => Promise<void>;\r\n wrappedCtx: any; // Proxy-wrapped ctx for passing to handlers\r\n // Lifecycle hooks\r\n mountCallbacks: Function[];\r\n destroyCallbacks: Function[];\r\n preRenderCallbacks: Function[];\r\n afterRenderCallbacks: Function[];\r\n runMount: () => void;\r\n runDestroy: () => void;\r\n runPreRender: () => Promise<void>;\r\n runAfterRender: () => void;\r\n // Handler execution tracking\r\n setInHandler: (value: boolean) => void;\r\n // Manual render function\r\n render: (immediate?: boolean) => Promise<void>;\r\n}\r\n\r\n/**\r\n * Parse import statements from script and extract module info\r\n */\r\ninterface ImportInfo {\r\n moduleName: string;\r\n imports: { name: string; alias?: string }[];\r\n isDefault: boolean;\r\n defaultName?: string;\r\n}\r\n\r\nfunction parseImports(script: string): { imports: ImportInfo[]; cleanedScript: string } {\r\n const imports: ImportInfo[] = [];\r\n\r\n // Match: import { a, b as c } from \"module\"\r\n // Match: import name from \"module\"\r\n // Match: import * as name from \"module\"\r\n const importRegex = /import\\s+(?:(\\w+)\\s*,?\\s*)?(?:\\{\\s*([^}]+)\\s*\\})?(?:\\*\\s+as\\s+(\\w+))?\\s+from\\s+[\"']([^\"']+)[\"'];?/g;\r\n\r\n let cleanedScript = script;\r\n let match;\r\n\r\n while ((match = importRegex.exec(script)) !== null) {\r\n const [fullMatch, defaultImport, namedImports, namespaceImport, moduleName] = match;\r\n\r\n // Skip svelte internal imports - we provide these ourselves\r\n if (moduleName === 'svelte' || moduleName.startsWith('svelte/')) {\r\n cleanedScript = cleanedScript.replace(fullMatch, '');\r\n continue;\r\n }\r\n\r\n const importInfo: ImportInfo = {\r\n moduleName,\r\n imports: [],\r\n isDefault: false\r\n };\r\n\r\n // Default import: import name from \"module\"\r\n if (defaultImport) {\r\n importInfo.isDefault = true;\r\n importInfo.defaultName = defaultImport;\r\n }\r\n\r\n // Namespace import: import * as name from \"module\"\r\n if (namespaceImport) {\r\n importInfo.isDefault = true;\r\n importInfo.defaultName = namespaceImport;\r\n }\r\n\r\n // Named imports: import { a, b as c } from \"module\"\r\n if (namedImports) {\r\n const parts = namedImports.split(',').map(s => s.trim()).filter(Boolean);\r\n for (const part of parts) {\r\n const aliasMatch = part.match(/^(\\w+)\\s+as\\s+(\\w+)$/);\r\n if (aliasMatch) {\r\n importInfo.imports.push({ name: aliasMatch[1], alias: aliasMatch[2] });\r\n } else {\r\n importInfo.imports.push({ name: part });\r\n }\r\n }\r\n }\r\n\r\n imports.push(importInfo);\r\n cleanedScript = cleanedScript.replace(fullMatch, '');\r\n }\r\n\r\n return { imports, cleanedScript };\r\n}\r\n\r\n/**\r\n * Load modules and create injection variables\r\n */\r\nfunction loadModules(imports: ImportInfo[], sourceDir?: string): { modules: Record<string, any>; varDeclarations: string } {\r\n const modules: Record<string, any> = {};\r\n const declarations: string[] = [];\r\n const path = require(\"path\");\r\n\r\n for (const importInfo of imports) {\r\n try {\r\n // Resolve relative paths from source file directory\r\n const resolvedPath = importInfo.moduleName.startsWith('.') && sourceDir\r\n ? path.resolve(sourceDir, importInfo.moduleName)\r\n : importInfo.moduleName;\r\n // Try to require the module\r\n const mod = require(resolvedPath);\r\n\r\n if (importInfo.isDefault && importInfo.defaultName) {\r\n // Default or namespace import\r\n modules[importInfo.defaultName] = mod.default || mod;\r\n declarations.push(`var ${importInfo.defaultName} = __modules__[\"${importInfo.defaultName}\"];`);\r\n }\r\n\r\n // Named imports\r\n for (const imp of importInfo.imports) {\r\n const varName = imp.alias || imp.name;\r\n modules[varName] = mod[imp.name];\r\n declarations.push(`var ${varName} = __modules__[\"${varName}\"];`);\r\n }\r\n } catch (err) {\r\n // Module import failed\r\n }\r\n }\r\n\r\n return { modules, varDeclarations: declarations.join('\\n') };\r\n}\r\n\r\n/**\r\n * Create a handler context from script content\r\n * This evaluates the Svelte script and returns the handler functions and effects\r\n * @param sourceDir - The directory of the source file (used for resolving relative imports)\r\n * @param inlineHandlers - Map of inline handler names to their source code (extracted from template)\r\n */\r\nexport function createHandlerContext(scriptContent: string, initialData: Record<string, any> = {}, component?: any, ctx?: any, sourceDir?: string, inlineHandlers?: Map<string, string>): HandlerContextResult {\r\n const handlers: Record<string, Function> = {};\r\n const effects: Function[] = [];\r\n\r\n try {\r\n // Parse and extract imports first\r\n const { imports, cleanedScript } = parseImports(scriptContent);\r\n const { modules, varDeclarations } = loadModules(imports, sourceDir);\r\n\r\n // Extract only function declarations from the script\r\n const functionNames = extractFunctionNames(cleanedScript);\r\n\r\n // Extract $effect calls and convert them to collectable functions\r\n const effectBodies = extractEffectBodies(cleanedScript);\r\n\r\n // Process script to be safe for evaluation:\r\n // 1. Remove reactive declarations (let x = $state(...))\r\n // 2. Remove $props destructuring\r\n // 3. Convert $effect to __registerEffect__\r\n // 4. Keep only function declarations\r\n\r\n // First, remove comments from the script to avoid regex issues with braces in comments\r\n let scriptWithoutComments = cleanedScript\r\n // Remove single-line comments (but preserve the newline)\r\n .replace(/\\/\\/.*$/gm, '')\r\n // Remove multi-line comments\r\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\r\n\r\n let processedScript = scriptWithoutComments\r\n // Remove $state declarations completely or make them var\r\n .replace(/(?:const|let)\\s+(\\w+)\\s*=\\s*\\$state\\(([^)]*)\\);?/g, 'var $1 = $2;')\r\n // Remove $derived declarations but keep the value\r\n .replace(/(?:const|let)\\s+(\\w+)\\s*=\\s*\\$derived\\(([^)]+)\\);?/g, 'var $1 = $2;')\r\n // Convert $effect calls to __registerEffect__ calls\r\n .replace(/\\$effect\\s*\\(\\s*((?:function\\s*\\([^)]*\\)|\\([^)]*\\)\\s*=>|\\(\\)\\s*=>)[^}]*\\{[\\s\\S]*?\\}\\s*)\\);?/g, '__registerEffect__($1);')\r\n // Simpler $effect pattern: $effect(() => { ... })\r\n .replace(/\\$effect\\s*\\(\\s*\\(\\)\\s*=>\\s*\\{([\\s\\S]*?)\\}\\s*\\);?/g, '__registerEffect__(function() {$1});');\r\n\r\n // Handle $props destructuring with proper brace counting (supports nested objects like { options = { a: 1 } })\r\n processedScript = processedScript.replace(/(?:const|let)\\s+\\{([\\s\\S]*?)\\}\\s*=\\s*\\$props\\(\\);?/g, (match) => {\r\n // Find the opening brace after 'const' or 'let'\r\n const letIndex = match.indexOf('{');\r\n if (letIndex === -1) return match;\r\n\r\n // Use brace counting to find the matching closing brace\r\n let braceCount = 0;\r\n let startIndex = letIndex;\r\n let endIndex = -1;\r\n\r\n for (let i = startIndex; i < match.length; i++) {\r\n if (match[i] === '{') braceCount++;\r\n else if (match[i] === '}') {\r\n braceCount--;\r\n if (braceCount === 0) {\r\n endIndex = i;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (endIndex === -1) return match;\r\n\r\n // Extract the content between braces\r\n const content = match.substring(startIndex + 1, endIndex);\r\n\r\n // Parse props with proper handling of nested braces\r\n const props = parsePropsContent(content);\r\n\r\n // Generate prop accessors that read from data at access time\r\n // Use a special pattern: define both the initial var AND a __propGetters__ object\r\n // that inline handlers can use to get current values\r\n const propDefs = props.map(prop => {\r\n if (!prop.name || prop.name === 'data') return '';\r\n if (prop.defaultValue !== undefined) {\r\n return `var ${prop.name} = data.${prop.name} ?? ${prop.defaultValue}; __propGetters__.${prop.name} = function() { return data.${prop.name} ?? ${prop.defaultValue}; };`;\r\n }\r\n return `var ${prop.name} = data.${prop.name}; __propGetters__.${prop.name} = function() { return data.${prop.name}; };`;\r\n }).filter(Boolean).join('\\n');\r\n\r\n return propDefs;\r\n });\r\n\r\n // Add module variable declarations at the beginning of processed script\r\n if (varDeclarations) {\r\n processedScript = varDeclarations + '\\n\\n' + processedScript;\r\n }\r\n\r\n // Wrap everything in an IIFE that takes data and component as parameters\r\n // This ensures data and 'this' are always available in the function scope\r\n // Also provides helper functions: render(), update() and rerender()\r\n // Data is wrapped in a Proxy for automatic reactivity\r\n // Interaction methods (reply, followUp, deferReply) are wrapped to auto-render after completion\r\n const wrappedScript = `\r\n return function(__data__, __component__, __ctx__, __modules__) {\r\n __modules__ = __modules__ || {};\r\n var self = __component__;\r\n var __effects__ = [];\r\n var __renderPending__ = false;\r\n var __autoRenderEnabled__ = true;\r\n var __hasDataChanges__ = false;\r\n \r\n // Prop getters for accessing current data values (used by inline handlers)\r\n var __propGetters__ = {};\r\n \r\n // Lifecycle callbacks\r\n var __mountCallbacks__ = [];\r\n var __destroyCallbacks__ = [];\r\n var __preRenderCallbacks__ = [];\r\n var __afterRenderCallbacks__ = [];\r\n var __isMounted__ = false;\r\n \r\n // Store last message reference for background updates (intervals, timeouts)\r\n var __lastMessage__ = __ctx__?.interaction?.message || null;\r\n \r\n // Throttle configuration\r\n var __throttleMinInterval__ = 250; // Minimum ms between renders\r\n var __lastRenderTime__ = 0;\r\n var __pendingRenderTimeout__ = null;\r\n var __isRateLimited__ = false;\r\n var __rateLimitEndTime__ = 0;\r\n \r\n function __registerEffect__(fn) {\r\n __effects__.push(fn);\r\n }\r\n \r\n // Lifecycle: onMount - called when component is first rendered\r\n // If callback returns a function, that function is called on destroy\r\n function onMount(fn) {\r\n __mountCallbacks__.push(fn);\r\n }\r\n \r\n // Lifecycle: onDestroy - called when ref is cleaned up\r\n function onDestroy(fn) {\r\n __destroyCallbacks__.push(fn);\r\n }\r\n \r\n // Lifecycle: onPreRender - called before each render (async, awaited)\r\n function onPreRender(fn) {\r\n __preRenderCallbacks__.push(fn);\r\n }\r\n \r\n // Lifecycle: onAfterRender - called after each render completes\r\n function onAfterRender(fn) {\r\n __afterRenderCallbacks__.push(fn);\r\n }\r\n \r\n // Run all pre-render callbacks (async)\r\n async function __runPreRender__() {\r\n for (var i = 0; i < __preRenderCallbacks__.length; i++) {\r\n try {\r\n await __preRenderCallbacks__[i]();\r\n } catch (err) {\r\n console.error(\"[DBI-Svelte] Pre-render callback failed:\", err);\r\n throw err;\r\n }\r\n }\r\n }\r\n \r\n // Run all after-render callbacks\r\n function __runAfterRender__() {\r\n for (var i = 0; i < __afterRenderCallbacks__.length; i++) {\r\n try {\r\n __afterRenderCallbacks__[i]();\r\n } catch (err) {\r\n console.error(\"[DBI-Svelte] After-render callback failed:\", err);\r\n throw err;\r\n }\r\n }\r\n }\r\n \r\n // Modal store - stores rendered modal definitions\r\n var __modals__ = new Map();\r\n \r\n // Register a modal (called internally when modals are parsed)\r\n function __registerModal__(modalId, modalDef) {\r\n __modals__.set(modalId, modalDef);\r\n }\r\n \r\n // Show a modal by ID and return a Promise that resolves with the submitted fields\r\n // Modal definitions are rendered from <components type=\"modal\" id=\"xxx\">\r\n // Usage: \r\n // await showModal(\"edit-product\"); // Just show, use onsubmit handler\r\n // const { fields, interaction } = await showModal(\"edit-product\"); // Get response\r\n // await showModal(\"edit-product\", { timeout: 60000 }); // 60 second timeout\r\n // await showModal(\"edit-product\", { timeout: 0 }); // No timeout (unlimited)\r\n function showModal(modalId, options) {\r\n if (!__ctx__ || !__ctx__.interaction) {\r\n return Promise.reject(new Error(\"showModal requires an interaction context\"));\r\n }\r\n \r\n // Default timeout: 10 minutes (600000ms), 0 = no timeout\r\n var timeout = (options && typeof options.timeout === 'number') ? options.timeout : 600000;\r\n \r\n // Disable auto-render IMMEDIATELY since we're showing a modal\r\n // This prevents flushRender from trying to update after modal is shown\r\n __autoRenderEnabled__ = false;\r\n __asyncInteractionCalled__ = true;\r\n \r\n // Create a promise that will be resolved when modal is submitted\r\n return new Promise(async function(resolve, reject) {\r\n var timeoutId = null;\r\n var modal = null;\r\n \r\n try {\r\n // Re-render to get latest modal definitions (reactive)\r\n var renderResult = await __component__.toJSON({ data: __data__ });\r\n \r\n // Get modals from the render result stored on component\r\n var modals = __component__.__lastRenderModals__;\r\n if (!modals) {\r\n reject(new Error(\"No modals defined in this component. Use <components type=\\\\\"modal\\\\\" id=\\\\\"...\\\\\">\")); \r\n return;\r\n }\r\n \r\n modal = modals.get(modalId);\r\n if (!modal) {\r\n reject(new Error(\"Modal '\" + modalId + \"' not found. Available modals: \" + Array.from(modals.keys()).join(\", \")));\r\n return;\r\n }\r\n \r\n // Wrapped resolve/reject to clear timeout\r\n var wrappedResolve = function(result) {\r\n if (timeoutId) clearTimeout(timeoutId);\r\n resolve(result);\r\n };\r\n var wrappedReject = function(error) {\r\n if (timeoutId) clearTimeout(timeoutId);\r\n reject(error);\r\n };\r\n \r\n // Store the promise resolver in component's pending modals map\r\n // This will be resolved when modal submit interaction is received\r\n __component__._pendingModals.set(modal.customId, { resolve: wrappedResolve, reject: wrappedReject });\r\n \r\n // Set up timeout if enabled (timeout > 0)\r\n if (timeout > 0) {\r\n timeoutId = setTimeout(function() {\r\n // Clean up pending modal\r\n __component__._pendingModals.delete(modal.customId);\r\n reject(new Error(\"Modal '\" + modalId + \"' timed out after \" + timeout + \"ms\"));\r\n }, timeout);\r\n }\r\n \r\n // Show the modal using the interaction\r\n var i = __ctx__.interaction;\r\n \r\n // Modal must be shown immediately - no deferral allowed\r\n await i.showModal({\r\n title: modal.title,\r\n customId: modal.customId,\r\n components: modal.components\r\n });\r\n \r\n // Note: Promise resolves later when modal is submitted\r\n // If you don't await for the response, the promise just hangs (which is fine)\r\n } catch (err) {\r\n // Clean up pending modal and timeout if show failed\r\n if (timeoutId) clearTimeout(timeoutId);\r\n if (modal && modal.customId) {\r\n __component__._pendingModals.delete(modal.customId);\r\n }\r\n reject(new Error(\"Failed to show modal: \" + (err.message || err)));\r\n }\r\n });\r\n }\r\n \r\n // Rate-limit aware edit function with retry and enhanced error handling\r\n function __safeEdit__(editFn, retryCount, componentsForError) {\r\n retryCount = retryCount || 0;\r\n var maxRetries = 3;\r\n \r\n return editFn().then(function(result) {\r\n return result;\r\n }).catch(function(err) {\r\n // Check for rate limit (429)\r\n if (err.status === 429 || (err.message && err.message.includes('rate limit'))) {\r\n var retryAfter = err.retry_after || err.retryAfter || 1;\r\n __isRateLimited__ = true;\r\n __rateLimitEndTime__ = Date.now() + (retryAfter * 1000);\r\n \r\n return new Promise(function(resolve) {\r\n setTimeout(function() {\r\n __isRateLimited__ = false;\r\n if (retryCount < maxRetries) {\r\n resolve(__safeEdit__(editFn, retryCount + 1, componentsForError));\r\n } else {\r\n resolve();\r\n }\r\n }, retryAfter * 1000);\r\n });\r\n }\r\n \r\n // Check if it's a component validation error and enhance it\r\n if (err.code === 50035 || err.rawError?.code === 50035 || \r\n (err.message && (err.message.includes('Invalid Form Body') || err.message.includes('BASE_TYPE')))) {\r\n // Create enhanced error message\r\n var errorMsg = err.message || '';\r\n var enhancedMsg = '\\\\n╔══════════════════════════════════════════════════════════════╗\\\\n';\r\n enhancedMsg += '║ Discord Components V2 Validation Error ║\\\\n';\r\n enhancedMsg += '╠══════════════════════════════════════════════════════════════╣\\\\n';\r\n \r\n // Parse error paths from message\r\n var errorLines = errorMsg.split('\\\\n');\r\n for (var i = 0; i < errorLines.length; i++) {\r\n var line = errorLines[i];\r\n var match = line.match(/([\\\\w\\\\[\\\\]\\\\.]+)\\\\[([A-Z_]+)\\\\]:\\\\s*(.+)/);\r\n if (match) {\r\n var path = match[1];\r\n var code = match[2];\r\n var msg = match[3];\r\n \r\n enhancedMsg += '║\\\\n';\r\n enhancedMsg += '║ ❌ Path: ' + path + '\\\\n';\r\n enhancedMsg += '║ ├─ Code: ' + code + '\\\\n';\r\n enhancedMsg += '║ ├─ Message: ' + msg + '\\\\n';\r\n \r\n // Add helpful hints based on error code\r\n if (code === 'BASE_TYPE_REQUIRED') {\r\n enhancedMsg += '║ └─ Fix: This field is required - check if the element has all required attributes\\\\n';\r\n } else if (code === 'BASE_TYPE_BAD_LENGTH') {\r\n enhancedMsg += '║ └─ Fix: Wrong number of items - Discord has min/max limits for components\\\\n';\r\n } else if (code.includes('MAX_LENGTH') || code.includes('MIN_LENGTH')) {\r\n enhancedMsg += '║ └─ Fix: Content length issue - adjust text or number of items\\\\n';\r\n }\r\n }\r\n }\r\n \r\n enhancedMsg += '║\\\\n';\r\n enhancedMsg += '╚══════════════════════════════════════════════════════════════╝';\r\n \r\n var enhancedError = new Error('[DBI-Svelte] Component validation error:\\\\n' + enhancedMsg + '\\\\n\\\\nOriginal: ' + errorMsg);\r\n enhancedError.originalError = err;\r\n enhancedError.type = 'discord-component-validation';\r\n throw enhancedError;\r\n }\r\n \r\n // Re-throw other errors\r\n throw err;\r\n });\r\n }\r\n \r\n // Throttled render - ensures minimum interval between renders\r\n function __throttledRender__(immediate) {\r\n var now = Date.now();\r\n var timeSinceLastRender = now - __lastRenderTime__;\r\n var waitTime = 0;\r\n \r\n // If rate limited, calculate wait time\r\n if (__isRateLimited__ && __rateLimitEndTime__ > now) {\r\n waitTime = Math.max(waitTime, __rateLimitEndTime__ - now);\r\n }\r\n \r\n // If within throttle interval, schedule for later\r\n if (!immediate && timeSinceLastRender < __throttleMinInterval__) {\r\n waitTime = Math.max(waitTime, __throttleMinInterval__ - timeSinceLastRender);\r\n }\r\n \r\n // Clear any pending render\r\n if (__pendingRenderTimeout__) {\r\n clearTimeout(__pendingRenderTimeout__);\r\n __pendingRenderTimeout__ = null;\r\n }\r\n \r\n if (waitTime > 0) {\r\n return new Promise(function(resolve) {\r\n __pendingRenderTimeout__ = setTimeout(function() {\r\n __pendingRenderTimeout__ = null;\r\n __lastRenderTime__ = Date.now();\r\n resolve(__executeRender__());\r\n }, waitTime);\r\n });\r\n }\r\n \r\n __lastRenderTime__ = now;\r\n return __executeRender__();\r\n }\r\n \r\n // Actual render execution\r\n async function __executeRender__() {\r\n // Run pre-render callbacks (async, awaited)\r\n await __runPreRender__();\r\n \r\n var components = await __component__.toJSON({ data: __data__ });\r\n var result;\r\n \r\n // Try to use current interaction if available\r\n if (__ctx__ && __ctx__.interaction) {\r\n try {\r\n var i = __ctx__.interaction;\r\n \r\n // Update last message reference\r\n if (i.message) {\r\n __lastMessage__ = i.message;\r\n }\r\n \r\n // Check if interaction was deferred (our flag) or Discord.js flags\r\n if (i.replied || i.deferred || __interactionDeferred__) {\r\n // Already replied/deferred, use message.edit with rate limit handling\r\n result = await __safeEdit__(function() {\r\n return i.message.edit({\r\n components: components,\r\n flags: [\"IsComponentsV2\"],\r\n });\r\n }, 0, components);\r\n } else {\r\n // Not replied yet, use update with rate limit handling\r\n result = await __safeEdit__(function() {\r\n return i.update({\r\n components: components,\r\n flags: [\"IsComponentsV2\"],\r\n });\r\n }, 0, components);\r\n }\r\n \r\n // Run after-render callbacks\r\n __runAfterRender__();\r\n return result;\r\n } catch (err) {\r\n console.error(\"[DBI-Svelte] Render failed:\", err);\r\n throw err;\r\n }\r\n }\r\n \r\n // Fallback: Use last message reference (for intervals/timeouts outside interaction)\r\n if (__lastMessage__) {\r\n result = await __safeEdit__(function() {\r\n return __lastMessage__.edit({\r\n components: components,\r\n flags: [\"IsComponentsV2\"],\r\n });\r\n }, 0, components);\r\n \r\n // Run after-render callbacks\r\n __runAfterRender__();\r\n return result;\r\n }\r\n \r\n return Promise.resolve();\r\n }\r\n \r\n // Helper: Auto-detect whether to use update() or rerender()\r\n // If interaction was already replied/deferred, use message.edit\r\n // Otherwise use interaction.update\r\n function render(immediate) {\r\n return __throttledRender__(immediate);\r\n }\r\n \r\n // Track if we're inside a handler execution\r\n var __inHandlerExecution__ = false;\r\n \r\n // Track pending low-priority updates (from intervals/timeouts)\r\n var __pendingLowPriorityRender__ = false;\r\n \r\n // Mark that we have pending data changes\r\n function __markDataChanged__() {\r\n __hasDataChanges__ = true;\r\n \r\n // If we're NOT inside a handler (e.g., interval/timeout), trigger render immediately\r\n // The throttle will prevent too many renders\r\n if (!__inHandlerExecution__ && __autoRenderEnabled__ && __lastMessage__) {\r\n __hasDataChanges__ = false;\r\n __throttledRender__(false);\r\n }\r\n }\r\n \r\n // Low-priority update - used for background tasks like intervals\r\n // If a handler is currently running, skip this update (the handler's update will include our changes)\r\n function lowPriorityUpdate(callback) {\r\n if (__inHandlerExecution__) {\r\n // Handler is running - just update data, skip render\r\n // The handler will render when it finishes\r\n if (callback) callback();\r\n return;\r\n }\r\n \r\n // No handler running - proceed with update\r\n if (callback) callback();\r\n }\r\n \r\n // Flush pending render (called after interaction methods complete)\r\n function __flushRender__() {\r\n if (__hasDataChanges__ && __autoRenderEnabled__) {\r\n __hasDataChanges__ = false;\r\n render();\r\n }\r\n }\r\n \r\n // Create reactive proxy for data\r\n // Also properly forwards Object.keys/values/entries operations\r\n function __createReactiveProxy__(target, path) {\r\n if (typeof target !== 'object' || target === null) return target;\r\n \r\n return new Proxy(target, {\r\n get: function(obj, prop) {\r\n var value = obj[prop];\r\n // Wrap nested objects in proxy too\r\n if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\r\n return __createReactiveProxy__(value, path + '.' + String(prop));\r\n }\r\n return value;\r\n },\r\n set: function(obj, prop, value) {\r\n var oldValue = obj[prop];\r\n obj[prop] = value;\r\n // Only mark as changed if value actually changed\r\n if (oldValue !== value) {\r\n __markDataChanged__();\r\n }\r\n return true;\r\n },\r\n // Forward Object.keys/values/entries operations\r\n ownKeys: function(target) {\r\n return Reflect.ownKeys(target);\r\n },\r\n getOwnPropertyDescriptor: function(target, prop) {\r\n return Reflect.getOwnPropertyDescriptor(target, prop);\r\n },\r\n has: function(target, prop) {\r\n return Reflect.has(target, prop);\r\n }\r\n });\r\n }\r\n \r\n // Wrap data in reactive proxy\r\n var data = __createReactiveProxy__(__data__, 'data');\r\n \r\n // Track if an async interaction method was called\r\n var __asyncInteractionCalled__ = false;\r\n \r\n // Track if interaction was deferred (deferUpdate/deferReply)\r\n var __interactionDeferred__ = false;\r\n \r\n // Wrap interaction methods to auto-render after completion\r\n var interaction = null;\r\n var ctx = null;\r\n \r\n if (__ctx__ && __ctx__.interaction) {\r\n var originalInteraction = __ctx__.interaction;\r\n \r\n // Create a proxy for interaction that wraps reply/followUp/deferReply\r\n // Also properly forwards Object.keys/values/entries operations\r\n // Uses Reflect.get to properly handle getters with correct 'this' binding\r\n interaction = new Proxy(originalInteraction, {\r\n get: function(target, prop, receiver) {\r\n // Use Reflect.get to properly handle getters (like 'roles', 'users', etc.)\r\n // This ensures 'this' context is correct for Discord.js Collection getters\r\n var value = Reflect.get(target, prop, target);\r\n \r\n // Wrap methods that \"consume\" the interaction (reply, followUp, defer)\r\n if (prop === 'reply' || prop === 'followUp' || prop === 'deferReply' || prop === 'deferUpdate') {\r\n return function() {\r\n // Mark that async interaction was called - this prevents sync flush at handler end\r\n __asyncInteractionCalled__ = true;\r\n \r\n // Mark as deferred for deferUpdate/deferReply\r\n if (prop === 'deferUpdate' || prop === 'deferReply') {\r\n __interactionDeferred__ = true;\r\n }\r\n \r\n var result = value.apply(target, arguments);\r\n // After the reply completes, flush any pending renders using throttled render\r\n if (result && typeof result.then === 'function') {\r\n result.then(function() {\r\n if (__hasDataChanges__ && __autoRenderEnabled__) {\r\n __hasDataChanges__ = false;\r\n // Use throttled render which handles rate limits\r\n __throttledRender__(false);\r\n }\r\n }).catch(function(err) {\r\n console.error(\"[DBI-Svelte] Render after \" + prop + \" failed:\", err);\r\n });\r\n }\r\n return result;\r\n };\r\n }\r\n \r\n // Wrap update method - this one renders directly, no need to flush after\r\n if (prop === 'update') {\r\n return function() {\r\n __autoRenderEnabled__ = false; // Disable auto since we're doing manual update\r\n __asyncInteractionCalled__ = true;\r\n return value.apply(target, arguments);\r\n };\r\n }\r\n \r\n // Bind functions to original target\r\n if (typeof value === 'function') {\r\n return value.bind(target);\r\n }\r\n \r\n return value;\r\n },\r\n // Forward Object.keys/values/entries operations\r\n ownKeys: function(target) {\r\n return Reflect.ownKeys(target);\r\n },\r\n getOwnPropertyDescriptor: function(target, prop) {\r\n return Reflect.getOwnPropertyDescriptor(target, prop);\r\n },\r\n has: function(target, prop) {\r\n return Reflect.has(target, prop);\r\n }\r\n });\r\n \r\n // Create wrapped ctx with the proxied interaction\r\n // Also properly forwards Object.keys/values/entries operations\r\n ctx = new Proxy(__ctx__, {\r\n get: function(target, prop, receiver) {\r\n if (prop === 'interaction') {\r\n return interaction;\r\n }\r\n // Use Reflect.get for proper getter handling\r\n return Reflect.get(target, prop, target);\r\n },\r\n // Forward Object.keys/values/entries operations\r\n ownKeys: function(target) {\r\n return Reflect.ownKeys(target);\r\n },\r\n getOwnPropertyDescriptor: function(target, prop) {\r\n return Reflect.getOwnPropertyDescriptor(target, prop);\r\n },\r\n has: function(target, prop) {\r\n return Reflect.has(target, prop);\r\n }\r\n });\r\n }\r\n \r\n // Helper: Force update message using interaction.update (for button clicks without reply)\r\n // Helper: Force update message using interaction.update (for button clicks without reply)\r\n async function update() {\r\n if (!__ctx__ || !__ctx__.interaction) {\r\n return Promise.resolve();\r\n }\r\n __autoRenderEnabled__ = false; // Disable auto-render since manual update called\r\n var components = await __component__.toJSON({ data: __data__ });\r\n return __safeEdit__(function() {\r\n return __ctx__.interaction.update({\r\n components: components,\r\n flags: [\"IsComponentsV2\"],\r\n });\r\n });\r\n }\r\n \r\n // Helper: Force re-render message using message.edit (after reply/followUp)\r\n async function rerender() {\r\n if (!__ctx__ || !__ctx__.interaction || !__ctx__.interaction.message) {\r\n return Promise.resolve();\r\n }\r\n __autoRenderEnabled__ = false; // Disable auto-render since manual rerender called\r\n var components = await __component__.toJSON({ data: __data__ });\r\n return __safeEdit__(function() {\r\n return __ctx__.interaction.message.edit({\r\n components: components,\r\n flags: [\"IsComponentsV2\"],\r\n });\r\n });\r\n }\r\n \r\n // Helper: Disable auto-render (for handlers that don't need UI update)\r\n function noRender() {\r\n __autoRenderEnabled__ = false;\r\n }\r\n \r\n // Helper: Set throttle interval (minimum ms between renders)\r\n function setThrottle(ms) {\r\n __throttleMinInterval__ = ms;\r\n }\r\n \r\n // Helper: Destroy this component instance (clears intervals, timers, removes ref)\r\n // Call this when you want to clean up the component manually\r\n function destroy() {\r\n // Run all destroy callbacks (clears intervals, timers, etc.)\r\n __runDestroy__();\r\n \r\n // Clear the ref from DBI store if available\r\n if (__data__ && __data__.$ref && __component__ && __component__.dbi) {\r\n __component__.dbi.data.refs.delete(__data__.$ref);\r\n }\r\n \r\n // Disable further auto-renders\r\n __autoRenderEnabled__ = false;\r\n }\r\n \r\n // Check if there are pending data changes that need SYNC render\r\n // Returns false if async interaction was called (reply/followUp will handle render)\r\n function __hasPendingRender__() {\r\n return __hasDataChanges__ && __autoRenderEnabled__ && !__asyncInteractionCalled__;\r\n }\r\n \r\n // Synchronous flush for when handler completes without async interaction\r\n // Only called when no reply/followUp was made - uses throttled render\r\n function __syncFlushRender__() {\r\n if (__hasDataChanges__ && __autoRenderEnabled__ && !__asyncInteractionCalled__) {\r\n __hasDataChanges__ = false;\r\n return __throttledRender__(true); // immediate=true for sync flush\r\n }\r\n return Promise.resolve();\r\n }\r\n \r\n // Run all mount callbacks, if callback returns a function add it to destroy callbacks\r\n function __runMount__() {\r\n if (__isMounted__) return;\r\n __isMounted__ = true;\r\n for (var i = 0; i < __mountCallbacks__.length; i++) {\r\n try {\r\n var result = __mountCallbacks__[i]();\r\n // If mount callback returns a function, add it to destroy callbacks\r\n if (typeof result === 'function') {\r\n __destroyCallbacks__.push(result);\r\n }\r\n } catch (err) {\r\n console.error(\"[DBI-Svelte] onMount callback failed:\", err);\r\n throw err;\r\n }\r\n }\r\n }\r\n \r\n // Run all destroy callbacks\r\n function __runDestroy__() {\r\n for (var i = 0; i < __destroyCallbacks__.length; i++) {\r\n try {\r\n __destroyCallbacks__[i]();\r\n } catch (err) {\r\n console.error(\"[DBI-Svelte] onDestroy callback failed:\", err);\r\n throw err;\r\n }\r\n }\r\n // Clear pending timeouts\r\n if (__pendingRenderTimeout__) {\r\n clearTimeout(__pendingRenderTimeout__);\r\n __pendingRenderTimeout__ = null;\r\n }\r\n }\r\n \r\n // Set handler execution flag\r\n function __setInHandler__(value) {\r\n __inHandlerExecution__ = value;\r\n }\r\n \r\n ${processedScript}\r\n \r\n // Inline handlers from template (extracted arrow functions/function expressions)\r\n ${Array.from(inlineHandlers || new Map()).map(([name, code]) => {\r\n // Wrap the inline code as a named function\r\n // If it's an arrow function, convert to regular function for proper 'this' binding\r\n if (code.trim().startsWith('async')) {\r\n // async arrow function or async function\r\n if (code.includes('=>')) {\r\n // async arrow function: async (ctx) => { ... } or async () => { ... }\r\n return `var ${name} = ${code};`;\r\n } else {\r\n // async function expression: async function(ctx) { ... }\r\n return `var ${name} = ${code};`;\r\n }\r\n } else if (code.includes('=>')) {\r\n // Regular arrow function: (ctx) => { ... } or () => { ... }\r\n return `var ${name} = ${code};`;\r\n } else {\r\n // Regular function expression: function(ctx) { ... }\r\n return `var ${name} = ${code};`;\r\n }\r\n }).join('\\n')}\r\n \r\n return { \r\n handlers: { ${[...functionNames, ...Array.from(inlineHandlers || new Map()).map(([name]) => name)].filter(Boolean).join(\", \")} },\r\n effects: __effects__,\r\n hasPendingRender: __hasPendingRender__,\r\n flushRender: __syncFlushRender__,\r\n wrappedCtx: ctx,\r\n mountCallbacks: __mountCallbacks__,\r\n destroyCallbacks: __destroyCallbacks__,\r\n preRenderCallbacks: __preRenderCallbacks__,\r\n afterRenderCallbacks: __afterRenderCallbacks__,\r\n runMount: __runMount__,\r\n runDestroy: __runDestroy__,\r\n runPreRender: __runPreRender__,\r\n runAfterRender: __runAfterRender__,\r\n setInHandler: __setInHandler__,\r\n render: render\r\n };\r\n };\r\n `;\r\n\r\n // Create the factory function\r\n const factoryFunc = new Function('console', wrappedScript);\r\n const createHandlers = factoryFunc(console);\r\n\r\n // Execute with the actual data, component, ctx, and imported modules to get handlers with proper closure\r\n let result;\r\n try {\r\n result = createHandlers(initialData, component, ctx, modules);\r\n } catch (execError) {\r\n throw execError;\r\n }\r\n\r\n Object.assign(handlers, result.handlers || {});\r\n effects.push(...(result.effects || []));\r\n\r\n // Return full result including render helpers\r\n // Function to run all effects\r\n const runEffects = () => {\r\n for (const effect of effects) {\r\n try {\r\n effect();\r\n } catch (error) {\r\n // Effect failed\r\n }\r\n }\r\n };\r\n\r\n return {\r\n handlers,\r\n effects,\r\n runEffects,\r\n hasPendingRender: result.hasPendingRender || (() => false),\r\n flushRender: result.flushRender || (() => Promise.resolve()),\r\n wrappedCtx: result.wrappedCtx || ctx,\r\n mountCallbacks: result.mountCallbacks || [],\r\n destroyCallbacks: result.destroyCallbacks || [],\r\n preRenderCallbacks: result.preRenderCallbacks || [],\r\n afterRenderCallbacks: result.afterRenderCallbacks || [],\r\n runMount: result.runMount || (() => { }),\r\n runDestroy: result.runDestroy || (() => { }),\r\n runPreRender: result.runPreRender || (async () => { }),\r\n runAfterRender: result.runAfterRender || (() => { }),\r\n setInHandler: result.setInHandler || (() => { }),\r\n render: result.render || (() => Promise.resolve())\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] createHandlerContext failed:\", error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Extract $effect callback bodies from script content\r\n */\r\nfunction extractEffectBodies(script: string): string[] {\r\n const bodies: string[] = [];\r\n // Match $effect(() => { ... }) or $effect(function() { ... })\r\n const effectRegex = /\\$effect\\s*\\(\\s*(?:(?:function\\s*\\([^)]*\\)|\\([^)]*\\)\\s*=>|\\(\\)\\s*=>)\\s*\\{([\\s\\S]*?)\\})\\s*\\)/g;\r\n let match;\r\n while ((match = effectRegex.exec(script)) !== null) {\r\n bodies.push(match[1]);\r\n }\r\n return bodies;\r\n}\r\n\r\n/**\r\n * Extract function names from script content (excluding effect callbacks)\r\n */\r\nfunction extractFunctionNames(script: string): string[] {\r\n const names: string[] = [];\r\n\r\n // Match function declarations: function name() {}\r\n const functionDeclRegex = /function\\s+(\\w+)\\s*\\(/g;\r\n let match;\r\n while ((match = functionDeclRegex.exec(script)) !== null) {\r\n names.push(match[1]);\r\n }\r\n\r\n // Match function expressions: const name = function() {}\r\n const functionExprRegex = /(?:const|let|var)\\s+(\\w+)\\s*=\\s*function\\s*\\(/g;\r\n while ((match = functionExprRegex.exec(script)) !== null) {\r\n names.push(match[1]);\r\n }\r\n\r\n // Match arrow functions: const name = () => {}\r\n const arrowFunctionRegex = /(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\([^)]*\\)\\s*=>/g;\r\n while ((match = arrowFunctionRegex.exec(script)) !== null) {\r\n names.push(match[1]);\r\n }\r\n\r\n // Match arrow functions without parentheses: const name = x => {}\r\n const simpleArrowRegex = /(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s*)?\\w+\\s*=>/g;\r\n while ((match = simpleArrowRegex.exec(script)) !== null) {\r\n names.push(match[1]);\r\n }\r\n\r\n return [...new Set(names)]; // Remove duplicates\r\n}\r\n"]}
package/package.json CHANGED
@@ -15,7 +15,7 @@
15
15
  "tslib": "^2.6.3"
16
16
  },
17
17
  "name": "@mostfeatured/dbi",
18
- "version": "0.2.31",
18
+ "version": "0.2.32",
19
19
  "main": "dist/src/index.js",
20
20
  "types": "dist/src/index.d.ts",
21
21
  "typesVersions": {