@bravostudioai/react 0.1.31 → 0.1.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.
Files changed (70) hide show
  1. package/dist/cli/commands/generate.js +69 -65
  2. package/dist/cli/commands/generate.js.map +1 -1
  3. package/dist/codegen/generator.js.map +1 -1
  4. package/dist/codegen/parser.js +256 -593
  5. package/dist/codegen/parser.js.map +1 -1
  6. package/dist/codegen/propQualification.js +117 -0
  7. package/dist/codegen/propQualification.js.map +1 -0
  8. package/dist/components/DynamicComponent.js.map +1 -1
  9. package/dist/components/EncoreApp.js +142 -275
  10. package/dist/components/EncoreApp.js.map +1 -1
  11. package/dist/components/EncoreContextProviders.js +24 -0
  12. package/dist/components/EncoreContextProviders.js.map +1 -0
  13. package/dist/components.js +179 -174
  14. package/dist/components.js.map +1 -1
  15. package/dist/hooks/useFontLoader.js +41 -0
  16. package/dist/hooks/useFontLoader.js.map +1 -0
  17. package/dist/hooks/usePusherUpdates.js +41 -45
  18. package/dist/hooks/usePusherUpdates.js.map +1 -1
  19. package/dist/hooks/useRepeatingContainers.js +79 -0
  20. package/dist/hooks/useRepeatingContainers.js.map +1 -0
  21. package/dist/index.js +13 -14
  22. package/dist/index.js.map +1 -1
  23. package/dist/lib/dataPatching.js +24 -0
  24. package/dist/lib/dataPatching.js.map +1 -0
  25. package/dist/lib/dynamicModules.js +44 -45
  26. package/dist/lib/dynamicModules.js.map +1 -1
  27. package/dist/lib/fetcher.js +6 -13
  28. package/dist/lib/fetcher.js.map +1 -1
  29. package/dist/lib/logger.js +35 -0
  30. package/dist/lib/logger.js.map +1 -0
  31. package/dist/lib/moduleRegistry.js +9 -8
  32. package/dist/lib/moduleRegistry.js.map +1 -1
  33. package/dist/src/cli/commands/generate.d.ts.map +1 -1
  34. package/dist/src/codegen/generator.d.ts +74 -0
  35. package/dist/src/codegen/generator.d.ts.map +1 -1
  36. package/dist/src/codegen/parser.d.ts +39 -0
  37. package/dist/src/codegen/parser.d.ts.map +1 -1
  38. package/dist/src/codegen/propQualification.d.ts +42 -0
  39. package/dist/src/codegen/propQualification.d.ts.map +1 -0
  40. package/dist/src/components/DynamicComponent.d.ts +1 -1
  41. package/dist/src/components/DynamicComponent.d.ts.map +1 -1
  42. package/dist/src/components/EncoreApp.d.ts +55 -2
  43. package/dist/src/components/EncoreApp.d.ts.map +1 -1
  44. package/dist/src/components/EncoreContextProviders.d.ts +34 -0
  45. package/dist/src/components/EncoreContextProviders.d.ts.map +1 -0
  46. package/dist/src/components.d.ts.map +1 -1
  47. package/dist/src/hooks/useFontLoader.d.ts +17 -0
  48. package/dist/src/hooks/useFontLoader.d.ts.map +1 -0
  49. package/dist/src/hooks/usePusherUpdates.d.ts.map +1 -1
  50. package/dist/src/hooks/useRepeatingContainers.d.ts +31 -0
  51. package/dist/src/hooks/useRepeatingContainers.d.ts.map +1 -0
  52. package/dist/src/index.d.ts +2 -0
  53. package/dist/src/index.d.ts.map +1 -1
  54. package/dist/src/lib/dataPatching.d.ts +18 -0
  55. package/dist/src/lib/dataPatching.d.ts.map +1 -0
  56. package/dist/src/lib/dynamicModules.d.ts.map +1 -1
  57. package/dist/src/lib/fetcher.d.ts.map +1 -1
  58. package/dist/src/lib/logger.d.ts +33 -0
  59. package/dist/src/lib/logger.d.ts.map +1 -0
  60. package/dist/src/lib/moduleRegistry.d.ts.map +1 -1
  61. package/dist/src/stores/useEncoreState.d.ts +43 -1
  62. package/dist/src/stores/useEncoreState.d.ts.map +1 -1
  63. package/dist/src/version.d.ts +1 -1
  64. package/dist/stores/useEncoreState.js.map +1 -1
  65. package/dist/version.js +1 -1
  66. package/dist/version.js.map +1 -1
  67. package/package.json +1 -1
  68. package/src/components/DynamicComponent.tsx +1 -1
  69. package/src/hooks/useRepeatingContainers.ts +1 -1
  70. package/src/version.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sources":["../../src/codegen/parser.ts"],"sourcesContent":["import {\n ComponentInfo,\n SliderInfo,\n InputGroupInfo,\n FormInfo,\n SelectInputInfo,\n ActionButtonInfo,\n} from \"./types\";\n\nexport function sanitizePropName(name: string): string {\n // Convert to camelCase and remove invalid characters\n const cleaned = name\n .replace(/[^a-zA-Z0-9\\s]/g, \"\") // Remove special chars\n .trim();\n\n if (!cleaned) return \"item\";\n\n return cleaned\n .split(/\\s+/)\n .map((word, index) => {\n if (!word) return \"\";\n // Handle all-uppercase words (like \"SHOP\", \"NOW\") by lowercasing them first\n const normalizedWord =\n word === word.toUpperCase() && word.length > 1\n ? word.toLowerCase()\n : word;\n const firstChar = normalizedWord.charAt(0);\n const rest = normalizedWord.slice(1);\n if (index === 0) {\n return firstChar.toLowerCase() + rest;\n }\n return firstChar.toUpperCase() + rest;\n })\n .join(\"\")\n .replace(/^[0-9]/, \"_$&\"); // Prefix numbers with underscore\n}\n\nexport function generateQualifiedPropName(\n componentName: string,\n parentPath: string[]\n): string {\n // Start with the component's own name\n const baseName = sanitizePropName(componentName);\n\n // If no parent path, just return the base name\n if (parentPath.length === 0) {\n return baseName;\n }\n\n // Filter out empty parts and reverse so we build from root to leaf\n const validParentParts = parentPath\n .filter((part) => part && part.trim())\n .reverse();\n\n if (validParentParts.length === 0) {\n return baseName;\n }\n\n // Build qualified name: parent1Parent2ComponentName\n // Each parent part is sanitized individually, then combined\n const sanitizedParentParts = validParentParts.map((part) =>\n sanitizePropName(part)\n );\n\n // Join parent parts (all start uppercase) with base name (starts lowercase)\n const parentPrefix = sanitizedParentParts\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n\n return parentPrefix + baseName;\n}\n\n/**\n * Finds the minimal distinguishing path suffix for a component when compared to others.\n * Returns the shortest suffix (from root side, working towards leaf) that makes this path unique.\n *\n * The algorithm finds where paths first diverge from the root, then takes the minimal\n * distinguishing part from that divergence point towards the leaf.\n */\nexport function findMinimalDistinguishingPath(\n thisPath: string[],\n otherPaths: string[][]\n): string[] {\n if (otherPaths.length === 0) {\n // No other paths to compare, return empty (no qualification needed)\n return [];\n }\n\n // Find the longest common prefix (from root side)\n let commonPrefixLength = 0;\n const maxCommonLength = Math.min(\n thisPath.length,\n ...otherPaths.map((p) => p.length)\n );\n\n for (let i = 0; i < maxCommonLength; i++) {\n const thisPart = thisPath[i];\n // Check if all other paths have the same part at this position\n const allMatch = otherPaths.every((otherPath) => {\n return otherPath[i] === thisPart;\n });\n\n if (allMatch) {\n commonPrefixLength++;\n } else {\n break;\n }\n }\n\n // The distinguishing part starts after the common prefix\n const distinguishingSuffix = thisPath.slice(commonPrefixLength);\n\n // Now find the minimal suffix that's unique\n // Try progressively shorter suffixes (from root side) until we find one that's unique\n for (\n let suffixLength = 1;\n suffixLength <= distinguishingSuffix.length;\n suffixLength++\n ) {\n const thisSuffix = distinguishingSuffix.slice(0, suffixLength);\n\n // Check if this suffix is unique when combined with the common prefix\n const isUnique = otherPaths.every((otherPath) => {\n // If other path is shorter than common prefix + suffix, it can't match\n if (otherPath.length < commonPrefixLength + suffixLength) {\n return true; // Different length means unique\n }\n // Check if the suffix matches at the divergence point\n const otherSuffix = otherPath.slice(\n commonPrefixLength,\n commonPrefixLength + suffixLength\n );\n return !arraysEqual(thisSuffix, otherSuffix);\n });\n\n if (isUnique) {\n // Found minimal distinguishing suffix\n return thisSuffix;\n }\n }\n\n // If we get here, paths are identical (shouldn't happen, but handle it)\n return distinguishingSuffix;\n}\n\n/**\n * Helper to compare two arrays for equality\n */\nexport function arraysEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false;\n return a.every((val, idx) => val === b[idx]);\n}\n\nexport function getComponentPropType(\n componentType: string,\n _componentName: string\n): string {\n if (componentType === \"component:image\") {\n return \"string\"; // imageUrl\n }\n if (componentType === \"component:text\") {\n return \"string\"; // text\n }\n if (componentType?.startsWith(\"component:input-\")) {\n // Input types generally return strings\n if (componentType === \"component:input-image\") {\n return \"string\"; // image URL\n }\n return \"string\"; // text inputs, email, password, etc.\n }\n // Default to any for unknown types\n return \"any\";\n}\n\nexport function getComponentPropName(componentType: string): string {\n if (componentType === \"component:image\") {\n return \"imageUrl\";\n }\n if (componentType === \"component:text\") {\n return \"text\";\n }\n return \"value\";\n}\n\nexport function findSlidersAndDataBindings(pageData: any): SliderInfo[] {\n const sliders: SliderInfo[] = [];\n\n function traverse(node: any, path: string[] = []): void {\n if (!node || typeof node !== \"object\") return;\n\n // Check if this is a slider container\n if (node.type === \"container:slider\") {\n const slider: SliderInfo = {\n id: node.id,\n name: node.name || \"Slider\",\n arrayContainer: null,\n };\n\n // Recursively look for containers with encore:data:array tag inside the slider\n let arrayContainer: any = null;\n\n const findArrayContainer = (containerNode: any): void => {\n if (arrayContainer) return; // Already found one\n\n if (!containerNode || typeof containerNode !== \"object\") return;\n\n // Check if this node is the array container\n if (\n Array.isArray(containerNode.tags) &&\n (containerNode.tags.includes(\"encore:data:array\") ||\n containerNode.tags.includes(\"bravo:data:array\"))\n ) {\n arrayContainer = containerNode;\n return;\n }\n\n // Recursively search children\n if (containerNode.body && Array.isArray(containerNode.body)) {\n containerNode.body.forEach(findArrayContainer);\n }\n if (\n containerNode.containers &&\n Array.isArray(containerNode.containers)\n ) {\n containerNode.containers.forEach(findArrayContainer);\n }\n if (\n containerNode.components &&\n Array.isArray(containerNode.components)\n ) {\n containerNode.components.forEach(findArrayContainer);\n }\n };\n\n // Start search from the slider node itself (checking its children)\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach(findArrayContainer);\n }\n // Also check components if they exist directly\n if (\n !arrayContainer &&\n node.components &&\n Array.isArray(node.components)\n ) {\n node.components.forEach(findArrayContainer);\n }\n\n if (arrayContainer) {\n const container = arrayContainer;\n let components: ComponentInfo[] = [];\n\n // Find all components with encore:data tag, and also image components\n const imageComponents: any[] = [];\n\n const findDataComponents = (\n comp: any,\n parentPath: string[] = []\n ): void => {\n if (!comp || typeof comp !== \"object\") return;\n\n // Track image components separately (they might not have encore:data tag)\n if (comp.type === \"component:image\") {\n imageComponents.push(comp);\n }\n\n if (\n Array.isArray(comp.tags) &&\n (comp.tags.includes(\"encore:data\") ||\n comp.tags.includes(\"bravo:data\"))\n ) {\n const basePropName = sanitizePropName(comp.name || \"item\");\n const propType = getComponentPropType(comp.type, comp.name);\n // const propKey = getComponentPropName(comp.type);\n\n components.push({\n id: comp.id,\n name: comp.name || \"Unnamed\",\n type: comp.type,\n tags: comp.tags || [],\n propName: basePropName, // Will be qualified later if needed\n propType,\n // Store parent path for later qualification\n _parentPath: [...parentPath],\n } as ComponentInfo & { _parentPath: string[] });\n }\n\n // Build parent path: include this node's name if it's a container/component with a name\n // Skip generic \"Frame\" names - they're usually not meaningful for distinction\n const currentParentPath = [...parentPath];\n if (\n comp.name &&\n (comp.type?.startsWith(\"container:\") ||\n comp.type?.startsWith(\"component:\"))\n ) {\n const name = comp.name.trim();\n // Filter out generic \"Frame\" names (case-insensitive, with or without numbers/spaces)\n // But keep meaningful names like \"TripSlideFrame\" that contain other words\n const isGenericFrame =\n /^frame\\s*\\d*$/i.test(name) || name.toUpperCase() === \"FRAME\";\n if (name && !isGenericFrame) {\n currentParentPath.push(comp.name);\n }\n }\n\n // Recursively search children\n if (comp.body && Array.isArray(comp.body)) {\n comp.body.forEach((child: any) =>\n findDataComponents(child, currentParentPath)\n );\n }\n if (comp.containers && Array.isArray(comp.containers)) {\n comp.containers.forEach((child: any) =>\n findDataComponents(child, currentParentPath)\n );\n }\n if (comp.components && Array.isArray(comp.components)) {\n comp.components.forEach((child: any) =>\n findDataComponents(child, currentParentPath)\n );\n }\n };\n\n if (container.components && Array.isArray(container.components)) {\n container.components.forEach((comp: any) =>\n findDataComponents(comp, [])\n );\n }\n\n // After finding all components, if we have image components but no image with encore:data,\n // add the first image component\n const hasImageWithData = components.some(\n (c) => c.type === \"component:image\"\n );\n if (!hasImageWithData && imageComponents.length > 0) {\n const imageComp = imageComponents[0];\n // For image components, use \"imageUrl\" as the prop name\n // Clean the name first, then if it contains \"image\", just use \"imageUrl\"\n const rawName = (imageComp.name || \"image\").toLowerCase();\n const basePropName = rawName.includes(\"image\")\n ? \"imageUrl\"\n : sanitizePropName(imageComp.name || \"image\");\n components.push({\n id: imageComp.id,\n name: imageComp.name || \"Image\",\n type: imageComp.type,\n tags: imageComp.tags || [],\n propName: basePropName, // Will be qualified later if needed\n propType: \"string\", // imageUrl is always string\n _parentPath: [],\n } as ComponentInfo & { _parentPath: string[] });\n }\n\n // Detect duplicates and qualify them with minimal distinguishing paths\n // First pass: collect all base prop names and group duplicates\n const propNameGroups = new Map<\n string,\n Array<ComponentInfo & { _parentPath: string[] }>\n >();\n components.forEach((comp) => {\n const compWithPath = comp as ComponentInfo & {\n _parentPath: string[];\n };\n const baseName = comp.propName;\n if (!propNameGroups.has(baseName)) {\n propNameGroups.set(baseName, []);\n }\n propNameGroups.get(baseName)!.push(compWithPath);\n });\n\n // Second pass: for each group with duplicates, find minimal distinguishing paths\n // and ensure all qualified names are unique\n propNameGroups.forEach((group, _baseName) => {\n if (group.length === 1) {\n // No duplicates, keep the simple name\n return;\n }\n\n // First, find minimal distinguishing paths for all components\n group.forEach((comp) => {\n const otherPaths = group\n .filter((c) => c.id !== comp.id)\n .map((c) => c._parentPath || []);\n\n const minimalPath = findMinimalDistinguishingPath(\n comp._parentPath || [],\n otherPaths\n );\n\n // Use the minimal distinguishing path to qualify the name\n comp.propName = generateQualifiedPropName(\n comp.name || \"item\",\n minimalPath\n );\n });\n\n // Check if qualified names are still duplicates and expand paths if needed\n let hasDuplicates = true;\n let iteration = 0;\n const maxIterations = 10; // Safety limit\n\n while (hasDuplicates && iteration < maxIterations) {\n iteration++;\n const qualifiedNameGroups = new Map<\n string,\n Array<ComponentInfo & { _parentPath: string[] }>\n >();\n group.forEach((comp) => {\n if (!qualifiedNameGroups.has(comp.propName)) {\n qualifiedNameGroups.set(comp.propName, []);\n }\n qualifiedNameGroups.get(comp.propName)!.push(comp);\n });\n\n hasDuplicates = false;\n // For each group of still-duplicated qualified names, expand their paths\n qualifiedNameGroups.forEach((dupGroup, _qualifiedName) => {\n if (dupGroup.length > 1) {\n hasDuplicates = true;\n // Expand the distinguishing path for each duplicate\n dupGroup.forEach((comp) => {\n // Find a longer distinguishing path by comparing with others in the duplicate group\n const fullPath = comp._parentPath || [];\n const otherFullPaths = dupGroup\n .filter((c) => c.id !== comp.id)\n .map((c) => c._parentPath || []);\n\n // Find where this path diverges from others in the duplicate group\n let commonPrefixLength = 0;\n const maxCommonLength = Math.min(\n fullPath.length,\n ...otherFullPaths.map((p) => p.length)\n );\n\n for (let i = 0; i < maxCommonLength; i++) {\n const thisPart = fullPath[i];\n const allMatch = otherFullPaths.every((otherPath) => {\n return otherPath[i] === thisPart;\n });\n if (allMatch) {\n commonPrefixLength++;\n } else {\n break;\n }\n }\n\n // Use progressively more of the distinguishing suffix until unique\n const distinguishingSuffix =\n fullPath.slice(commonPrefixLength);\n\n // Try expanding the distinguishing suffix until we find a unique name\n let foundUnique = false;\n for (\n let suffixLength = 1;\n suffixLength <= distinguishingSuffix.length;\n suffixLength++\n ) {\n const expandedPath = distinguishingSuffix.slice(\n 0,\n suffixLength\n );\n const testQualifiedName = generateQualifiedPropName(\n comp.name || \"item\",\n expandedPath\n );\n\n // Check if this qualified name is unique among ALL components (not just duplicates)\n const isUnique = components.every((otherComp) => {\n if (otherComp.id === comp.id) return true;\n // If other component is in the same duplicate group, compare expanded paths\n if (dupGroup.some((c) => c.id === otherComp.id)) {\n const otherFullPath =\n (\n otherComp as ComponentInfo & {\n _parentPath: string[];\n }\n )._parentPath || [];\n const otherCommonPrefixLength = Math.min(\n commonPrefixLength,\n otherFullPath.length\n );\n const otherDistinguishingSuffix = otherFullPath.slice(\n otherCommonPrefixLength\n );\n const otherExpandedPath =\n otherDistinguishingSuffix.slice(0, suffixLength);\n const otherQualifiedName = generateQualifiedPropName(\n otherComp.name || \"item\",\n otherExpandedPath\n );\n return testQualifiedName !== otherQualifiedName;\n }\n // For components outside the duplicate group, just check the final prop name\n return testQualifiedName !== otherComp.propName;\n });\n\n if (isUnique) {\n comp.propName = testQualifiedName;\n foundUnique = true;\n break;\n }\n }\n\n // If we couldn't find a unique name with the distinguishing suffix,\n // use the distinguishing suffix we found (it's the minimal we can do)\n // We'll handle truly identical paths with numeric suffixes in the final pass\n if (!foundUnique) {\n // Use the distinguishing suffix - it's the minimal distinguishing part\n // Even if it's not globally unique yet, it's better than the full path\n comp.propName = generateQualifiedPropName(\n comp.name || \"item\",\n distinguishingSuffix.length > 0\n ? distinguishingSuffix\n : []\n );\n }\n });\n }\n });\n }\n\n // Final check: if there are still duplicates after using full paths,\n // and they have identical paths, use numeric suffixes as last resort\n const finalQualifiedNameGroups = new Map<\n string,\n Array<ComponentInfo & { _parentPath: string[] }>\n >();\n group.forEach((comp) => {\n if (!finalQualifiedNameGroups.has(comp.propName)) {\n finalQualifiedNameGroups.set(comp.propName, []);\n }\n finalQualifiedNameGroups.get(comp.propName)!.push(comp);\n });\n\n finalQualifiedNameGroups.forEach(\n (finalDupGroup, finalQualifiedName) => {\n if (finalDupGroup.length > 1) {\n // Check if all duplicates have identical paths\n const allPathsIdentical = finalDupGroup.every((comp) => {\n const thisPath = comp._parentPath || [];\n return finalDupGroup.every((otherComp) => {\n if (otherComp.id === comp.id) return true;\n const otherPath = otherComp._parentPath || [];\n return arraysEqual(thisPath, otherPath);\n });\n });\n\n // Only use numeric suffixes if paths are truly identical\n if (allPathsIdentical) {\n let index = 0;\n finalDupGroup.forEach((comp) => {\n if (index > 0) {\n comp.propName = `${finalQualifiedName}${index + 1}`;\n }\n index++;\n });\n }\n }\n }\n );\n\n // Remove the temporary _parentPath property\n group.forEach((comp) => {\n delete (comp as any)._parentPath;\n });\n });\n\n // If we have an image component, remove color components with similar names\n // (they're usually placeholders/backgrounds)\n if (imageComponents.length > 0) {\n const imageComp = imageComponents[0];\n const imageName = (imageComp.name || \"\").toLowerCase();\n components = components.filter((comp) => {\n // Keep image components\n if (comp.type === \"component:image\") return true;\n // Remove color components that seem to be placeholders for images\n if (comp.type === \"component:color\") {\n const compName = (comp.name || \"\").toLowerCase();\n // If color component name is similar to image name, it's likely a placeholder\n if (imageName.includes(compName) || compName.includes(\"image\")) {\n return false;\n }\n }\n return true;\n });\n }\n\n slider.arrayContainer = {\n id: container.id,\n name: container.name || \"Item\",\n propName: sanitizePropName(container.name || \"items\"),\n components,\n };\n }\n\n sliders.push(slider);\n }\n\n // Recursively traverse children\n if (node.body && Array.isArray(node.body)) {\n node.body.forEach((child: any) => traverse(child, [...path, \"body\"]));\n }\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach((child: any) =>\n traverse(child, [...path, \"containers\"])\n );\n }\n if (node.components && Array.isArray(node.components)) {\n node.components.forEach((child: any) =>\n traverse(child, [...path, \"components\"])\n );\n }\n }\n\n // Start traversal from page data\n // Try multiple possible locations for the body\n const body =\n pageData.data?.body || pageData.body || (pageData as any).data?.body || [];\n\n if (Array.isArray(body) && body.length > 0) {\n body.forEach((node: any) => traverse(node));\n }\n\n return sliders;\n}\n\nexport function findStandaloneComponents(pageData: any): ComponentInfo[] {\n const components: ComponentInfo[] = [];\n const sliderIds = new Set<string>();\n\n // First, collect all slider IDs to exclude their children\n function collectSliderIds(node: any): void {\n if (!node || typeof node !== \"object\") return;\n\n if (node.type === \"container:slider\") {\n sliderIds.add(node.id);\n }\n\n if (node.body && Array.isArray(node.body)) {\n node.body.forEach(collectSliderIds);\n }\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach(collectSliderIds);\n }\n }\n\n // Traverse to find standalone components with bravo:data tags\n // Track parent component names for qualification\n function traverse(\n node: any,\n parentId?: string,\n parentPath: string[] = []\n ): void {\n if (!node || typeof node !== \"object\") return;\n\n // Skip if we're inside a slider\n if (parentId && sliderIds.has(parentId)) return;\n\n // Check if this component has bravo:data tag\n if (\n Array.isArray(node.tags) &&\n (node.tags.includes(\"encore:data\") || node.tags.includes(\"bravo:data\")) &&\n (node.type === \"component:text\" || node.type === \"component:image\")\n ) {\n const basePropName = sanitizePropName(node.name || \"item\");\n const propType = getComponentPropType(node.type, node.name);\n\n components.push({\n id: node.id,\n name: node.name || \"Unnamed\",\n type: node.type,\n tags: node.tags || [],\n propName: basePropName, // Will be qualified later if needed\n propType,\n // Store parent path for later qualification\n _parentPath: [...parentPath],\n } as ComponentInfo & { _parentPath: string[] });\n }\n\n // Build parent path: include this node's name if it's a container/component with a name\n // Skip generic \"Frame\" names - they're usually not meaningful for distinction\n const currentParentPath = [...parentPath];\n if (\n node.name &&\n (node.type?.startsWith(\"container:\") ||\n node.type?.startsWith(\"component:\"))\n ) {\n const name = node.name.trim();\n // Filter out generic \"Frame\" names (case-insensitive, with or without numbers/spaces)\n // But keep meaningful names like \"TripSlideFrame\" that contain other words\n const isGenericFrame =\n /^frame\\s*\\d*$/i.test(name) || name.toUpperCase() === \"FRAME\";\n if (name && !isGenericFrame) {\n currentParentPath.push(node.name);\n }\n }\n\n // Recursively traverse children\n const currentId = node.id;\n if (node.body && Array.isArray(node.body)) {\n node.body.forEach((child: any) =>\n traverse(child, currentId, currentParentPath)\n );\n }\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach((child: any) =>\n traverse(child, currentId, currentParentPath)\n );\n }\n if (node.components && Array.isArray(node.components)) {\n node.components.forEach((child: any) =>\n traverse(child, currentId, currentParentPath)\n );\n }\n }\n\n // Start traversal from page data\n const body =\n pageData.data?.body || pageData.body || (pageData as any).data?.body || [];\n\n if (Array.isArray(body) && body.length > 0) {\n body.forEach(collectSliderIds);\n body.forEach((node: any) => traverse(node));\n }\n\n // Detect duplicates and qualify them with minimal distinguishing paths\n // First pass: collect all base prop names and group duplicates\n const propNameGroups = new Map<\n string,\n Array<ComponentInfo & { _parentPath: string[] }>\n >();\n components.forEach((comp) => {\n const compWithPath = comp as ComponentInfo & { _parentPath: string[] };\n const baseName = comp.propName;\n if (!propNameGroups.has(baseName)) {\n propNameGroups.set(baseName, []);\n }\n propNameGroups.get(baseName)!.push(compWithPath);\n });\n\n // Second pass: for each group with duplicates, find minimal distinguishing paths\n // and ensure all qualified names are unique\n propNameGroups.forEach((group, _baseName) => {\n if (group.length === 1) {\n // No duplicates, keep the simple name\n return;\n }\n\n // First, find minimal distinguishing paths for all components\n group.forEach((comp) => {\n const otherPaths = group\n .filter((c) => c.id !== comp.id)\n .map((c) => c._parentPath || []);\n\n const minimalPath = findMinimalDistinguishingPath(\n comp._parentPath || [],\n otherPaths\n );\n\n // Use the minimal distinguishing path to qualify the name\n comp.propName = generateQualifiedPropName(\n comp.name || \"item\",\n minimalPath\n );\n });\n\n // Check if qualified names are still duplicates and expand paths if needed\n let hasDuplicates = true;\n let iteration = 0;\n const maxIterations = 10; // Safety limit\n\n while (hasDuplicates && iteration < maxIterations) {\n iteration++;\n const qualifiedNameGroups = new Map<\n string,\n Array<ComponentInfo & { _parentPath: string[] }>\n >();\n group.forEach((comp) => {\n if (!qualifiedNameGroups.has(comp.propName)) {\n qualifiedNameGroups.set(comp.propName, []);\n }\n qualifiedNameGroups.get(comp.propName)!.push(comp);\n });\n\n hasDuplicates = false;\n // For each group of still-duplicated qualified names, expand their paths\n qualifiedNameGroups.forEach((dupGroup, _qualifiedName) => {\n if (dupGroup.length > 1) {\n hasDuplicates = true;\n // Expand the distinguishing path for each duplicate\n dupGroup.forEach((comp) => {\n // Find a longer distinguishing path by comparing with others in the duplicate group\n const fullPath = comp._parentPath || [];\n const otherFullPaths = dupGroup\n .filter((c) => c.id !== comp.id)\n .map((c) => c._parentPath || []);\n\n // Find where this path diverges from others in the duplicate group\n let commonPrefixLength = 0;\n const maxCommonLength = Math.min(\n fullPath.length,\n ...otherFullPaths.map((p) => p.length)\n );\n\n for (let i = 0; i < maxCommonLength; i++) {\n const thisPart = fullPath[i];\n const allMatch = otherFullPaths.every((otherPath) => {\n return otherPath[i] === thisPart;\n });\n if (allMatch) {\n commonPrefixLength++;\n } else {\n break;\n }\n }\n\n // Use progressively more of the distinguishing suffix until unique\n const distinguishingSuffix = fullPath.slice(commonPrefixLength);\n\n // Try expanding the distinguishing suffix until we find a unique name\n let foundUnique = false;\n for (\n let suffixLength = 1;\n suffixLength <= distinguishingSuffix.length;\n suffixLength++\n ) {\n const expandedPath = distinguishingSuffix.slice(0, suffixLength);\n const testQualifiedName = generateQualifiedPropName(\n comp.name || \"item\",\n expandedPath\n );\n\n // Check if this qualified name is unique among ALL components (not just duplicates)\n const isUnique = components.every((otherComp) => {\n if (otherComp.id === comp.id) return true;\n // If other component is in the same duplicate group, compare expanded paths\n if (dupGroup.some((c) => c.id === otherComp.id)) {\n const otherFullPath =\n (otherComp as ComponentInfo & { _parentPath: string[] })\n ._parentPath || [];\n const otherCommonPrefixLength = Math.min(\n commonPrefixLength,\n otherFullPath.length\n );\n const otherDistinguishingSuffix = otherFullPath.slice(\n otherCommonPrefixLength\n );\n const otherExpandedPath = otherDistinguishingSuffix.slice(\n 0,\n suffixLength\n );\n const otherQualifiedName = generateQualifiedPropName(\n otherComp.name || \"item\",\n otherExpandedPath\n );\n return testQualifiedName !== otherQualifiedName;\n }\n // For components outside the duplicate group, just check the final prop name\n return testQualifiedName !== otherComp.propName;\n });\n\n if (isUnique) {\n comp.propName = testQualifiedName;\n foundUnique = true;\n break;\n }\n }\n\n // If we couldn't find a unique name with the distinguishing suffix,\n // use the full path to ensure uniqueness (even if it makes names longer)\n if (!foundUnique) {\n comp.propName = generateQualifiedPropName(\n comp.name || \"item\",\n fullPath\n );\n }\n });\n }\n });\n }\n\n // Final check: if there are still duplicates after using full paths,\n // and they have identical paths, use numeric suffixes as last resort\n const finalQualifiedNameGroups = new Map<\n string,\n Array<ComponentInfo & { _parentPath: string[] }>\n >();\n group.forEach((comp) => {\n if (!finalQualifiedNameGroups.has(comp.propName)) {\n finalQualifiedNameGroups.set(comp.propName, []);\n }\n finalQualifiedNameGroups.get(comp.propName)!.push(comp);\n });\n\n finalQualifiedNameGroups.forEach((finalDupGroup, finalQualifiedName) => {\n if (finalDupGroup.length > 1) {\n // Check if all duplicates have identical paths\n const allPathsIdentical = finalDupGroup.every((comp) => {\n const thisPath = comp._parentPath || [];\n return finalDupGroup.every((otherComp) => {\n if (otherComp.id === comp.id) return true;\n const otherPath = otherComp._parentPath || [];\n return arraysEqual(thisPath, otherPath);\n });\n });\n\n // Only use numeric suffixes if paths are truly identical\n if (allPathsIdentical) {\n let index = 0;\n finalDupGroup.forEach((comp) => {\n if (index > 0) {\n comp.propName = `${finalQualifiedName}${index + 1}`;\n }\n index++;\n });\n }\n }\n });\n\n // Remove the temporary _parentPath property\n group.forEach((comp) => {\n delete (comp as any)._parentPath;\n });\n });\n\n return components;\n}\n\nexport function findInputGroups(pageData: any): InputGroupInfo[] {\n const groupsMap = new Map<string, InputGroupInfo>();\n\n function traverse(node: any): void {\n if (!node || typeof node !== \"object\") return;\n\n // Check if this is an input-stateful-set with input-group tag\n if (\n node.type === \"component:input-stateful-set\" &&\n Array.isArray(node.tags)\n ) {\n const inputGroupTag = node.tags.find((tag: string) =>\n tag.startsWith(\"input-group:\")\n );\n if (inputGroupTag) {\n const parts = inputGroupTag.split(\":\");\n if (parts.length >= 3) {\n const groupType = parts[1];\n const groupName = parts[2];\n\n if (!groupsMap.has(groupName)) {\n groupsMap.set(groupName, {\n groupName,\n groupType,\n elements: [],\n });\n }\n\n const group = groupsMap.get(groupName)!;\n group.elements.push({\n id: node.id,\n name: node.name || \"Unnamed\",\n });\n }\n }\n }\n\n // Recursively traverse children\n if (node.body && Array.isArray(node.body)) {\n node.body.forEach(traverse);\n }\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach(traverse);\n }\n if (node.components && Array.isArray(node.components)) {\n node.components.forEach(traverse);\n }\n }\n\n // Start traversal from page data\n const body =\n pageData.data?.body || pageData.body || (pageData as any).data?.body || [];\n\n if (Array.isArray(body) && body.length > 0) {\n body.forEach((node: any) => traverse(node));\n }\n\n return Array.from(groupsMap.values());\n}\n\nexport function findForms(pageData: any): FormInfo[] {\n const forms: FormInfo[] = [];\n\n function traverse(node: any, parentContainer?: any): void {\n if (!node || typeof node !== \"object\") return;\n\n // Check if this is a container that might be a form\n const isContainer =\n node.type?.startsWith(\"container:\") || node.type === \"container:default\";\n const isNamedForm =\n node.name?.toLowerCase().includes(\"form\") ||\n (Array.isArray(node.tags) && node.tags.includes(\"form\"));\n\n // Check if this container or any child has a submit action\n let hasSubmitAction = false;\n let submitButtonId: string | undefined;\n\n function checkForSubmitAction(n: any): void {\n if (!n || typeof n !== \"object\") return;\n\n // Check if this node has a submit action\n if (\n Array.isArray(n.tags) &&\n (n.tags.includes(\"action:submit\") || n.tags.includes(\"submit\"))\n ) {\n hasSubmitAction = true;\n submitButtonId = n.id;\n return;\n }\n\n // Check actions\n if (n.actions?.tap?.action === \"submit\") {\n hasSubmitAction = true;\n submitButtonId = n.id;\n return;\n }\n\n // Recursively check children\n if (n.components && Array.isArray(n.components)) {\n n.components.forEach(checkForSubmitAction);\n }\n if (n.body && Array.isArray(n.body)) {\n n.body.forEach(checkForSubmitAction);\n }\n }\n\n // If this looks like a form container, check for submit actions\n if (isContainer && (isNamedForm || parentContainer === undefined)) {\n checkForSubmitAction(node);\n }\n\n // If we found a form container (has submit action or is named \"form\")\n if (isContainer && (hasSubmitAction || isNamedForm)) {\n const inputs: FormInfo[\"inputs\"] = [];\n\n // Find all input components within this container\n const findInputs = (n: any, parentPath: string[] = []): void => {\n if (!n || typeof n !== \"object\") return;\n\n // Check if this is an input component\n if (\n n.type?.startsWith(\"component:input-\") ||\n n.type === \"component:input-text\" ||\n n.type === \"component:input-image\" ||\n n.type === \"component:input-email\" ||\n n.type === \"component:input-password\" ||\n n.type === \"component:input-select\"\n ) {\n const basePropName = sanitizePropName(n.name || \"Unnamed input\");\n inputs.push({\n id: n.id,\n name: n.name || \"Unnamed input\",\n type: n.type,\n propName: basePropName, // Will be qualified later if needed\n _parentPath: [...parentPath], // Store parent path for qualification\n });\n }\n\n // Build parent path: include this node's name if it's a container/component with a name\n // Skip generic \"Frame\" names - they're usually not meaningful for distinction\n const currentParentPath = [...parentPath];\n if (\n n.name &&\n (n.type?.startsWith(\"container:\") || n.type?.startsWith(\"component:\"))\n ) {\n const name = n.name.trim();\n // Filter out generic \"Frame\" names (case-insensitive, with or without numbers/spaces)\n // But keep meaningful names like \"TripSlideFrame\" that contain other words\n const isGenericFrame =\n /^frame\\s*\\d*$/i.test(name) || name.toUpperCase() === \"FRAME\";\n if (name && !isGenericFrame) {\n currentParentPath.push(n.name);\n }\n }\n\n // Recursively search children\n if (n.components && Array.isArray(n.components)) {\n n.components.forEach((child: any) =>\n findInputs(child, currentParentPath)\n );\n }\n if (n.body && Array.isArray(n.body)) {\n n.body.forEach((child: any) => findInputs(child, currentParentPath));\n }\n };\n\n findInputs(node, []);\n\n // Only add form if it has inputs\n if (inputs.length > 0) {\n forms.push({\n formId: node.id,\n formName: node.name || \"Form\",\n submitButtonId,\n inputs,\n });\n }\n }\n\n // Recursively traverse children\n if (node.body && Array.isArray(node.body)) {\n node.body.forEach((child: any) =>\n traverse(child, isContainer ? node : parentContainer)\n );\n }\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach((child: any) =>\n traverse(child, isContainer ? node : parentContainer)\n );\n }\n if (node.components && Array.isArray(node.components)) {\n node.components.forEach((child: any) =>\n traverse(child, isContainer ? node : parentContainer)\n );\n }\n }\n\n // Start traversal from page data\n const body =\n pageData.data?.body || pageData.body || (pageData as any).data?.body || [];\n\n if (Array.isArray(body) && body.length > 0) {\n body.forEach((node: any) => traverse(node));\n }\n\n return forms;\n}\n\n/**\n * Finds standalone select input components (input-select) that are NOT inside forms.\n * These should be exposed as controlled inputs with value and onChange props.\n */\nexport function findStandaloneSelectInputs(\n pageData: any,\n forms: FormInfo[]\n): SelectInputInfo[] {\n const selectInputs: SelectInputInfo[] = [];\n\n // Collect all input IDs that are already in forms\n const formInputIds = new Set<string>();\n forms.forEach((form) => {\n form.inputs.forEach((input) => {\n formInputIds.add(input.id);\n });\n });\n\n // Traverse to find input-select components not in forms\n function traverse(node: any, parentPath: string[] = []): void {\n if (!node || typeof node !== \"object\") return;\n\n // Check if this is an input-select component\n if (node.type === \"component:input-select\" && !formInputIds.has(node.id)) {\n const basePropName = sanitizePropName(node.name || \"selectInput\");\n selectInputs.push({\n id: node.id,\n name: node.name || \"Select Input\",\n propName: basePropName,\n _parentPath: [...parentPath],\n });\n }\n\n // Build parent path for qualification\n const currentParentPath = [...parentPath];\n if (\n node.name &&\n (node.type?.startsWith(\"container:\") ||\n node.type?.startsWith(\"component:\"))\n ) {\n const name = node.name.trim();\n const isGenericFrame =\n /^frame\\s*\\d*$/i.test(name) || name.toUpperCase() === \"FRAME\";\n if (name && !isGenericFrame) {\n currentParentPath.push(node.name);\n }\n }\n\n // Recursively traverse children\n if (node.body && Array.isArray(node.body)) {\n node.body.forEach((child: any) => traverse(child, currentParentPath));\n }\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach((child: any) =>\n traverse(child, currentParentPath)\n );\n }\n if (node.components && Array.isArray(node.components)) {\n node.components.forEach((child: any) =>\n traverse(child, currentParentPath)\n );\n }\n }\n\n // Start traversal from page data\n const body =\n pageData.data?.body || pageData.body || (pageData as any).data?.body || [];\n\n if (Array.isArray(body) && body.length > 0) {\n body.forEach((node: any) => traverse(node));\n }\n\n // Qualify duplicate prop names\n qualifySelectInputs(selectInputs);\n\n return selectInputs;\n}\n\n/**\n * Qualifies select input prop names to ensure uniqueness.\n */\nfunction qualifySelectInputs(selectInputs: SelectInputInfo[]): void {\n const propNameGroups = new Map<\n string,\n Array<SelectInputInfo & { _parentPath: string[] }>\n >();\n\n selectInputs.forEach((input) => {\n const inputWithPath = input as SelectInputInfo & { _parentPath: string[] };\n const baseName = input.propName;\n if (!propNameGroups.has(baseName)) {\n propNameGroups.set(baseName, []);\n }\n propNameGroups.get(baseName)!.push(inputWithPath);\n });\n\n propNameGroups.forEach((group, _baseName) => {\n if (group.length === 1) {\n delete (group[0] as any)._parentPath;\n return;\n }\n\n // Find minimal distinguishing paths for duplicates\n group.forEach((input) => {\n const otherPaths = group\n .filter((i) => i.id !== input.id)\n .map((i) => i._parentPath || []);\n\n const minimalPath = findMinimalDistinguishingPath(\n input._parentPath || [],\n otherPaths\n );\n\n input.propName = generateQualifiedPropName(\n input.name || \"input\",\n minimalPath\n );\n });\n\n // Clean up\n group.forEach((input) => {\n delete (input as any)._parentPath;\n });\n });\n}\n\n/**\n * Finds action buttons - components that have action tags (action:remote, action:link, etc.)\n * or have actions defined. These should be exposed with onClick handlers.\n */\nexport function findActionButtons(pageData: any): ActionButtonInfo[] {\n const buttons: ActionButtonInfo[] = [];\n\n function traverse(node: any, parentPath: string[] = []): void {\n if (!node || typeof node !== \"object\") return;\n\n // Check if this component has an action tag or actions defined\n const hasActionTag =\n Array.isArray(node.tags) &&\n node.tags.some((tag: string) => tag.startsWith(\"action:\"));\n const hasActions = node.actions && typeof node.actions === \"object\";\n\n if (hasActionTag || hasActions) {\n // Determine the action type\n let actionType = \"tap\";\n if (Array.isArray(node.tags)) {\n const actionTag = node.tags.find((tag: string) =>\n tag.startsWith(\"action:\")\n );\n if (actionTag) {\n actionType = actionTag.replace(\"action:\", \"\");\n }\n }\n if (node.actions?.tap?.action) {\n actionType = node.actions.tap.action;\n }\n\n const basePropName = sanitizePropName(node.name || \"button\");\n buttons.push({\n id: node.id,\n name: node.name || \"Button\",\n propName: basePropName,\n actionType,\n _parentPath: [...parentPath],\n });\n }\n\n // Build parent path for qualification\n const currentParentPath = [...parentPath];\n if (\n node.name &&\n (node.type?.startsWith(\"container:\") ||\n node.type?.startsWith(\"component:\"))\n ) {\n const name = node.name.trim();\n const isGenericFrame =\n /^frame\\s*\\d*$/i.test(name) || name.toUpperCase() === \"FRAME\";\n if (name && !isGenericFrame) {\n currentParentPath.push(node.name);\n }\n }\n\n // Recursively traverse children\n if (node.body && Array.isArray(node.body)) {\n node.body.forEach((child: any) => traverse(child, currentParentPath));\n }\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach((child: any) =>\n traverse(child, currentParentPath)\n );\n }\n if (node.components && Array.isArray(node.components)) {\n node.components.forEach((child: any) =>\n traverse(child, currentParentPath)\n );\n }\n }\n\n // Start traversal from page data\n const body =\n pageData.data?.body || pageData.body || (pageData as any).data?.body || [];\n\n if (Array.isArray(body) && body.length > 0) {\n body.forEach((node: any) => traverse(node));\n }\n\n // Qualify duplicate prop names\n qualifyActionButtons(buttons);\n\n return buttons;\n}\n\n/**\n * Qualifies action button prop names to ensure uniqueness.\n */\nfunction qualifyActionButtons(buttons: ActionButtonInfo[]): void {\n const propNameGroups = new Map<\n string,\n Array<ActionButtonInfo & { _parentPath: string[] }>\n >();\n\n buttons.forEach((button) => {\n const buttonWithPath = button as ActionButtonInfo & {\n _parentPath: string[];\n };\n const baseName = button.propName;\n if (!propNameGroups.has(baseName)) {\n propNameGroups.set(baseName, []);\n }\n propNameGroups.get(baseName)!.push(buttonWithPath);\n });\n\n propNameGroups.forEach((group, _baseName) => {\n if (group.length === 1) {\n delete (group[0] as any)._parentPath;\n return;\n }\n\n // Find minimal distinguishing paths for duplicates\n group.forEach((button) => {\n const otherPaths = group\n .filter((b) => b.id !== button.id)\n .map((b) => b._parentPath || []);\n\n const minimalPath = findMinimalDistinguishingPath(\n button._parentPath || [],\n otherPaths\n );\n\n button.propName = generateQualifiedPropName(\n button.name || \"button\",\n minimalPath\n );\n });\n\n // Clean up\n group.forEach((button) => {\n delete (button as any)._parentPath;\n });\n });\n}\n\n/**\n * Qualifies form input prop names to ensure uniqueness within each form.\n * Only qualifies where necessary, using minimal distinguishing paths.\n */\nexport function qualifyFormInputs(forms: FormInfo[]): void {\n forms.forEach((form) => {\n const inputs = form.inputs;\n\n // Group inputs by base prop name\n const propNameGroups = new Map<\n string,\n Array<FormInfo[\"inputs\"][0] & { _parentPath: string[] }>\n >();\n\n inputs.forEach((input) => {\n const inputWithPath = input as FormInfo[\"inputs\"][0] & {\n _parentPath: string[];\n };\n const baseName = input.propName;\n if (!propNameGroups.has(baseName)) {\n propNameGroups.set(baseName, []);\n }\n propNameGroups.get(baseName)!.push(inputWithPath);\n });\n\n // For each group with duplicates, find minimal distinguishing paths\n propNameGroups.forEach((group, _baseName) => {\n if (group.length === 1) {\n // No duplicates, keep the simple name\n // Remove the temporary _parentPath property\n delete (group[0] as any)._parentPath;\n return;\n }\n\n // Find minimal distinguishing paths for all inputs\n group.forEach((input) => {\n const otherPaths = group\n .filter((i) => i.id !== input.id)\n .map((i) => i._parentPath || []);\n\n const minimalPath = findMinimalDistinguishingPath(\n input._parentPath || [],\n otherPaths\n );\n\n // Use the minimal distinguishing path to qualify the name\n input.propName = generateQualifiedPropName(\n input.name || \"input\",\n minimalPath\n );\n });\n\n // Check if qualified names are still duplicates and expand paths if needed\n let hasDuplicates = true;\n let iteration = 0;\n const maxIterations = 10; // Safety limit\n\n while (hasDuplicates && iteration < maxIterations) {\n iteration++;\n const qualifiedNameGroups = new Map<\n string,\n Array<FormInfo[\"inputs\"][0] & { _parentPath: string[] }>\n >();\n group.forEach((input) => {\n if (!qualifiedNameGroups.has(input.propName)) {\n qualifiedNameGroups.set(input.propName, []);\n }\n qualifiedNameGroups.get(input.propName)!.push(input);\n });\n\n hasDuplicates = false;\n // For each group of still-duplicated qualified names, expand their paths\n qualifiedNameGroups.forEach((dupGroup, _qualifiedName) => {\n if (dupGroup.length > 1) {\n hasDuplicates = true;\n // Expand the distinguishing path for each duplicate\n dupGroup.forEach((input) => {\n const fullPath = input._parentPath || [];\n const otherFullPaths = dupGroup\n .filter((i) => i.id !== input.id)\n .map((i) => i._parentPath || []);\n\n // Find where this path diverges from others in the duplicate group\n let commonPrefixLength = 0;\n const maxCommonLength = Math.min(\n fullPath.length,\n ...otherFullPaths.map((p) => p.length)\n );\n\n for (let i = 0; i < maxCommonLength; i++) {\n const thisPart = fullPath[i];\n const allMatch = otherFullPaths.every((otherPath) => {\n return otherPath[i] === thisPart;\n });\n if (allMatch) {\n commonPrefixLength++;\n } else {\n break;\n }\n }\n\n // Use progressively more of the distinguishing suffix until unique\n const distinguishingSuffix = fullPath.slice(commonPrefixLength);\n\n // Try expanding the distinguishing suffix until we find a unique name\n let foundUnique = false;\n for (\n let suffixLength = 1;\n suffixLength <= distinguishingSuffix.length;\n suffixLength++\n ) {\n const expandedPath = distinguishingSuffix.slice(\n 0,\n suffixLength\n );\n const testQualifiedName = generateQualifiedPropName(\n input.name || \"input\",\n expandedPath\n );\n\n // Check if this qualified name is unique among ALL inputs in this form\n const isUnique = inputs.every((otherInput) => {\n if (otherInput.id === input.id) return true;\n // If other input is in the same duplicate group, compare expanded paths\n if (dupGroup.some((i) => i.id === otherInput.id)) {\n const otherFullPath =\n (\n otherInput as FormInfo[\"inputs\"][0] & {\n _parentPath: string[];\n }\n )._parentPath || [];\n const otherCommonPrefixLength = Math.min(\n commonPrefixLength,\n otherFullPath.length\n );\n const otherDistinguishingSuffix = otherFullPath.slice(\n otherCommonPrefixLength\n );\n const otherExpandedPath = otherDistinguishingSuffix.slice(\n 0,\n suffixLength\n );\n const otherQualifiedName = generateQualifiedPropName(\n otherInput.name || \"input\",\n otherExpandedPath\n );\n return testQualifiedName !== otherQualifiedName;\n }\n // For inputs outside the duplicate group, just check the final prop name\n return testQualifiedName !== otherInput.propName;\n });\n\n if (isUnique) {\n input.propName = testQualifiedName;\n foundUnique = true;\n break;\n }\n }\n\n // If we couldn't find a unique name with the distinguishing suffix,\n // use the distinguishing suffix we found (it's the minimal we can do)\n if (!foundUnique) {\n input.propName = generateQualifiedPropName(\n input.name || \"input\",\n distinguishingSuffix.length > 0 ? distinguishingSuffix : []\n );\n }\n });\n }\n });\n }\n\n // Final check: if there are still duplicates after using full paths,\n // and they have identical paths, use numeric suffixes as last resort\n const finalQualifiedNameGroups = new Map<\n string,\n Array<FormInfo[\"inputs\"][0] & { _parentPath: string[] }>\n >();\n group.forEach((input) => {\n if (!finalQualifiedNameGroups.has(input.propName)) {\n finalQualifiedNameGroups.set(input.propName, []);\n }\n finalQualifiedNameGroups.get(input.propName)!.push(input);\n });\n\n finalQualifiedNameGroups.forEach((finalDupGroup, finalQualifiedName) => {\n if (finalDupGroup.length > 1) {\n // Check if all duplicates have identical paths\n const allPathsIdentical = finalDupGroup.every((input) => {\n const thisPath = input._parentPath || [];\n return finalDupGroup.every((otherInput) => {\n if (otherInput.id === input.id) return true;\n const otherPath = otherInput._parentPath || [];\n return arraysEqual(thisPath, otherPath);\n });\n });\n\n // Only use numeric suffixes if paths are truly identical\n if (allPathsIdentical) {\n let index = 0;\n finalDupGroup.forEach((input) => {\n if (index > 0) {\n input.propName = `${finalQualifiedName}${index + 1}`;\n }\n index++;\n });\n }\n }\n });\n\n // Remove the temporary _parentPath property\n group.forEach((input) => {\n delete (input as any)._parentPath;\n });\n });\n });\n}\n"],"names":["sanitizePropName","name","cleaned","word","index","normalizedWord","firstChar","rest","generateQualifiedPropName","componentName","parentPath","baseName","validParentParts","part","findMinimalDistinguishingPath","thisPath","otherPaths","commonPrefixLength","maxCommonLength","p","i","thisPart","otherPath","distinguishingSuffix","suffixLength","thisSuffix","otherSuffix","arraysEqual","a","b","val","idx","getComponentPropType","componentType","_componentName","getComponentPropName","findSlidersAndDataBindings","pageData","sliders","traverse","node","path","slider","arrayContainer","findArrayContainer","containerNode","container","components","imageComponents","findDataComponents","comp","basePropName","propType","currentParentPath","isGenericFrame","child","c","imageComp","propNameGroups","compWithPath","group","_baseName","minimalPath","hasDuplicates","iteration","maxIterations","qualifiedNameGroups","dupGroup","_qualifiedName","fullPath","otherFullPaths","foundUnique","expandedPath","testQualifiedName","otherComp","otherFullPath","otherCommonPrefixLength","otherExpandedPath","otherQualifiedName","finalQualifiedNameGroups","finalDupGroup","finalQualifiedName","imageName","compName","body","findStandaloneComponents","sliderIds","collectSliderIds","parentId","currentId","findInputGroups","groupsMap","inputGroupTag","tag","parts","groupType","groupName","findForms","forms","parentContainer","isContainer","isNamedForm","hasSubmitAction","submitButtonId","checkForSubmitAction","n","inputs","findInputs","findStandaloneSelectInputs","selectInputs","formInputIds","form","input","qualifySelectInputs","inputWithPath","findActionButtons","buttons","hasActionTag","hasActions","actionType","actionTag","qualifyActionButtons","button","buttonWithPath","qualifyFormInputs","otherInput"],"mappings":"AASO,SAASA,EAAiBC,GAAsB;AAErD,QAAMC,IAAUD,EACb,QAAQ,mBAAmB,EAAE,EAC7B,KAAA;AAEH,SAAKC,IAEEA,EACJ,MAAM,KAAK,EACX,IAAI,CAACC,GAAMC,MAAU;AACpB,QAAI,CAACD,EAAM,QAAO;AAElB,UAAME,IACJF,MAASA,EAAK,YAAA,KAAiBA,EAAK,SAAS,IACzCA,EAAK,YAAA,IACLA,GACAG,IAAYD,EAAe,OAAO,CAAC,GACnCE,IAAOF,EAAe,MAAM,CAAC;AACnC,WAAID,MAAU,IACLE,EAAU,gBAAgBC,IAE5BD,EAAU,gBAAgBC;AAAA,EACnC,CAAC,EACA,KAAK,EAAE,EACP,QAAQ,UAAU,KAAK,IAnBL;AAoBvB;AAEO,SAASC,EACdC,GACAC,GACQ;AAER,QAAMC,IAAWX,EAAiBS,CAAa;AAG/C,MAAIC,EAAW,WAAW;AACxB,WAAOC;AAIT,QAAMC,IAAmBF,EACtB,OAAO,CAACG,MAASA,KAAQA,EAAK,MAAM,EACpC,QAAA;AAEH,SAAID,EAAiB,WAAW,IACvBD,IAKoBC,EAAiB;AAAA,IAAI,CAACC,MACjDb,EAAiBa,CAAI;AAAA,EAAA,EAKpB,IAAI,CAACA,MAASA,EAAK,OAAO,CAAC,EAAE,YAAA,IAAgBA,EAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,EAAE,IAEYF;AACxB;AASO,SAASG,EACdC,GACAC,GACU;AACV,MAAIA,EAAW,WAAW;AAExB,WAAO,CAAA;AAIT,MAAIC,IAAqB;AACzB,QAAMC,IAAkB,KAAK;AAAA,IAC3BH,EAAS;AAAA,IACT,GAAGC,EAAW,IAAI,CAACG,MAAMA,EAAE,MAAM;AAAA,EAAA;AAGnC,WAASC,IAAI,GAAGA,IAAIF,GAAiBE,KAAK;AACxC,UAAMC,IAAWN,EAASK,CAAC;AAM3B,QAJiBJ,EAAW,MAAM,CAACM,MAC1BA,EAAUF,CAAC,MAAMC,CACzB;AAGC,MAAAJ;AAAA;AAEA;AAAA,EAEJ;AAGA,QAAMM,IAAuBR,EAAS,MAAME,CAAkB;AAI9D,WACMO,IAAe,GACnBA,KAAgBD,EAAqB,QACrCC,KACA;AACA,UAAMC,IAAaF,EAAqB,MAAM,GAAGC,CAAY;AAgB7D,QAbiBR,EAAW,MAAM,CAACM,MAAc;AAE/C,UAAIA,EAAU,SAASL,IAAqBO;AAC1C,eAAO;AAGT,YAAME,IAAcJ,EAAU;AAAA,QAC5BL;AAAA,QACAA,IAAqBO;AAAA,MAAA;AAEvB,aAAO,CAACG,EAAYF,GAAYC,CAAW;AAAA,IAC7C,CAAC;AAIC,aAAOD;AAAA,EAEX;AAGA,SAAOF;AACT;AAKO,SAASI,EAAYC,GAAaC,GAAsB;AAC7D,SAAID,EAAE,WAAWC,EAAE,SAAe,KAC3BD,EAAE,MAAM,CAACE,GAAKC,MAAQD,MAAQD,EAAEE,CAAG,CAAC;AAC7C;AAEO,SAASC,EACdC,GACAC,GACQ;AAOR,SANID,MAAkB,qBAGlBA,MAAkB,oBAGlBA,GAAe,WAAW,kBAAkB,IAGrC,WAKJ;AACT;AAEO,SAASE,EAAqBF,GAA+B;AAClE,SAAIA,MAAkB,oBACb,aAELA,MAAkB,mBACb,SAEF;AACT;AAEO,SAASG,EAA2BC,GAA6B;AACtE,QAAMC,IAAwB,CAAA;AAE9B,WAASC,EAASC,GAAWC,IAAiB,IAAU;AACtD,QAAI,GAACD,KAAQ,OAAOA,KAAS,WAG7B;AAAA,UAAIA,EAAK,SAAS,oBAAoB;AACpC,cAAME,IAAqB;AAAA,UACzB,IAAIF,EAAK;AAAA,UACT,MAAMA,EAAK,QAAQ;AAAA,UACnB,gBAAgB;AAAA,QAAA;AAIlB,YAAIG,IAAsB;AAE1B,cAAMC,IAAqB,CAACC,MAA6B;AACvD,cAAI,CAAAF,KAEA,GAACE,KAAiB,OAAOA,KAAkB,WAG/C;AAAA,gBACE,MAAM,QAAQA,EAAc,IAAI,MAC/BA,EAAc,KAAK,SAAS,mBAAmB,KAC9CA,EAAc,KAAK,SAAS,kBAAkB,IAChD;AACA,cAAAF,IAAiBE;AACjB;AAAA,YACF;AAGA,YAAIA,EAAc,QAAQ,MAAM,QAAQA,EAAc,IAAI,KACxDA,EAAc,KAAK,QAAQD,CAAkB,GAG7CC,EAAc,cACd,MAAM,QAAQA,EAAc,UAAU,KAEtCA,EAAc,WAAW,QAAQD,CAAkB,GAGnDC,EAAc,cACd,MAAM,QAAQA,EAAc,UAAU,KAEtCA,EAAc,WAAW,QAAQD,CAAkB;AAAA;AAAA,QAEvD;AAeA,YAZIJ,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW,QAAQI,CAAkB,GAI1C,CAACD,KACDH,EAAK,cACL,MAAM,QAAQA,EAAK,UAAU,KAE7BA,EAAK,WAAW,QAAQI,CAAkB,GAGxCD,GAAgB;AAClB,gBAAMG,IAAYH;AAClB,cAAII,IAA8B,CAAA;AAGlC,gBAAMC,IAAyB,CAAA,GAEzBC,IAAqB,CACzBC,GACAxC,IAAuB,CAAA,MACd;AACT,gBAAI,CAACwC,KAAQ,OAAOA,KAAS,SAAU;AAOvC,gBAJIA,EAAK,SAAS,qBAChBF,EAAgB,KAAKE,CAAI,GAIzB,MAAM,QAAQA,EAAK,IAAI,MACtBA,EAAK,KAAK,SAAS,aAAa,KAC/BA,EAAK,KAAK,SAAS,YAAY,IACjC;AACA,oBAAMC,IAAenD,EAAiBkD,EAAK,QAAQ,MAAM,GACnDE,IAAWpB,EAAqBkB,EAAK,MAAMA,EAAK,IAAI;AAG1D,cAAAH,EAAW,KAAK;AAAA,gBACd,IAAIG,EAAK;AAAA,gBACT,MAAMA,EAAK,QAAQ;AAAA,gBACnB,MAAMA,EAAK;AAAA,gBACX,MAAMA,EAAK,QAAQ,CAAA;AAAA,gBACnB,UAAUC;AAAA;AAAA,gBACV,UAAAC;AAAA;AAAA,gBAEA,aAAa,CAAC,GAAG1C,CAAU;AAAA,cAAA,CACiB;AAAA,YAChD;AAIA,kBAAM2C,IAAoB,CAAC,GAAG3C,CAAU;AACxC,gBACEwC,EAAK,SACJA,EAAK,MAAM,WAAW,YAAY,KACjCA,EAAK,MAAM,WAAW,YAAY,IACpC;AACA,oBAAMjD,IAAOiD,EAAK,KAAK,KAAA,GAGjBI,IACJ,iBAAiB,KAAKrD,CAAI,KAAKA,EAAK,kBAAkB;AACxD,cAAIA,KAAQ,CAACqD,KACXD,EAAkB,KAAKH,EAAK,IAAI;AAAA,YAEpC;AAGA,YAAIA,EAAK,QAAQ,MAAM,QAAQA,EAAK,IAAI,KACtCA,EAAK,KAAK;AAAA,cAAQ,CAACK,MACjBN,EAAmBM,GAAOF,CAAiB;AAAA,YAAA,GAG3CH,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW;AAAA,cAAQ,CAACK,MACvBN,EAAmBM,GAAOF,CAAiB;AAAA,YAAA,GAG3CH,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW;AAAA,cAAQ,CAACK,MACvBN,EAAmBM,GAAOF,CAAiB;AAAA,YAAA;AAAA,UAGjD;AAaA,cAXIP,EAAU,cAAc,MAAM,QAAQA,EAAU,UAAU,KAC5DA,EAAU,WAAW;AAAA,YAAQ,CAACI,MAC5BD,EAAmBC,GAAM,CAAA,CAAE;AAAA,UAAA,GAS3B,CAHqBH,EAAW;AAAA,YAClC,CAACS,MAAMA,EAAE,SAAS;AAAA,UAAA,KAEKR,EAAgB,SAAS,GAAG;AACnD,kBAAMS,IAAYT,EAAgB,CAAC,GAI7BG,KADWM,EAAU,QAAQ,SAAS,YAAA,EACf,SAAS,OAAO,IACzC,aACAzD,EAAiByD,EAAU,QAAQ,OAAO;AAC9C,YAAAV,EAAW,KAAK;AAAA,cACd,IAAIU,EAAU;AAAA,cACd,MAAMA,EAAU,QAAQ;AAAA,cACxB,MAAMA,EAAU;AAAA,cAChB,MAAMA,EAAU,QAAQ,CAAA;AAAA,cACxB,UAAUN;AAAA;AAAA,cACV,UAAU;AAAA;AAAA,cACV,aAAa,CAAA;AAAA,YAAC,CAC8B;AAAA,UAChD;AAIA,gBAAMO,wBAAqB,IAAA;AAsN3B,cAlNAX,EAAW,QAAQ,CAACG,MAAS;AAC3B,kBAAMS,IAAeT,GAGfvC,IAAWuC,EAAK;AACtB,YAAKQ,EAAe,IAAI/C,CAAQ,KAC9B+C,EAAe,IAAI/C,GAAU,EAAE,GAEjC+C,EAAe,IAAI/C,CAAQ,EAAG,KAAKgD,CAAY;AAAA,UACjD,CAAC,GAIDD,EAAe,QAAQ,CAACE,GAAOC,MAAc;AAC3C,gBAAID,EAAM,WAAW;AAEnB;AAIF,YAAAA,EAAM,QAAQ,CAACV,MAAS;AACtB,oBAAMlC,IAAa4C,EAChB,OAAO,CAACJ,MAAMA,EAAE,OAAON,EAAK,EAAE,EAC9B,IAAI,CAACM,MAAMA,EAAE,eAAe,EAAE,GAE3BM,IAAchD;AAAA,gBAClBoC,EAAK,eAAe,CAAA;AAAA,gBACpBlC;AAAA,cAAA;AAIF,cAAAkC,EAAK,WAAW1C;AAAA,gBACd0C,EAAK,QAAQ;AAAA,gBACbY;AAAA,cAAA;AAAA,YAEJ,CAAC;AAGD,gBAAIC,IAAgB,IAChBC,IAAY;AAChB,kBAAMC,IAAgB;AAEtB,mBAAOF,KAAiBC,IAAYC,KAAe;AACjD,cAAAD;AACA,oBAAME,wBAA0B,IAAA;AAIhC,cAAAN,EAAM,QAAQ,CAACV,MAAS;AACtB,gBAAKgB,EAAoB,IAAIhB,EAAK,QAAQ,KACxCgB,EAAoB,IAAIhB,EAAK,UAAU,CAAA,CAAE,GAE3CgB,EAAoB,IAAIhB,EAAK,QAAQ,EAAG,KAAKA,CAAI;AAAA,cACnD,CAAC,GAEDa,IAAgB,IAEhBG,EAAoB,QAAQ,CAACC,GAAUC,MAAmB;AACxD,gBAAID,EAAS,SAAS,MACpBJ,IAAgB,IAEhBI,EAAS,QAAQ,CAACjB,MAAS;AAEzB,wBAAMmB,IAAWnB,EAAK,eAAe,CAAA,GAC/BoB,IAAiBH,EACpB,OAAO,CAACX,MAAMA,EAAE,OAAON,EAAK,EAAE,EAC9B,IAAI,CAACM,MAAMA,EAAE,eAAe,EAAE;AAGjC,sBAAIvC,IAAqB;AACzB,wBAAMC,IAAkB,KAAK;AAAA,oBAC3BmD,EAAS;AAAA,oBACT,GAAGC,EAAe,IAAI,CAACnD,MAAMA,EAAE,MAAM;AAAA,kBAAA;AAGvC,2BAASC,IAAI,GAAGA,IAAIF,GAAiBE,KAAK;AACxC,0BAAMC,IAAWgD,EAASjD,CAAC;AAI3B,wBAHiBkD,EAAe,MAAM,CAAChD,MAC9BA,EAAUF,CAAC,MAAMC,CACzB;AAEC,sBAAAJ;AAAA;AAEA;AAAA,kBAEJ;AAGA,wBAAMM,IACJ8C,EAAS,MAAMpD,CAAkB;AAGnC,sBAAIsD,IAAc;AAClB,2BACM/C,IAAe,GACnBA,KAAgBD,EAAqB,QACrCC,KACA;AACA,0BAAMgD,IAAejD,EAAqB;AAAA,sBACxC;AAAA,sBACAC;AAAA,oBAAA,GAEIiD,IAAoBjE;AAAA,sBACxB0C,EAAK,QAAQ;AAAA,sBACbsB;AAAA,oBAAA;AAiCF,wBA7BiBzB,EAAW,MAAM,CAAC2B,MAAc;AAC/C,0BAAIA,EAAU,OAAOxB,EAAK,GAAI,QAAO;AAErC,0BAAIiB,EAAS,KAAK,CAACX,MAAMA,EAAE,OAAOkB,EAAU,EAAE,GAAG;AAC/C,8BAAMC,IAEFD,EAGA,eAAe,CAAA,GACbE,IAA0B,KAAK;AAAA,0BACnC3D;AAAA,0BACA0D,EAAc;AAAA,wBAAA,GAKVE,IAH4BF,EAAc;AAAA,0BAC9CC;AAAA,wBAAA,EAG0B,MAAM,GAAGpD,CAAY,GAC3CsD,IAAqBtE;AAAA,0BACzBkE,EAAU,QAAQ;AAAA,0BAClBG;AAAA,wBAAA;AAEF,+BAAOJ,MAAsBK;AAAA,sBAC/B;AAEA,6BAAOL,MAAsBC,EAAU;AAAA,oBACzC,CAAC,GAEa;AACZ,sBAAAxB,EAAK,WAAWuB,GAChBF,IAAc;AACd;AAAA,oBACF;AAAA,kBACF;AAKA,kBAAKA,MAGHrB,EAAK,WAAW1C;AAAA,oBACd0C,EAAK,QAAQ;AAAA,oBACb3B,EAAqB,SAAS,IAC1BA,IACA,CAAA;AAAA,kBAAC;AAAA,gBAGX,CAAC;AAAA,cAEL,CAAC;AAAA,YACH;AAIA,kBAAMwD,wBAA+B,IAAA;AAIrC,YAAAnB,EAAM,QAAQ,CAACV,MAAS;AACtB,cAAK6B,EAAyB,IAAI7B,EAAK,QAAQ,KAC7C6B,EAAyB,IAAI7B,EAAK,UAAU,CAAA,CAAE,GAEhD6B,EAAyB,IAAI7B,EAAK,QAAQ,EAAG,KAAKA,CAAI;AAAA,YACxD,CAAC,GAED6B,EAAyB;AAAA,cACvB,CAACC,GAAeC,MAAuB;AACrC,oBAAID,EAAc,SAAS,KAECA,EAAc,MAAM,CAAC9B,MAAS;AACtD,wBAAMnC,IAAWmC,EAAK,eAAe,CAAA;AACrC,yBAAO8B,EAAc,MAAM,CAACN,MAAc;AACxC,wBAAIA,EAAU,OAAOxB,EAAK,GAAI,QAAO;AACrC,0BAAM5B,IAAYoD,EAAU,eAAe,CAAA;AAC3C,2BAAO/C,EAAYZ,GAAUO,CAAS;AAAA,kBACxC,CAAC;AAAA,gBACH,CAAC,GAGsB;AACrB,sBAAIlB,IAAQ;AACZ,kBAAA4E,EAAc,QAAQ,CAAC9B,MAAS;AAC9B,oBAAI9C,IAAQ,MACV8C,EAAK,WAAW,GAAG+B,CAAkB,GAAG7E,IAAQ,CAAC,KAEnDA;AAAA,kBACF,CAAC;AAAA,gBACH;AAAA,cAEJ;AAAA,YAAA,GAIFwD,EAAM,QAAQ,CAACV,MAAS;AACtB,qBAAQA,EAAa;AAAA,YACvB,CAAC;AAAA,UACH,CAAC,GAIGF,EAAgB,SAAS,GAAG;AAE9B,kBAAMkC,KADYlC,EAAgB,CAAC,EACN,QAAQ,IAAI,YAAA;AACzC,YAAAD,IAAaA,EAAW,OAAO,CAACG,MAAS;AAEvC,kBAAIA,EAAK,SAAS,kBAAmB,QAAO;AAE5C,kBAAIA,EAAK,SAAS,mBAAmB;AACnC,sBAAMiC,KAAYjC,EAAK,QAAQ,IAAI,YAAA;AAEnC,oBAAIgC,EAAU,SAASC,CAAQ,KAAKA,EAAS,SAAS,OAAO;AAC3D,yBAAO;AAAA,cAEX;AACA,qBAAO;AAAA,YACT,CAAC;AAAA,UACH;AAEA,UAAAzC,EAAO,iBAAiB;AAAA,YACtB,IAAII,EAAU;AAAA,YACd,MAAMA,EAAU,QAAQ;AAAA,YACxB,UAAU9C,EAAiB8C,EAAU,QAAQ,OAAO;AAAA,YACpD,YAAAC;AAAA,UAAA;AAAA,QAEJ;AAEA,QAAAT,EAAQ,KAAKI,CAAM;AAAA,MACrB;AAGA,MAAIF,EAAK,QAAQ,MAAM,QAAQA,EAAK,IAAI,KACtCA,EAAK,KAAK,QAAQ,CAACe,MAAehB,EAASgB,GAAO,CAAC,GAAGd,GAAM,MAAM,CAAC,CAAC,GAElED,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW;AAAA,QAAQ,CAACe,MACvBhB,EAASgB,GAAO,CAAC,GAAGd,GAAM,YAAY,CAAC;AAAA,MAAA,GAGvCD,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW;AAAA,QAAQ,CAACe,MACvBhB,EAASgB,GAAO,CAAC,GAAGd,GAAM,YAAY,CAAC;AAAA,MAAA;AAAA;AAAA,EAG7C;AAIA,QAAM2C,IACJ/C,EAAS,MAAM,QAAQA,EAAS,QAASA,EAAiB,MAAM,QAAQ,CAAA;AAE1E,SAAI,MAAM,QAAQ+C,CAAI,KAAKA,EAAK,SAAS,KACvCA,EAAK,QAAQ,CAAC5C,MAAcD,EAASC,CAAI,CAAC,GAGrCF;AACT;AAEO,SAAS+C,EAAyBhD,GAAgC;AACvE,QAAMU,IAA8B,CAAA,GAC9BuC,wBAAgB,IAAA;AAGtB,WAASC,EAAiB/C,GAAiB;AACzC,IAAI,CAACA,KAAQ,OAAOA,KAAS,aAEzBA,EAAK,SAAS,sBAChB8C,EAAU,IAAI9C,EAAK,EAAE,GAGnBA,EAAK,QAAQ,MAAM,QAAQA,EAAK,IAAI,KACtCA,EAAK,KAAK,QAAQ+C,CAAgB,GAEhC/C,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW,QAAQ+C,CAAgB;AAAA,EAE5C;AAIA,WAAShD,EACPC,GACAgD,GACA9E,IAAuB,CAAA,GACjB;AAIN,QAHI,CAAC8B,KAAQ,OAAOA,KAAS,YAGzBgD,KAAYF,EAAU,IAAIE,CAAQ,EAAG;AAGzC,QACE,MAAM,QAAQhD,EAAK,IAAI,MACtBA,EAAK,KAAK,SAAS,aAAa,KAAKA,EAAK,KAAK,SAAS,YAAY,OACpEA,EAAK,SAAS,oBAAoBA,EAAK,SAAS,oBACjD;AACA,YAAMW,IAAenD,EAAiBwC,EAAK,QAAQ,MAAM,GACnDY,IAAWpB,EAAqBQ,EAAK,MAAMA,EAAK,IAAI;AAE1D,MAAAO,EAAW,KAAK;AAAA,QACd,IAAIP,EAAK;AAAA,QACT,MAAMA,EAAK,QAAQ;AAAA,QACnB,MAAMA,EAAK;AAAA,QACX,MAAMA,EAAK,QAAQ,CAAA;AAAA,QACnB,UAAUW;AAAA;AAAA,QACV,UAAAC;AAAA;AAAA,QAEA,aAAa,CAAC,GAAG1C,CAAU;AAAA,MAAA,CACiB;AAAA,IAChD;AAIA,UAAM2C,IAAoB,CAAC,GAAG3C,CAAU;AACxC,QACE8B,EAAK,SACJA,EAAK,MAAM,WAAW,YAAY,KACjCA,EAAK,MAAM,WAAW,YAAY,IACpC;AACA,YAAMvC,IAAOuC,EAAK,KAAK,KAAA,GAGjBc,IACJ,iBAAiB,KAAKrD,CAAI,KAAKA,EAAK,kBAAkB;AACxD,MAAIA,KAAQ,CAACqD,KACXD,EAAkB,KAAKb,EAAK,IAAI;AAAA,IAEpC;AAGA,UAAMiD,IAAYjD,EAAK;AACvB,IAAIA,EAAK,QAAQ,MAAM,QAAQA,EAAK,IAAI,KACtCA,EAAK,KAAK;AAAA,MAAQ,CAACe,MACjBhB,EAASgB,GAAOkC,GAAWpC,CAAiB;AAAA,IAAA,GAG5Cb,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW;AAAA,MAAQ,CAACe,MACvBhB,EAASgB,GAAOkC,GAAWpC,CAAiB;AAAA,IAAA,GAG5Cb,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW;AAAA,MAAQ,CAACe,MACvBhB,EAASgB,GAAOkC,GAAWpC,CAAiB;AAAA,IAAA;AAAA,EAGlD;AAGA,QAAM+B,IACJ/C,EAAS,MAAM,QAAQA,EAAS,QAASA,EAAiB,MAAM,QAAQ,CAAA;AAE1E,EAAI,MAAM,QAAQ+C,CAAI,KAAKA,EAAK,SAAS,MACvCA,EAAK,QAAQG,CAAgB,GAC7BH,EAAK,QAAQ,CAAC5C,MAAcD,EAASC,CAAI,CAAC;AAK5C,QAAMkB,wBAAqB,IAAA;AAI3B,SAAAX,EAAW,QAAQ,CAACG,MAAS;AAC3B,UAAMS,IAAeT,GACfvC,IAAWuC,EAAK;AACtB,IAAKQ,EAAe,IAAI/C,CAAQ,KAC9B+C,EAAe,IAAI/C,GAAU,EAAE,GAEjC+C,EAAe,IAAI/C,CAAQ,EAAG,KAAKgD,CAAY;AAAA,EACjD,CAAC,GAIDD,EAAe,QAAQ,CAACE,GAAOC,MAAc;AAC3C,QAAID,EAAM,WAAW;AAEnB;AAIF,IAAAA,EAAM,QAAQ,CAACV,MAAS;AACtB,YAAMlC,IAAa4C,EAChB,OAAO,CAACJ,MAAMA,EAAE,OAAON,EAAK,EAAE,EAC9B,IAAI,CAACM,MAAMA,EAAE,eAAe,EAAE,GAE3BM,IAAchD;AAAA,QAClBoC,EAAK,eAAe,CAAA;AAAA,QACpBlC;AAAA,MAAA;AAIF,MAAAkC,EAAK,WAAW1C;AAAA,QACd0C,EAAK,QAAQ;AAAA,QACbY;AAAA,MAAA;AAAA,IAEJ,CAAC;AAGD,QAAIC,IAAgB,IAChBC,IAAY;AAChB,UAAMC,IAAgB;AAEtB,WAAOF,KAAiBC,IAAYC,KAAe;AACjD,MAAAD;AACA,YAAME,wBAA0B,IAAA;AAIhC,MAAAN,EAAM,QAAQ,CAACV,MAAS;AACtB,QAAKgB,EAAoB,IAAIhB,EAAK,QAAQ,KACxCgB,EAAoB,IAAIhB,EAAK,UAAU,CAAA,CAAE,GAE3CgB,EAAoB,IAAIhB,EAAK,QAAQ,EAAG,KAAKA,CAAI;AAAA,MACnD,CAAC,GAEDa,IAAgB,IAEhBG,EAAoB,QAAQ,CAACC,GAAUC,MAAmB;AACxD,QAAID,EAAS,SAAS,MACpBJ,IAAgB,IAEhBI,EAAS,QAAQ,CAACjB,MAAS;AAEzB,gBAAMmB,IAAWnB,EAAK,eAAe,CAAA,GAC/BoB,IAAiBH,EACpB,OAAO,CAACX,MAAMA,EAAE,OAAON,EAAK,EAAE,EAC9B,IAAI,CAACM,MAAMA,EAAE,eAAe,EAAE;AAGjC,cAAIvC,IAAqB;AACzB,gBAAMC,IAAkB,KAAK;AAAA,YAC3BmD,EAAS;AAAA,YACT,GAAGC,EAAe,IAAI,CAACnD,MAAMA,EAAE,MAAM;AAAA,UAAA;AAGvC,mBAASC,IAAI,GAAGA,IAAIF,GAAiBE,KAAK;AACxC,kBAAMC,IAAWgD,EAASjD,CAAC;AAI3B,gBAHiBkD,EAAe,MAAM,CAAChD,MAC9BA,EAAUF,CAAC,MAAMC,CACzB;AAEC,cAAAJ;AAAA;AAEA;AAAA,UAEJ;AAGA,gBAAMM,IAAuB8C,EAAS,MAAMpD,CAAkB;AAG9D,cAAIsD,IAAc;AAClB,mBACM/C,IAAe,GACnBA,KAAgBD,EAAqB,QACrCC,KACA;AACA,kBAAMgD,IAAejD,EAAqB,MAAM,GAAGC,CAAY,GACzDiD,IAAoBjE;AAAA,cACxB0C,EAAK,QAAQ;AAAA,cACbsB;AAAA,YAAA;AAgCF,gBA5BiBzB,EAAW,MAAM,CAAC2B,MAAc;AAC/C,kBAAIA,EAAU,OAAOxB,EAAK,GAAI,QAAO;AAErC,kBAAIiB,EAAS,KAAK,CAACX,MAAMA,EAAE,OAAOkB,EAAU,EAAE,GAAG;AAC/C,sBAAMC,IACHD,EACE,eAAe,CAAA,GACdE,IAA0B,KAAK;AAAA,kBACnC3D;AAAA,kBACA0D,EAAc;AAAA,gBAAA,GAKVE,IAH4BF,EAAc;AAAA,kBAC9CC;AAAA,gBAAA,EAEkD;AAAA,kBAClD;AAAA,kBACApD;AAAA,gBAAA,GAEIsD,IAAqBtE;AAAA,kBACzBkE,EAAU,QAAQ;AAAA,kBAClBG;AAAA,gBAAA;AAEF,uBAAOJ,MAAsBK;AAAA,cAC/B;AAEA,qBAAOL,MAAsBC,EAAU;AAAA,YACzC,CAAC,GAEa;AACZ,cAAAxB,EAAK,WAAWuB,GAChBF,IAAc;AACd;AAAA,YACF;AAAA,UACF;AAIA,UAAKA,MACHrB,EAAK,WAAW1C;AAAA,YACd0C,EAAK,QAAQ;AAAA,YACbmB;AAAA,UAAA;AAAA,QAGN,CAAC;AAAA,MAEL,CAAC;AAAA,IACH;AAIA,UAAMU,wBAA+B,IAAA;AAIrC,IAAAnB,EAAM,QAAQ,CAACV,MAAS;AACtB,MAAK6B,EAAyB,IAAI7B,EAAK,QAAQ,KAC7C6B,EAAyB,IAAI7B,EAAK,UAAU,CAAA,CAAE,GAEhD6B,EAAyB,IAAI7B,EAAK,QAAQ,EAAG,KAAKA,CAAI;AAAA,IACxD,CAAC,GAED6B,EAAyB,QAAQ,CAACC,GAAeC,MAAuB;AACtE,UAAID,EAAc,SAAS,KAECA,EAAc,MAAM,CAAC9B,MAAS;AACtD,cAAMnC,IAAWmC,EAAK,eAAe,CAAA;AACrC,eAAO8B,EAAc,MAAM,CAACN,MAAc;AACxC,cAAIA,EAAU,OAAOxB,EAAK,GAAI,QAAO;AACrC,gBAAM5B,IAAYoD,EAAU,eAAe,CAAA;AAC3C,iBAAO/C,EAAYZ,GAAUO,CAAS;AAAA,QACxC,CAAC;AAAA,MACH,CAAC,GAGsB;AACrB,YAAIlB,IAAQ;AACZ,QAAA4E,EAAc,QAAQ,CAAC9B,MAAS;AAC9B,UAAI9C,IAAQ,MACV8C,EAAK,WAAW,GAAG+B,CAAkB,GAAG7E,IAAQ,CAAC,KAEnDA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IAEJ,CAAC,GAGDwD,EAAM,QAAQ,CAACV,MAAS;AACtB,aAAQA,EAAa;AAAA,IACvB,CAAC;AAAA,EACH,CAAC,GAEMH;AACT;AAEO,SAAS2C,EAAgBrD,GAAiC;AAC/D,QAAMsD,wBAAgB,IAAA;AAEtB,WAASpD,EAASC,GAAiB;AACjC,QAAI,GAACA,KAAQ,OAAOA,KAAS,WAG7B;AAAA,UACEA,EAAK,SAAS,kCACd,MAAM,QAAQA,EAAK,IAAI,GACvB;AACA,cAAMoD,IAAgBpD,EAAK,KAAK;AAAA,UAAK,CAACqD,MACpCA,EAAI,WAAW,cAAc;AAAA,QAAA;AAE/B,YAAID,GAAe;AACjB,gBAAME,IAAQF,EAAc,MAAM,GAAG;AACrC,cAAIE,EAAM,UAAU,GAAG;AACrB,kBAAMC,IAAYD,EAAM,CAAC,GACnBE,IAAYF,EAAM,CAAC;AAEzB,YAAKH,EAAU,IAAIK,CAAS,KAC1BL,EAAU,IAAIK,GAAW;AAAA,cACvB,WAAAA;AAAA,cACA,WAAAD;AAAA,cACA,UAAU,CAAA;AAAA,YAAC,CACZ,GAGWJ,EAAU,IAAIK,CAAS,EAC/B,SAAS,KAAK;AAAA,cAClB,IAAIxD,EAAK;AAAA,cACT,MAAMA,EAAK,QAAQ;AAAA,YAAA,CACpB;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAGA,MAAIA,EAAK,QAAQ,MAAM,QAAQA,EAAK,IAAI,KACtCA,EAAK,KAAK,QAAQD,CAAQ,GAExBC,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW,QAAQD,CAAQ,GAE9BC,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW,QAAQD,CAAQ;AAAA;AAAA,EAEpC;AAGA,QAAM6C,IACJ/C,EAAS,MAAM,QAAQA,EAAS,QAASA,EAAiB,MAAM,QAAQ,CAAA;AAE1E,SAAI,MAAM,QAAQ+C,CAAI,KAAKA,EAAK,SAAS,KACvCA,EAAK,QAAQ,CAAC5C,MAAcD,EAASC,CAAI,CAAC,GAGrC,MAAM,KAAKmD,EAAU,OAAA,CAAQ;AACtC;AAEO,SAASM,EAAU5D,GAA2B;AACnD,QAAM6D,IAAoB,CAAA;AAE1B,WAAS3D,EAASC,GAAW2D,GAA6B;AACxD,QAAI,CAAC3D,KAAQ,OAAOA,KAAS,SAAU;AAGvC,UAAM4D,IACJ5D,EAAK,MAAM,WAAW,YAAY,KAAKA,EAAK,SAAS,qBACjD6D,IACJ7D,EAAK,MAAM,YAAA,EAAc,SAAS,MAAM,KACvC,MAAM,QAAQA,EAAK,IAAI,KAAKA,EAAK,KAAK,SAAS,MAAM;AAGxD,QAAI8D,IAAkB,IAClBC;AAEJ,aAASC,EAAqBC,GAAc;AAC1C,UAAI,GAACA,KAAK,OAAOA,KAAM,WAGvB;AAAA,YACE,MAAM,QAAQA,EAAE,IAAI,MACnBA,EAAE,KAAK,SAAS,eAAe,KAAKA,EAAE,KAAK,SAAS,QAAQ,IAC7D;AACA,UAAAH,IAAkB,IAClBC,IAAiBE,EAAE;AACnB;AAAA,QACF;AAGA,YAAIA,EAAE,SAAS,KAAK,WAAW,UAAU;AACvC,UAAAH,IAAkB,IAClBC,IAAiBE,EAAE;AACnB;AAAA,QACF;AAGA,QAAIA,EAAE,cAAc,MAAM,QAAQA,EAAE,UAAU,KAC5CA,EAAE,WAAW,QAAQD,CAAoB,GAEvCC,EAAE,QAAQ,MAAM,QAAQA,EAAE,IAAI,KAChCA,EAAE,KAAK,QAAQD,CAAoB;AAAA;AAAA,IAEvC;AAQA,QALIJ,MAAgBC,KAAeF,MAAoB,WACrDK,EAAqBhE,CAAI,GAIvB4D,MAAgBE,KAAmBD,IAAc;AACnD,YAAMK,IAA6B,CAAA,GAG7BC,IAAa,CAACF,GAAQ/F,IAAuB,CAAA,MAAa;AAC9D,YAAI,CAAC+F,KAAK,OAAOA,KAAM,SAAU;AAGjC,YACEA,EAAE,MAAM,WAAW,kBAAkB,KACrCA,EAAE,SAAS,0BACXA,EAAE,SAAS,2BACXA,EAAE,SAAS,2BACXA,EAAE,SAAS,8BACXA,EAAE,SAAS,0BACX;AACA,gBAAMtD,IAAenD,EAAiByG,EAAE,QAAQ,eAAe;AAC/D,UAAAC,EAAO,KAAK;AAAA,YACV,IAAID,EAAE;AAAA,YACN,MAAMA,EAAE,QAAQ;AAAA,YAChB,MAAMA,EAAE;AAAA,YACR,UAAUtD;AAAA;AAAA,YACV,aAAa,CAAC,GAAGzC,CAAU;AAAA;AAAA,UAAA,CAC5B;AAAA,QACH;AAIA,cAAM2C,IAAoB,CAAC,GAAG3C,CAAU;AACxC,YACE+F,EAAE,SACDA,EAAE,MAAM,WAAW,YAAY,KAAKA,EAAE,MAAM,WAAW,YAAY,IACpE;AACA,gBAAMxG,IAAOwG,EAAE,KAAK,KAAA,GAGdnD,IACJ,iBAAiB,KAAKrD,CAAI,KAAKA,EAAK,kBAAkB;AACxD,UAAIA,KAAQ,CAACqD,KACXD,EAAkB,KAAKoD,EAAE,IAAI;AAAA,QAEjC;AAGA,QAAIA,EAAE,cAAc,MAAM,QAAQA,EAAE,UAAU,KAC5CA,EAAE,WAAW;AAAA,UAAQ,CAAClD,MACpBoD,EAAWpD,GAAOF,CAAiB;AAAA,QAAA,GAGnCoD,EAAE,QAAQ,MAAM,QAAQA,EAAE,IAAI,KAChCA,EAAE,KAAK,QAAQ,CAAClD,MAAeoD,EAAWpD,GAAOF,CAAiB,CAAC;AAAA,MAEvE;AAEA,MAAAsD,EAAWnE,GAAM,EAAE,GAGfkE,EAAO,SAAS,KAClBR,EAAM,KAAK;AAAA,QACT,QAAQ1D,EAAK;AAAA,QACb,UAAUA,EAAK,QAAQ;AAAA,QACvB,gBAAA+D;AAAA,QACA,QAAAG;AAAA,MAAA,CACD;AAAA,IAEL;AAGA,IAAIlE,EAAK,QAAQ,MAAM,QAAQA,EAAK,IAAI,KACtCA,EAAK,KAAK;AAAA,MAAQ,CAACe,MACjBhB,EAASgB,GAAO6C,IAAc5D,IAAO2D,CAAe;AAAA,IAAA,GAGpD3D,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW;AAAA,MAAQ,CAACe,MACvBhB,EAASgB,GAAO6C,IAAc5D,IAAO2D,CAAe;AAAA,IAAA,GAGpD3D,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW;AAAA,MAAQ,CAACe,MACvBhB,EAASgB,GAAO6C,IAAc5D,IAAO2D,CAAe;AAAA,IAAA;AAAA,EAG1D;AAGA,QAAMf,IACJ/C,EAAS,MAAM,QAAQA,EAAS,QAASA,EAAiB,MAAM,QAAQ,CAAA;AAE1E,SAAI,MAAM,QAAQ+C,CAAI,KAAKA,EAAK,SAAS,KACvCA,EAAK,QAAQ,CAAC5C,MAAcD,EAASC,CAAI,CAAC,GAGrC0D;AACT;AAMO,SAASU,EACdvE,GACA6D,GACmB;AACnB,QAAMW,IAAkC,CAAA,GAGlCC,wBAAmB,IAAA;AACzB,EAAAZ,EAAM,QAAQ,CAACa,MAAS;AACtB,IAAAA,EAAK,OAAO,QAAQ,CAACC,MAAU;AAC7B,MAAAF,EAAa,IAAIE,EAAM,EAAE;AAAA,IAC3B,CAAC;AAAA,EACH,CAAC;AAGD,WAASzE,EAASC,GAAW9B,IAAuB,IAAU;AAC5D,QAAI,CAAC8B,KAAQ,OAAOA,KAAS,SAAU;AAGvC,QAAIA,EAAK,SAAS,4BAA4B,CAACsE,EAAa,IAAItE,EAAK,EAAE,GAAG;AACxE,YAAMW,IAAenD,EAAiBwC,EAAK,QAAQ,aAAa;AAChE,MAAAqE,EAAa,KAAK;AAAA,QAChB,IAAIrE,EAAK;AAAA,QACT,MAAMA,EAAK,QAAQ;AAAA,QACnB,UAAUW;AAAA,QACV,aAAa,CAAC,GAAGzC,CAAU;AAAA,MAAA,CAC5B;AAAA,IACH;AAGA,UAAM2C,IAAoB,CAAC,GAAG3C,CAAU;AACxC,QACE8B,EAAK,SACJA,EAAK,MAAM,WAAW,YAAY,KACjCA,EAAK,MAAM,WAAW,YAAY,IACpC;AACA,YAAMvC,IAAOuC,EAAK,KAAK,KAAA,GACjBc,IACJ,iBAAiB,KAAKrD,CAAI,KAAKA,EAAK,kBAAkB;AACxD,MAAIA,KAAQ,CAACqD,KACXD,EAAkB,KAAKb,EAAK,IAAI;AAAA,IAEpC;AAGA,IAAIA,EAAK,QAAQ,MAAM,QAAQA,EAAK,IAAI,KACtCA,EAAK,KAAK,QAAQ,CAACe,MAAehB,EAASgB,GAAOF,CAAiB,CAAC,GAElEb,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW;AAAA,MAAQ,CAACe,MACvBhB,EAASgB,GAAOF,CAAiB;AAAA,IAAA,GAGjCb,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW;AAAA,MAAQ,CAACe,MACvBhB,EAASgB,GAAOF,CAAiB;AAAA,IAAA;AAAA,EAGvC;AAGA,QAAM+B,IACJ/C,EAAS,MAAM,QAAQA,EAAS,QAASA,EAAiB,MAAM,QAAQ,CAAA;AAE1E,SAAI,MAAM,QAAQ+C,CAAI,KAAKA,EAAK,SAAS,KACvCA,EAAK,QAAQ,CAAC5C,MAAcD,EAASC,CAAI,CAAC,GAI5CyE,EAAoBJ,CAAY,GAEzBA;AACT;AAKA,SAASI,EAAoBJ,GAAuC;AAClE,QAAMnD,wBAAqB,IAAA;AAK3B,EAAAmD,EAAa,QAAQ,CAACG,MAAU;AAC9B,UAAME,IAAgBF,GAChBrG,IAAWqG,EAAM;AACvB,IAAKtD,EAAe,IAAI/C,CAAQ,KAC9B+C,EAAe,IAAI/C,GAAU,EAAE,GAEjC+C,EAAe,IAAI/C,CAAQ,EAAG,KAAKuG,CAAa;AAAA,EAClD,CAAC,GAEDxD,EAAe,QAAQ,CAACE,GAAOC,MAAc;AAC3C,QAAID,EAAM,WAAW,GAAG;AACtB,aAAQA,EAAM,CAAC,EAAU;AACzB;AAAA,IACF;AAGA,IAAAA,EAAM,QAAQ,CAACoD,MAAU;AACvB,YAAMhG,IAAa4C,EAChB,OAAO,CAACxC,MAAMA,EAAE,OAAO4F,EAAM,EAAE,EAC/B,IAAI,CAAC5F,MAAMA,EAAE,eAAe,EAAE,GAE3B0C,IAAchD;AAAA,QAClBkG,EAAM,eAAe,CAAA;AAAA,QACrBhG;AAAA,MAAA;AAGF,MAAAgG,EAAM,WAAWxG;AAAA,QACfwG,EAAM,QAAQ;AAAA,QACdlD;AAAA,MAAA;AAAA,IAEJ,CAAC,GAGDF,EAAM,QAAQ,CAACoD,MAAU;AACvB,aAAQA,EAAc;AAAA,IACxB,CAAC;AAAA,EACH,CAAC;AACH;AAMO,SAASG,GAAkB9E,GAAmC;AACnE,QAAM+E,IAA8B,CAAA;AAEpC,WAAS7E,EAASC,GAAW9B,IAAuB,IAAU;AAC5D,QAAI,CAAC8B,KAAQ,OAAOA,KAAS,SAAU;AAGvC,UAAM6E,IACJ,MAAM,QAAQ7E,EAAK,IAAI,KACvBA,EAAK,KAAK,KAAK,CAACqD,MAAgBA,EAAI,WAAW,SAAS,CAAC,GACrDyB,IAAa9E,EAAK,WAAW,OAAOA,EAAK,WAAY;AAE3D,QAAI6E,KAAgBC,GAAY;AAE9B,UAAIC,IAAa;AACjB,UAAI,MAAM,QAAQ/E,EAAK,IAAI,GAAG;AAC5B,cAAMgF,IAAYhF,EAAK,KAAK;AAAA,UAAK,CAACqD,MAChCA,EAAI,WAAW,SAAS;AAAA,QAAA;AAE1B,QAAI2B,MACFD,IAAaC,EAAU,QAAQ,WAAW,EAAE;AAAA,MAEhD;AACA,MAAIhF,EAAK,SAAS,KAAK,WACrB+E,IAAa/E,EAAK,QAAQ,IAAI;AAGhC,YAAMW,IAAenD,EAAiBwC,EAAK,QAAQ,QAAQ;AAC3D,MAAA4E,EAAQ,KAAK;AAAA,QACX,IAAI5E,EAAK;AAAA,QACT,MAAMA,EAAK,QAAQ;AAAA,QACnB,UAAUW;AAAA,QACV,YAAAoE;AAAA,QACA,aAAa,CAAC,GAAG7G,CAAU;AAAA,MAAA,CAC5B;AAAA,IACH;AAGA,UAAM2C,IAAoB,CAAC,GAAG3C,CAAU;AACxC,QACE8B,EAAK,SACJA,EAAK,MAAM,WAAW,YAAY,KACjCA,EAAK,MAAM,WAAW,YAAY,IACpC;AACA,YAAMvC,IAAOuC,EAAK,KAAK,KAAA,GACjBc,IACJ,iBAAiB,KAAKrD,CAAI,KAAKA,EAAK,kBAAkB;AACxD,MAAIA,KAAQ,CAACqD,KACXD,EAAkB,KAAKb,EAAK,IAAI;AAAA,IAEpC;AAGA,IAAIA,EAAK,QAAQ,MAAM,QAAQA,EAAK,IAAI,KACtCA,EAAK,KAAK,QAAQ,CAACe,MAAehB,EAASgB,GAAOF,CAAiB,CAAC,GAElEb,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW;AAAA,MAAQ,CAACe,MACvBhB,EAASgB,GAAOF,CAAiB;AAAA,IAAA,GAGjCb,EAAK,cAAc,MAAM,QAAQA,EAAK,UAAU,KAClDA,EAAK,WAAW;AAAA,MAAQ,CAACe,MACvBhB,EAASgB,GAAOF,CAAiB;AAAA,IAAA;AAAA,EAGvC;AAGA,QAAM+B,IACJ/C,EAAS,MAAM,QAAQA,EAAS,QAASA,EAAiB,MAAM,QAAQ,CAAA;AAE1E,SAAI,MAAM,QAAQ+C,CAAI,KAAKA,EAAK,SAAS,KACvCA,EAAK,QAAQ,CAAC5C,MAAcD,EAASC,CAAI,CAAC,GAI5CiF,EAAqBL,CAAO,GAErBA;AACT;AAKA,SAASK,EAAqBL,GAAmC;AAC/D,QAAM1D,wBAAqB,IAAA;AAK3B,EAAA0D,EAAQ,QAAQ,CAACM,MAAW;AAC1B,UAAMC,IAAiBD,GAGjB/G,IAAW+G,EAAO;AACxB,IAAKhE,EAAe,IAAI/C,CAAQ,KAC9B+C,EAAe,IAAI/C,GAAU,EAAE,GAEjC+C,EAAe,IAAI/C,CAAQ,EAAG,KAAKgH,CAAc;AAAA,EACnD,CAAC,GAEDjE,EAAe,QAAQ,CAACE,GAAOC,MAAc;AAC3C,QAAID,EAAM,WAAW,GAAG;AACtB,aAAQA,EAAM,CAAC,EAAU;AACzB;AAAA,IACF;AAGA,IAAAA,EAAM,QAAQ,CAAC8D,MAAW;AACxB,YAAM1G,IAAa4C,EAChB,OAAO,CAAC/B,MAAMA,EAAE,OAAO6F,EAAO,EAAE,EAChC,IAAI,CAAC7F,MAAMA,EAAE,eAAe,EAAE,GAE3BiC,IAAchD;AAAA,QAClB4G,EAAO,eAAe,CAAA;AAAA,QACtB1G;AAAA,MAAA;AAGF,MAAA0G,EAAO,WAAWlH;AAAA,QAChBkH,EAAO,QAAQ;AAAA,QACf5D;AAAA,MAAA;AAAA,IAEJ,CAAC,GAGDF,EAAM,QAAQ,CAAC8D,MAAW;AACxB,aAAQA,EAAe;AAAA,IACzB,CAAC;AAAA,EACH,CAAC;AACH;AAMO,SAASE,GAAkB1B,GAAyB;AACzD,EAAAA,EAAM,QAAQ,CAACa,MAAS;AACtB,UAAML,IAASK,EAAK,QAGdrD,wBAAqB,IAAA;AAK3B,IAAAgD,EAAO,QAAQ,CAACM,MAAU;AACxB,YAAME,IAAgBF,GAGhBrG,IAAWqG,EAAM;AACvB,MAAKtD,EAAe,IAAI/C,CAAQ,KAC9B+C,EAAe,IAAI/C,GAAU,EAAE,GAEjC+C,EAAe,IAAI/C,CAAQ,EAAG,KAAKuG,CAAa;AAAA,IAClD,CAAC,GAGDxD,EAAe,QAAQ,CAACE,GAAOC,MAAc;AAC3C,UAAID,EAAM,WAAW,GAAG;AAGtB,eAAQA,EAAM,CAAC,EAAU;AACzB;AAAA,MACF;AAGA,MAAAA,EAAM,QAAQ,CAACoD,MAAU;AACvB,cAAMhG,IAAa4C,EAChB,OAAO,CAAC,MAAM,EAAE,OAAOoD,EAAM,EAAE,EAC/B,IAAI,CAAC,MAAM,EAAE,eAAe,EAAE,GAE3BlD,IAAchD;AAAA,UAClBkG,EAAM,eAAe,CAAA;AAAA,UACrBhG;AAAA,QAAA;AAIF,QAAAgG,EAAM,WAAWxG;AAAA,UACfwG,EAAM,QAAQ;AAAA,UACdlD;AAAA,QAAA;AAAA,MAEJ,CAAC;AAGD,UAAIC,IAAgB,IAChBC,IAAY;AAChB,YAAMC,IAAgB;AAEtB,aAAOF,KAAiBC,IAAYC,KAAe;AACjD,QAAAD;AACA,cAAME,wBAA0B,IAAA;AAIhC,QAAAN,EAAM,QAAQ,CAACoD,MAAU;AACvB,UAAK9C,EAAoB,IAAI8C,EAAM,QAAQ,KACzC9C,EAAoB,IAAI8C,EAAM,UAAU,CAAA,CAAE,GAE5C9C,EAAoB,IAAI8C,EAAM,QAAQ,EAAG,KAAKA,CAAK;AAAA,QACrD,CAAC,GAEDjD,IAAgB,IAEhBG,EAAoB,QAAQ,CAACC,GAAUC,MAAmB;AACxD,UAAID,EAAS,SAAS,MACpBJ,IAAgB,IAEhBI,EAAS,QAAQ,CAAC6C,MAAU;AAC1B,kBAAM3C,IAAW2C,EAAM,eAAe,CAAA,GAChC1C,IAAiBH,EACpB,OAAO,CAAC/C,MAAMA,EAAE,OAAO4F,EAAM,EAAE,EAC/B,IAAI,CAAC5F,MAAMA,EAAE,eAAe,EAAE;AAGjC,gBAAIH,IAAqB;AACzB,kBAAMC,IAAkB,KAAK;AAAA,cAC3BmD,EAAS;AAAA,cACT,GAAGC,EAAe,IAAI,CAACnD,MAAMA,EAAE,MAAM;AAAA,YAAA;AAGvC,qBAASC,IAAI,GAAGA,IAAIF,GAAiBE,KAAK;AACxC,oBAAMC,IAAWgD,EAASjD,CAAC;AAI3B,kBAHiBkD,EAAe,MAAM,CAAChD,MAC9BA,EAAUF,CAAC,MAAMC,CACzB;AAEC,gBAAAJ;AAAA;AAEA;AAAA,YAEJ;AAGA,kBAAMM,IAAuB8C,EAAS,MAAMpD,CAAkB;AAG9D,gBAAIsD,IAAc;AAClB,qBACM/C,IAAe,GACnBA,KAAgBD,EAAqB,QACrCC,KACA;AACA,oBAAMgD,IAAejD,EAAqB;AAAA,gBACxC;AAAA,gBACAC;AAAA,cAAA,GAEIiD,IAAoBjE;AAAA,gBACxBwG,EAAM,QAAQ;AAAA,gBACdxC;AAAA,cAAA;AAmCF,kBA/BiBkC,EAAO,MAAM,CAACmB,MAAe;AAC5C,oBAAIA,EAAW,OAAOb,EAAM,GAAI,QAAO;AAEvC,oBAAI7C,EAAS,KAAK,CAAC/C,MAAMA,EAAE,OAAOyG,EAAW,EAAE,GAAG;AAChD,wBAAMlD,IAEFkD,EAGA,eAAe,CAAA,GACbjD,IAA0B,KAAK;AAAA,oBACnC3D;AAAA,oBACA0D,EAAc;AAAA,kBAAA,GAKVE,IAH4BF,EAAc;AAAA,oBAC9CC;AAAA,kBAAA,EAEkD;AAAA,oBAClD;AAAA,oBACApD;AAAA,kBAAA,GAEIsD,IAAqBtE;AAAA,oBACzBqH,EAAW,QAAQ;AAAA,oBACnBhD;AAAA,kBAAA;AAEF,yBAAOJ,MAAsBK;AAAA,gBAC/B;AAEA,uBAAOL,MAAsBoD,EAAW;AAAA,cAC1C,CAAC,GAEa;AACZ,gBAAAb,EAAM,WAAWvC,GACjBF,IAAc;AACd;AAAA,cACF;AAAA,YACF;AAIA,YAAKA,MACHyC,EAAM,WAAWxG;AAAA,cACfwG,EAAM,QAAQ;AAAA,cACdzF,EAAqB,SAAS,IAAIA,IAAuB,CAAA;AAAA,YAAC;AAAA,UAGhE,CAAC;AAAA,QAEL,CAAC;AAAA,MACH;AAIA,YAAMwD,wBAA+B,IAAA;AAIrC,MAAAnB,EAAM,QAAQ,CAACoD,MAAU;AACvB,QAAKjC,EAAyB,IAAIiC,EAAM,QAAQ,KAC9CjC,EAAyB,IAAIiC,EAAM,UAAU,CAAA,CAAE,GAEjDjC,EAAyB,IAAIiC,EAAM,QAAQ,EAAG,KAAKA,CAAK;AAAA,MAC1D,CAAC,GAEDjC,EAAyB,QAAQ,CAACC,GAAeC,MAAuB;AACtE,YAAID,EAAc,SAAS,KAECA,EAAc,MAAM,CAACgC,MAAU;AACvD,gBAAMjG,IAAWiG,EAAM,eAAe,CAAA;AACtC,iBAAOhC,EAAc,MAAM,CAAC6C,MAAe;AACzC,gBAAIA,EAAW,OAAOb,EAAM,GAAI,QAAO;AACvC,kBAAM1F,IAAYuG,EAAW,eAAe,CAAA;AAC5C,mBAAOlG,EAAYZ,GAAUO,CAAS;AAAA,UACxC,CAAC;AAAA,QACH,CAAC,GAGsB;AACrB,cAAIlB,IAAQ;AACZ,UAAA4E,EAAc,QAAQ,CAACgC,MAAU;AAC/B,YAAI5G,IAAQ,MACV4G,EAAM,WAAW,GAAG/B,CAAkB,GAAG7E,IAAQ,CAAC,KAEpDA;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MAEJ,CAAC,GAGDwD,EAAM,QAAQ,CAACoD,MAAU;AACvB,eAAQA,EAAc;AAAA,MACxB,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;"}
1
+ {"version":3,"file":"parser.js","sources":["../../src/codegen/parser.ts"],"sourcesContent":["import {\n ComponentInfo,\n SliderInfo,\n InputGroupInfo,\n FormInfo,\n SelectInputInfo,\n ActionButtonInfo,\n} from \"./types\";\nimport { qualifyPropNames } from \"./propQualification\";\n\n/**\n * Sanitizes a component name into a valid camelCase prop name\n *\n * Removes special characters, handles spaces, and converts to camelCase.\n *\n * @param name - Raw component name from Figma/design tool\n * @returns Valid JavaScript property name\n *\n * @example\n * sanitizePropName(\"My Component!\") // \"myComponent\"\n * sanitizePropName(\"user-name\") // \"userName\"\n */\nexport function sanitizePropName(name: string): string {\n // Convert to camelCase and remove invalid characters\n const cleaned = name\n .replace(/[^a-zA-Z0-9\\s]/g, \"\") // Remove special chars\n .trim();\n\n if (!cleaned) return \"item\";\n\n return cleaned\n .split(/\\s+/)\n .map((word, index) => {\n if (!word) return \"\";\n // Handle all-uppercase words (like \"SHOP\", \"NOW\") by lowercasing them first\n const normalizedWord =\n word === word.toUpperCase() && word.length > 1\n ? word.toLowerCase()\n : word;\n const firstChar = normalizedWord.charAt(0);\n const rest = normalizedWord.slice(1);\n if (index === 0) {\n return firstChar.toLowerCase() + rest;\n }\n return firstChar.toUpperCase() + rest;\n })\n .join(\"\")\n .replace(/^[0-9]/, \"_$&\"); // Prefix numbers with underscore\n}\n\nexport function generateQualifiedPropName(\n componentName: string,\n parentPath: string[]\n): string {\n // Start with the component's own name\n const baseName = sanitizePropName(componentName);\n\n // If no parent path, just return the base name\n if (parentPath.length === 0) {\n return baseName;\n }\n\n // Filter out empty parts and reverse so we build from root to leaf\n const validParentParts = parentPath\n .filter((part) => part && part.trim())\n .reverse();\n\n if (validParentParts.length === 0) {\n return baseName;\n }\n\n // Build qualified name: parent1Parent2ComponentName\n // Each parent part is sanitized individually, then combined\n const sanitizedParentParts = validParentParts.map((part) =>\n sanitizePropName(part)\n );\n\n // Join parent parts (all start uppercase) with base name (starts lowercase)\n const parentPrefix = sanitizedParentParts\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n\n return parentPrefix + baseName;\n}\n\n/**\n * Finds the minimal distinguishing path suffix for a component when compared to others.\n * Returns the shortest suffix (from root side, working towards leaf) that makes this path unique.\n *\n * The algorithm finds where paths first diverge from the root, then takes the minimal\n * distinguishing part from that divergence point towards the leaf.\n */\nexport function findMinimalDistinguishingPath(\n thisPath: string[],\n otherPaths: string[][]\n): string[] {\n if (otherPaths.length === 0) {\n // No other paths to compare, return empty (no qualification needed)\n return [];\n }\n\n // Find the longest common prefix (from root side)\n let commonPrefixLength = 0;\n const maxCommonLength = Math.min(\n thisPath.length,\n ...otherPaths.map((p) => p.length)\n );\n\n for (let i = 0; i < maxCommonLength; i++) {\n const thisPart = thisPath[i];\n // Check if all other paths have the same part at this position\n const allMatch = otherPaths.every((otherPath) => {\n return otherPath[i] === thisPart;\n });\n\n if (allMatch) {\n commonPrefixLength++;\n } else {\n break;\n }\n }\n\n // The distinguishing part starts after the common prefix\n const distinguishingSuffix = thisPath.slice(commonPrefixLength);\n\n // Now find the minimal suffix that's unique\n // Try progressively shorter suffixes (from root side) until we find one that's unique\n for (\n let suffixLength = 1;\n suffixLength <= distinguishingSuffix.length;\n suffixLength++\n ) {\n const thisSuffix = distinguishingSuffix.slice(0, suffixLength);\n\n // Check if this suffix is unique when combined with the common prefix\n const isUnique = otherPaths.every((otherPath) => {\n // If other path is shorter than common prefix + suffix, it can't match\n if (otherPath.length < commonPrefixLength + suffixLength) {\n return true; // Different length means unique\n }\n // Check if the suffix matches at the divergence point\n const otherSuffix = otherPath.slice(\n commonPrefixLength,\n commonPrefixLength + suffixLength\n );\n return !arraysEqual(thisSuffix, otherSuffix);\n });\n\n if (isUnique) {\n // Found minimal distinguishing suffix\n return thisSuffix;\n }\n }\n\n // If we get here, paths are identical (shouldn't happen, but handle it)\n return distinguishingSuffix;\n}\n\n/**\n * Helper to compare two arrays for equality\n */\nexport function arraysEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false;\n return a.every((val, idx) => val === b[idx]);\n}\n\nexport function getComponentPropType(\n componentType: string,\n _componentName: string\n): string {\n if (componentType === \"component:image\") {\n return \"string\"; // imageUrl\n }\n if (componentType === \"component:text\") {\n return \"string\"; // text\n }\n if (componentType?.startsWith(\"component:input-\")) {\n // Input types generally return strings\n if (componentType === \"component:input-image\") {\n return \"string\"; // image URL\n }\n return \"string\"; // text inputs, email, password, etc.\n }\n // Default to any for unknown types\n return \"any\";\n}\n\nexport function getComponentPropName(componentType: string): string {\n if (componentType === \"component:image\") {\n return \"imageUrl\";\n }\n if (componentType === \"component:text\") {\n return \"text\";\n }\n return \"value\";\n}\n\nexport function findSlidersAndDataBindings(pageData: any): SliderInfo[] {\n const sliders: SliderInfo[] = [];\n\n function traverse(node: any, path: string[] = []): void {\n if (!node || typeof node !== \"object\") return;\n\n // Check if this is a slider container\n if (node.type === \"container:slider\") {\n const slider: SliderInfo = {\n id: node.id,\n name: node.name || \"Slider\",\n arrayContainer: null,\n };\n\n // Recursively look for containers with encore:data:array tag inside the slider\n let arrayContainer: any = null;\n\n const findArrayContainer = (containerNode: any): void => {\n if (arrayContainer) return; // Already found one\n\n if (!containerNode || typeof containerNode !== \"object\") return;\n\n // Check if this node is the array container\n if (\n Array.isArray(containerNode.tags) &&\n (containerNode.tags.includes(\"encore:data:array\") ||\n containerNode.tags.includes(\"bravo:data:array\"))\n ) {\n arrayContainer = containerNode;\n return;\n }\n\n // Recursively search children\n if (containerNode.body && Array.isArray(containerNode.body)) {\n containerNode.body.forEach(findArrayContainer);\n }\n if (\n containerNode.containers &&\n Array.isArray(containerNode.containers)\n ) {\n containerNode.containers.forEach(findArrayContainer);\n }\n if (\n containerNode.components &&\n Array.isArray(containerNode.components)\n ) {\n containerNode.components.forEach(findArrayContainer);\n }\n };\n\n // Start search from the slider node itself (checking its children)\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach(findArrayContainer);\n }\n // Also check components if they exist directly\n if (\n !arrayContainer &&\n node.components &&\n Array.isArray(node.components)\n ) {\n node.components.forEach(findArrayContainer);\n }\n\n if (arrayContainer) {\n const container = arrayContainer;\n let components: ComponentInfo[] = [];\n\n // Find all components with encore:data tag, and also image components\n const imageComponents: any[] = [];\n\n const findDataComponents = (\n comp: any,\n parentPath: string[] = []\n ): void => {\n if (!comp || typeof comp !== \"object\") return;\n\n // Track image components separately (they might not have encore:data tag)\n if (comp.type === \"component:image\") {\n imageComponents.push(comp);\n }\n\n if (\n Array.isArray(comp.tags) &&\n (comp.tags.includes(\"encore:data\") ||\n comp.tags.includes(\"bravo:data\"))\n ) {\n const basePropName = sanitizePropName(comp.name || \"item\");\n const propType = getComponentPropType(comp.type, comp.name);\n // const propKey = getComponentPropName(comp.type);\n\n components.push({\n id: comp.id,\n name: comp.name || \"Unnamed\",\n type: comp.type,\n tags: comp.tags || [],\n propName: basePropName, // Will be qualified later if needed\n propType,\n // Store parent path for later qualification\n _parentPath: [...parentPath],\n } as ComponentInfo & { _parentPath: string[] });\n }\n\n // Build parent path: include this node's name if it's a container/component with a name\n // Skip generic \"Frame\" names - they're usually not meaningful for distinction\n const currentParentPath = [...parentPath];\n if (\n comp.name &&\n (comp.type?.startsWith(\"container:\") ||\n comp.type?.startsWith(\"component:\"))\n ) {\n const name = comp.name.trim();\n // Filter out generic \"Frame\" names (case-insensitive, with or without numbers/spaces)\n // But keep meaningful names like \"TripSlideFrame\" that contain other words\n const isGenericFrame =\n /^frame\\s*\\d*$/i.test(name) || name.toUpperCase() === \"FRAME\";\n if (name && !isGenericFrame) {\n currentParentPath.push(comp.name);\n }\n }\n\n // Recursively search children\n if (comp.body && Array.isArray(comp.body)) {\n comp.body.forEach((child: any) =>\n findDataComponents(child, currentParentPath)\n );\n }\n if (comp.containers && Array.isArray(comp.containers)) {\n comp.containers.forEach((child: any) =>\n findDataComponents(child, currentParentPath)\n );\n }\n if (comp.components && Array.isArray(comp.components)) {\n comp.components.forEach((child: any) =>\n findDataComponents(child, currentParentPath)\n );\n }\n };\n\n if (container.components && Array.isArray(container.components)) {\n container.components.forEach((comp: any) =>\n findDataComponents(comp, [])\n );\n }\n\n // After finding all components, if we have image components but no image with encore:data,\n // add the first image component\n const hasImageWithData = components.some(\n (c) => c.type === \"component:image\"\n );\n if (!hasImageWithData && imageComponents.length > 0) {\n const imageComp = imageComponents[0];\n // For image components, use \"imageUrl\" as the prop name\n // Clean the name first, then if it contains \"image\", just use \"imageUrl\"\n const rawName = (imageComp.name || \"image\").toLowerCase();\n const basePropName = rawName.includes(\"image\")\n ? \"imageUrl\"\n : sanitizePropName(imageComp.name || \"image\");\n components.push({\n id: imageComp.id,\n name: imageComp.name || \"Image\",\n type: imageComp.type,\n tags: imageComp.tags || [],\n propName: basePropName, // Will be qualified later if needed\n propType: \"string\", // imageUrl is always string\n _parentPath: [],\n } as ComponentInfo & { _parentPath: string[] });\n }\n\n // Qualify duplicate prop names using minimal distinguishing paths\n qualifyPropNames(components);\n\n // If we have an image component, remove color components with similar names\n // (they're usually placeholders/backgrounds)\n if (imageComponents.length > 0) {\n const imageComp = imageComponents[0];\n const imageName = (imageComp.name || \"\").toLowerCase();\n components = components.filter((comp) => {\n // Keep image components\n if (comp.type === \"component:image\") return true;\n // Remove color components that seem to be placeholders for images\n if (comp.type === \"component:color\") {\n const compName = (comp.name || \"\").toLowerCase();\n // If color component name is similar to image name, it's likely a placeholder\n if (imageName.includes(compName) || compName.includes(\"image\")) {\n return false;\n }\n }\n return true;\n });\n }\n\n slider.arrayContainer = {\n id: container.id,\n name: container.name || \"Item\",\n propName: sanitizePropName(container.name || \"items\"),\n components,\n };\n }\n\n sliders.push(slider);\n }\n\n // Recursively traverse children\n if (node.body && Array.isArray(node.body)) {\n node.body.forEach((child: any) => traverse(child, [...path, \"body\"]));\n }\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach((child: any) =>\n traverse(child, [...path, \"containers\"])\n );\n }\n if (node.components && Array.isArray(node.components)) {\n node.components.forEach((child: any) =>\n traverse(child, [...path, \"components\"])\n );\n }\n }\n\n // Start traversal from page data\n // Try multiple possible locations for the body\n const body =\n pageData.data?.body || pageData.body || (pageData as any).data?.body || [];\n\n if (Array.isArray(body) && body.length > 0) {\n body.forEach((node: any) => traverse(node));\n }\n\n return sliders;\n}\n\n/**\n * Finds standalone data-bound components (not in sliders)\n *\n * Locates components tagged with encore:data (but not encore:data:array)\n * for standalone data binding at the page level.\n *\n * @param pageData - Page definition from Encore service\n * @returns Array of component metadata\n */\nexport function findStandaloneComponents(pageData: any): ComponentInfo[] {\n const components: ComponentInfo[] = [];\n const sliderIds = new Set<string>();\n\n // First, collect all slider IDs to exclude their children\n function collectSliderIds(node: any): void {\n if (!node || typeof node !== \"object\") return;\n\n if (node.type === \"container:slider\") {\n sliderIds.add(node.id);\n }\n\n if (node.body && Array.isArray(node.body)) {\n node.body.forEach(collectSliderIds);\n }\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach(collectSliderIds);\n }\n }\n\n // Traverse to find standalone components with bravo:data tags\n // Track parent component names for qualification\n function traverse(\n node: any,\n parentId?: string,\n parentPath: string[] = []\n ): void {\n if (!node || typeof node !== \"object\") return;\n\n // Skip if we're inside a slider\n if (parentId && sliderIds.has(parentId)) return;\n\n // Check if this component has bravo:data tag\n if (\n Array.isArray(node.tags) &&\n (node.tags.includes(\"encore:data\") || node.tags.includes(\"bravo:data\")) &&\n (node.type === \"component:text\" || node.type === \"component:image\")\n ) {\n const basePropName = sanitizePropName(node.name || \"item\");\n const propType = getComponentPropType(node.type, node.name);\n\n components.push({\n id: node.id,\n name: node.name || \"Unnamed\",\n type: node.type,\n tags: node.tags || [],\n propName: basePropName, // Will be qualified later if needed\n propType,\n // Store parent path for later qualification\n _parentPath: [...parentPath],\n } as ComponentInfo & { _parentPath: string[] });\n }\n\n // Build parent path: include this node's name if it's a container/component with a name\n // Skip generic \"Frame\" names - they're usually not meaningful for distinction\n const currentParentPath = [...parentPath];\n if (\n node.name &&\n (node.type?.startsWith(\"container:\") ||\n node.type?.startsWith(\"component:\"))\n ) {\n const name = node.name.trim();\n // Filter out generic \"Frame\" names (case-insensitive, with or without numbers/spaces)\n // But keep meaningful names like \"TripSlideFrame\" that contain other words\n const isGenericFrame =\n /^frame\\s*\\d*$/i.test(name) || name.toUpperCase() === \"FRAME\";\n if (name && !isGenericFrame) {\n currentParentPath.push(node.name);\n }\n }\n\n // Recursively traverse children\n const currentId = node.id;\n if (node.body && Array.isArray(node.body)) {\n node.body.forEach((child: any) =>\n traverse(child, currentId, currentParentPath)\n );\n }\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach((child: any) =>\n traverse(child, currentId, currentParentPath)\n );\n }\n if (node.components && Array.isArray(node.components)) {\n node.components.forEach((child: any) =>\n traverse(child, currentId, currentParentPath)\n );\n }\n }\n\n // Start traversal from page data\n const body =\n pageData.data?.body || pageData.body || (pageData as any).data?.body || [];\n\n if (Array.isArray(body) && body.length > 0) {\n body.forEach(collectSliderIds);\n body.forEach((node: any) => traverse(node));\n }\n\n // Qualify duplicate prop names using minimal distinguishing paths\n qualifyPropNames(components);\n\n return components;\n}\n\n/**\n * Finds input groups (radio button-like components) in the page\n *\n * Locates stateful sets tagged with encore:input-group for coordinated\n * selection behavior.\n *\n * @param pageData - Page definition from Encore service\n * @returns Array of input group metadata\n */\nexport function findInputGroups(pageData: any): InputGroupInfo[] {\n const groupsMap = new Map<string, InputGroupInfo>();\n\n function traverse(node: any): void {\n if (!node || typeof node !== \"object\") return;\n\n // Check if this is an input-stateful-set with input-group tag\n if (\n node.type === \"component:input-stateful-set\" &&\n Array.isArray(node.tags)\n ) {\n const inputGroupTag = node.tags.find((tag: string) =>\n tag.startsWith(\"input-group:\")\n );\n if (inputGroupTag) {\n const parts = inputGroupTag.split(\":\");\n if (parts.length >= 3) {\n const groupType = parts[1];\n const groupName = parts[2];\n\n if (!groupsMap.has(groupName)) {\n groupsMap.set(groupName, {\n groupName,\n groupType,\n elements: [],\n });\n }\n\n const group = groupsMap.get(groupName)!;\n group.elements.push({\n id: node.id,\n name: node.name || \"Unnamed\",\n });\n }\n }\n }\n\n // Recursively traverse children\n if (node.body && Array.isArray(node.body)) {\n node.body.forEach(traverse);\n }\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach(traverse);\n }\n if (node.components && Array.isArray(node.components)) {\n node.components.forEach(traverse);\n }\n }\n\n // Start traversal from page data\n const body =\n pageData.data?.body || pageData.body || (pageData as any).data?.body || [];\n\n if (Array.isArray(body) && body.length > 0) {\n body.forEach((node: any) => traverse(node));\n }\n\n return Array.from(groupsMap.values());\n}\n\n/**\n * Finds forms and their input fields in the page\n *\n * Locates containers tagged with encore:form and extracts all input\n * components within them for form submission handling.\n *\n * @param pageData - Page definition from Encore service\n * @returns Array of form metadata with input fields\n */\nexport function findForms(pageData: any): FormInfo[] {\n const forms: FormInfo[] = [];\n\n function traverse(node: any, parentContainer?: any): void {\n if (!node || typeof node !== \"object\") return;\n\n // Check if this is a container that might be a form\n const isContainer =\n node.type?.startsWith(\"container:\") || node.type === \"container:default\";\n const isNamedForm =\n node.name?.toLowerCase().includes(\"form\") ||\n (Array.isArray(node.tags) && node.tags.includes(\"form\"));\n\n // Check if this container or any child has a submit action\n let hasSubmitAction = false;\n let submitButtonId: string | undefined;\n\n function checkForSubmitAction(n: any): void {\n if (!n || typeof n !== \"object\") return;\n\n // Check if this node has a submit action\n if (\n Array.isArray(n.tags) &&\n (n.tags.includes(\"action:submit\") || n.tags.includes(\"submit\"))\n ) {\n hasSubmitAction = true;\n submitButtonId = n.id;\n return;\n }\n\n // Check actions\n if (n.actions?.tap?.action === \"submit\") {\n hasSubmitAction = true;\n submitButtonId = n.id;\n return;\n }\n\n // Recursively check children\n if (n.components && Array.isArray(n.components)) {\n n.components.forEach(checkForSubmitAction);\n }\n if (n.body && Array.isArray(n.body)) {\n n.body.forEach(checkForSubmitAction);\n }\n }\n\n // If this looks like a form container, check for submit actions\n if (isContainer && (isNamedForm || parentContainer === undefined)) {\n checkForSubmitAction(node);\n }\n\n // If we found a form container (has submit action or is named \"form\")\n if (isContainer && (hasSubmitAction || isNamedForm)) {\n const inputs: FormInfo[\"inputs\"] = [];\n\n // Find all input components within this container\n const findInputs = (n: any, parentPath: string[] = []): void => {\n if (!n || typeof n !== \"object\") return;\n\n // Check if this is an input component\n if (\n n.type?.startsWith(\"component:input-\") ||\n n.type === \"component:input-text\" ||\n n.type === \"component:input-image\" ||\n n.type === \"component:input-email\" ||\n n.type === \"component:input-password\" ||\n n.type === \"component:input-select\"\n ) {\n const basePropName = sanitizePropName(n.name || \"Unnamed input\");\n inputs.push({\n id: n.id,\n name: n.name || \"Unnamed input\",\n type: n.type,\n propName: basePropName, // Will be qualified later if needed\n _parentPath: [...parentPath], // Store parent path for qualification\n });\n }\n\n // Build parent path: include this node's name if it's a container/component with a name\n // Skip generic \"Frame\" names - they're usually not meaningful for distinction\n const currentParentPath = [...parentPath];\n if (\n n.name &&\n (n.type?.startsWith(\"container:\") || n.type?.startsWith(\"component:\"))\n ) {\n const name = n.name.trim();\n // Filter out generic \"Frame\" names (case-insensitive, with or without numbers/spaces)\n // But keep meaningful names like \"TripSlideFrame\" that contain other words\n const isGenericFrame =\n /^frame\\s*\\d*$/i.test(name) || name.toUpperCase() === \"FRAME\";\n if (name && !isGenericFrame) {\n currentParentPath.push(n.name);\n }\n }\n\n // Recursively search children\n if (n.components && Array.isArray(n.components)) {\n n.components.forEach((child: any) =>\n findInputs(child, currentParentPath)\n );\n }\n if (n.body && Array.isArray(n.body)) {\n n.body.forEach((child: any) => findInputs(child, currentParentPath));\n }\n };\n\n findInputs(node, []);\n\n // Only add form if it has inputs\n if (inputs.length > 0) {\n forms.push({\n formId: node.id,\n formName: node.name || \"Form\",\n submitButtonId,\n inputs,\n });\n }\n }\n\n // Recursively traverse children\n if (node.body && Array.isArray(node.body)) {\n node.body.forEach((child: any) =>\n traverse(child, isContainer ? node : parentContainer)\n );\n }\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach((child: any) =>\n traverse(child, isContainer ? node : parentContainer)\n );\n }\n if (node.components && Array.isArray(node.components)) {\n node.components.forEach((child: any) =>\n traverse(child, isContainer ? node : parentContainer)\n );\n }\n }\n\n // Start traversal from page data\n const body =\n pageData.data?.body || pageData.body || (pageData as any).data?.body || [];\n\n if (Array.isArray(body) && body.length > 0) {\n body.forEach((node: any) => traverse(node));\n }\n\n return forms;\n}\n\n/**\n * Finds standalone select input components (input-select) that are NOT inside forms.\n * These should be exposed as controlled inputs with value and onChange props.\n */\nexport function findStandaloneSelectInputs(\n pageData: any,\n forms: FormInfo[]\n): SelectInputInfo[] {\n const selectInputs: SelectInputInfo[] = [];\n\n // Collect all input IDs that are already in forms\n const formInputIds = new Set<string>();\n forms.forEach((form) => {\n form.inputs.forEach((input) => {\n formInputIds.add(input.id);\n });\n });\n\n // Traverse to find input-select components not in forms\n function traverse(node: any, parentPath: string[] = []): void {\n if (!node || typeof node !== \"object\") return;\n\n // Check if this is an input-select component\n if (node.type === \"component:input-select\" && !formInputIds.has(node.id)) {\n const basePropName = sanitizePropName(node.name || \"selectInput\");\n selectInputs.push({\n id: node.id,\n name: node.name || \"Select Input\",\n propName: basePropName,\n _parentPath: [...parentPath],\n });\n }\n\n // Build parent path for qualification\n const currentParentPath = [...parentPath];\n if (\n node.name &&\n (node.type?.startsWith(\"container:\") ||\n node.type?.startsWith(\"component:\"))\n ) {\n const name = node.name.trim();\n const isGenericFrame =\n /^frame\\s*\\d*$/i.test(name) || name.toUpperCase() === \"FRAME\";\n if (name && !isGenericFrame) {\n currentParentPath.push(node.name);\n }\n }\n\n // Recursively traverse children\n if (node.body && Array.isArray(node.body)) {\n node.body.forEach((child: any) => traverse(child, currentParentPath));\n }\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach((child: any) =>\n traverse(child, currentParentPath)\n );\n }\n if (node.components && Array.isArray(node.components)) {\n node.components.forEach((child: any) =>\n traverse(child, currentParentPath)\n );\n }\n }\n\n // Start traversal from page data\n const body =\n pageData.data?.body || pageData.body || (pageData as any).data?.body || [];\n\n if (Array.isArray(body) && body.length > 0) {\n body.forEach((node: any) => traverse(node));\n }\n\n // Qualify duplicate prop names\n qualifySelectInputs(selectInputs);\n\n return selectInputs;\n}\n\n/**\n * Qualifies select input prop names to ensure uniqueness.\n */\nfunction qualifySelectInputs(selectInputs: SelectInputInfo[]): void {\n qualifyPropNames(selectInputs);\n}\n\n/**\n * Finds action buttons - components that have action tags (action:remote, action:link, etc.)\n * or have actions defined. These should be exposed with onClick handlers.\n */\nexport function findActionButtons(pageData: any): ActionButtonInfo[] {\n const buttons: ActionButtonInfo[] = [];\n\n function traverse(node: any, parentPath: string[] = []): void {\n if (!node || typeof node !== \"object\") return;\n\n // Check if this component has an action tag or actions defined\n const hasActionTag =\n Array.isArray(node.tags) &&\n node.tags.some((tag: string) => tag.startsWith(\"action:\"));\n const hasActions = node.actions && typeof node.actions === \"object\";\n\n if (hasActionTag || hasActions) {\n // Determine the action type\n let actionType = \"tap\";\n if (Array.isArray(node.tags)) {\n const actionTag = node.tags.find((tag: string) =>\n tag.startsWith(\"action:\")\n );\n if (actionTag) {\n actionType = actionTag.replace(\"action:\", \"\");\n }\n }\n if (node.actions?.tap?.action) {\n actionType = node.actions.tap.action;\n }\n\n const basePropName = sanitizePropName(node.name || \"button\");\n buttons.push({\n id: node.id,\n name: node.name || \"Button\",\n propName: basePropName,\n actionType,\n _parentPath: [...parentPath],\n });\n }\n\n // Build parent path for qualification\n const currentParentPath = [...parentPath];\n if (\n node.name &&\n (node.type?.startsWith(\"container:\") ||\n node.type?.startsWith(\"component:\"))\n ) {\n const name = node.name.trim();\n const isGenericFrame =\n /^frame\\s*\\d*$/i.test(name) || name.toUpperCase() === \"FRAME\";\n if (name && !isGenericFrame) {\n currentParentPath.push(node.name);\n }\n }\n\n // Recursively traverse children\n if (node.body && Array.isArray(node.body)) {\n node.body.forEach((child: any) => traverse(child, currentParentPath));\n }\n if (node.containers && Array.isArray(node.containers)) {\n node.containers.forEach((child: any) =>\n traverse(child, currentParentPath)\n );\n }\n if (node.components && Array.isArray(node.components)) {\n node.components.forEach((child: any) =>\n traverse(child, currentParentPath)\n );\n }\n }\n\n // Start traversal from page data\n const body =\n pageData.data?.body || pageData.body || (pageData as any).data?.body || [];\n\n if (Array.isArray(body) && body.length > 0) {\n body.forEach((node: any) => traverse(node));\n }\n\n // Qualify duplicate prop names\n qualifyActionButtons(buttons);\n\n return buttons;\n}\n\n/**\n * Qualifies action button prop names to ensure uniqueness.\n */\nfunction qualifyActionButtons(buttons: ActionButtonInfo[]): void {\n qualifyPropNames(buttons);\n}\n\n/**\n * Qualifies form input prop names to ensure uniqueness within each form.\n * Only qualifies where necessary, using minimal distinguishing paths.\n */\nexport function qualifyFormInputs(forms: FormInfo[]): void {\n forms.forEach((form) => {\n qualifyPropNames(form.inputs);\n });\n}\n"],"names":["sanitizePropName","name","cleaned","word","index","normalizedWord","firstChar","rest","generateQualifiedPropName","componentName","parentPath","baseName","validParentParts","part","findMinimalDistinguishingPath","thisPath","otherPaths","commonPrefixLength","maxCommonLength","p","i","thisPart","otherPath","distinguishingSuffix","suffixLength","thisSuffix","otherSuffix","arraysEqual","a","b","val","idx","getComponentPropType","componentType","_componentName","getComponentPropName","findSlidersAndDataBindings","pageData","sliders","traverse","node","path","slider","arrayContainer","findArrayContainer","containerNode","container","components","imageComponents","findDataComponents","comp","basePropName","propType","currentParentPath","isGenericFrame","child","c","imageComp","qualifyPropNames","imageName","compName","body","findStandaloneComponents","sliderIds","collectSliderIds","parentId","currentId","findInputGroups","groupsMap","inputGroupTag","tag","parts","groupType","groupName","findForms","forms","parentContainer","isContainer","isNamedForm","hasSubmitAction","submitButtonId","checkForSubmitAction","inputs","findInputs","n","findStandaloneSelectInputs","selectInputs","formInputIds","form","input","qualifySelectInputs","findActionButtons","buttons","hasActionTag","hasActions","actionType","actionTag","qualifyActionButtons","qualifyFormInputs"],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ import { findMinimalDistinguishingPath as U, generateQualifiedPropName as P, arraysEqual as v } from "./parser.js";
2
+ function w(a) {
3
+ const t = /* @__PURE__ */ new Map();
4
+ return a.forEach((e) => {
5
+ const i = e.propName;
6
+ t.has(i) || t.set(i, []), t.get(i).push(e);
7
+ }), t;
8
+ }
9
+ function L(a) {
10
+ a.forEach((t) => {
11
+ const e = a.filter((h) => h.id !== t.id).map((h) => h._parentPath || []), i = U(
12
+ t._parentPath || [],
13
+ e
14
+ );
15
+ t.propName = P(
16
+ t.name || "item",
17
+ i
18
+ );
19
+ });
20
+ }
21
+ function Q(a, t) {
22
+ let e = !0, i = 0;
23
+ const h = 10;
24
+ for (; e && i < h; ) {
25
+ i++;
26
+ const s = /* @__PURE__ */ new Map();
27
+ a.forEach((r) => {
28
+ s.has(r.propName) || s.set(r.propName, []), s.get(r.propName).push(r);
29
+ }), e = !1, s.forEach((r) => {
30
+ r.length > 1 && (e = !0, r.forEach((o) => {
31
+ const f = o._parentPath || [], d = r.filter((n) => n.id !== o.id).map((n) => n._parentPath || []);
32
+ let m = 0;
33
+ const y = Math.min(
34
+ f.length,
35
+ ...d.map((n) => n.length)
36
+ );
37
+ for (let n = 0; n < y; n++) {
38
+ const N = f[n];
39
+ if (d.every((x) => x[n] === N))
40
+ m++;
41
+ else
42
+ break;
43
+ }
44
+ const c = f.slice(m);
45
+ let g = !1;
46
+ for (let n = 1; n <= c.length; n++) {
47
+ const N = c.slice(0, n), p = P(
48
+ o.name || "item",
49
+ N
50
+ );
51
+ if (t.every((l) => {
52
+ if (l.id === o.id) return !0;
53
+ if (r.some((u) => u.id === l.id)) {
54
+ const u = l._parentPath || [], M = Math.min(
55
+ m,
56
+ u.length
57
+ ), q = u.slice(
58
+ M
59
+ ).slice(
60
+ 0,
61
+ n
62
+ ), _ = P(
63
+ l.name || "item",
64
+ q
65
+ );
66
+ return p !== _;
67
+ }
68
+ return p !== l.propName;
69
+ })) {
70
+ o.propName = p, g = !0;
71
+ break;
72
+ }
73
+ }
74
+ g || (o.propName = P(
75
+ o.name || "item",
76
+ c.length > 0 ? c : []
77
+ ));
78
+ }));
79
+ });
80
+ }
81
+ }
82
+ function S(a) {
83
+ const t = /* @__PURE__ */ new Map();
84
+ a.forEach((e) => {
85
+ t.has(e.propName) || t.set(e.propName, []), t.get(e.propName).push(e);
86
+ }), t.forEach((e, i) => {
87
+ e.length > 1 && e.every((s) => {
88
+ const r = s._parentPath || [];
89
+ return e.every((o) => {
90
+ if (o.id === s.id) return !0;
91
+ const f = o._parentPath || [];
92
+ return v(r, f);
93
+ });
94
+ }) && e.forEach((s, r) => {
95
+ r > 0 && (s.propName = `${i}${r + 1}`);
96
+ });
97
+ });
98
+ }
99
+ function E(a) {
100
+ delete a._parentPath;
101
+ }
102
+ function b(a, t) {
103
+ if (a.length === 1) {
104
+ E(a[0]);
105
+ return;
106
+ }
107
+ L(a), Q(a, t), S(a), a.forEach(E);
108
+ }
109
+ function F(a) {
110
+ return a.length === 0 || w(a).forEach((e) => {
111
+ b(e, a);
112
+ }), a;
113
+ }
114
+ export {
115
+ F as qualifyPropNames
116
+ };
117
+ //# sourceMappingURL=propQualification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"propQualification.js","sources":["../../src/codegen/propQualification.ts"],"sourcesContent":["/**\n * Reusable prop name qualification utilities\n *\n * When multiple components/inputs have the same base prop name,\n * this module provides utilities to make each name unique by using\n * minimal distinguishing parent paths.\n */\n\nimport { generateQualifiedPropName, findMinimalDistinguishingPath, arraysEqual } from './parser';\n\n/**\n * Base interface for items that can have their prop names qualified\n */\nexport interface QualifiableItem {\n id: string;\n name: string;\n propName: string;\n _parentPath?: string[];\n}\n\n/**\n * Groups items by their prop name\n */\nfunction groupByPropName<T extends QualifiableItem>(\n items: T[]\n): Map<string, T[]> {\n const groups = new Map<string, T[]>();\n\n items.forEach((item) => {\n const baseName = item.propName;\n if (!groups.has(baseName)) {\n groups.set(baseName, []);\n }\n groups.get(baseName)!.push(item);\n });\n\n return groups;\n}\n\n/**\n * Applies minimal distinguishing paths to a group of items with duplicate names\n */\nfunction applyMinimalPaths<T extends QualifiableItem>(group: T[]): void {\n group.forEach((item) => {\n const otherPaths = group\n .filter((other) => other.id !== item.id)\n .map((other) => other._parentPath || []);\n\n const minimalPath = findMinimalDistinguishingPath(\n item._parentPath || [],\n otherPaths\n );\n\n item.propName = generateQualifiedPropName(\n item.name || 'item',\n minimalPath\n );\n });\n}\n\n/**\n * Expands distinguishing paths iteratively until all names are unique\n */\nfunction expandPathsUntilUnique<T extends QualifiableItem>(\n group: T[],\n allItems: T[]\n): void {\n let hasDuplicates = true;\n let iteration = 0;\n const maxIterations = 10; // Safety limit\n\n while (hasDuplicates && iteration < maxIterations) {\n iteration++;\n\n // Group by current qualified names\n const qualifiedNameGroups = new Map<string, T[]>();\n group.forEach((item) => {\n if (!qualifiedNameGroups.has(item.propName)) {\n qualifiedNameGroups.set(item.propName, []);\n }\n qualifiedNameGroups.get(item.propName)!.push(item);\n });\n\n hasDuplicates = false;\n\n // For each group of duplicated qualified names, expand their paths\n qualifiedNameGroups.forEach((dupGroup) => {\n if (dupGroup.length > 1) {\n hasDuplicates = true;\n\n dupGroup.forEach((item) => {\n const fullPath = item._parentPath || [];\n const otherFullPaths = dupGroup\n .filter((other) => other.id !== item.id)\n .map((other) => other._parentPath || []);\n\n // Find common prefix length\n let commonPrefixLength = 0;\n const maxCommonLength = Math.min(\n fullPath.length,\n ...otherFullPaths.map((p) => p.length)\n );\n\n for (let i = 0; i < maxCommonLength; i++) {\n const thisPart = fullPath[i];\n const allMatch = otherFullPaths.every((otherPath) => otherPath[i] === thisPart);\n if (allMatch) {\n commonPrefixLength++;\n } else {\n break;\n }\n }\n\n // Use progressively more of the distinguishing suffix\n const distinguishingSuffix = fullPath.slice(commonPrefixLength);\n\n // Try expanding until unique\n let foundUnique = false;\n for (\n let suffixLength = 1;\n suffixLength <= distinguishingSuffix.length;\n suffixLength++\n ) {\n const expandedPath = distinguishingSuffix.slice(0, suffixLength);\n const testQualifiedName = generateQualifiedPropName(\n item.name || 'item',\n expandedPath\n );\n\n // Check if unique among ALL items\n const isUnique = allItems.every((otherItem) => {\n if (otherItem.id === item.id) return true;\n\n // If in same duplicate group, compare expanded paths\n if (dupGroup.some((d) => d.id === otherItem.id)) {\n const otherFullPath = otherItem._parentPath || [];\n const otherCommonPrefixLength = Math.min(\n commonPrefixLength,\n otherFullPath.length\n );\n const otherDistinguishingSuffix = otherFullPath.slice(\n otherCommonPrefixLength\n );\n const otherExpandedPath = otherDistinguishingSuffix.slice(\n 0,\n suffixLength\n );\n const otherQualifiedName = generateQualifiedPropName(\n otherItem.name || 'item',\n otherExpandedPath\n );\n return testQualifiedName !== otherQualifiedName;\n }\n\n // For items outside duplicate group, check final prop name\n return testQualifiedName !== otherItem.propName;\n });\n\n if (isUnique) {\n item.propName = testQualifiedName;\n foundUnique = true;\n break;\n }\n }\n\n // If still not unique, use the distinguishing suffix we found\n if (!foundUnique) {\n item.propName = generateQualifiedPropName(\n item.name || 'item',\n distinguishingSuffix.length > 0 ? distinguishingSuffix : []\n );\n }\n });\n }\n });\n }\n}\n\n/**\n * Applies numeric suffixes as a last resort for items with identical paths\n */\nfunction applyNumericSuffixes<T extends QualifiableItem>(group: T[]): void {\n // Group by final qualified names\n const finalQualifiedNameGroups = new Map<string, T[]>();\n group.forEach((item) => {\n if (!finalQualifiedNameGroups.has(item.propName)) {\n finalQualifiedNameGroups.set(item.propName, []);\n }\n finalQualifiedNameGroups.get(item.propName)!.push(item);\n });\n\n finalQualifiedNameGroups.forEach((finalDupGroup, finalQualifiedName) => {\n if (finalDupGroup.length > 1) {\n // Check if all duplicates have identical paths\n const allPathsIdentical = finalDupGroup.every((item) => {\n const thisPath = item._parentPath || [];\n return finalDupGroup.every((otherItem) => {\n if (otherItem.id === item.id) return true;\n const otherPath = otherItem._parentPath || [];\n return arraysEqual(thisPath, otherPath);\n });\n });\n\n // Only use numeric suffixes if paths are truly identical\n if (allPathsIdentical) {\n finalDupGroup.forEach((item, index) => {\n if (index > 0) {\n item.propName = `${finalQualifiedName}${index + 1}`;\n }\n });\n }\n }\n });\n}\n\n/**\n * Cleans up temporary _parentPath property from an item\n */\nfunction cleanupParentPath<T extends QualifiableItem>(item: T): void {\n delete item._parentPath;\n}\n\n/**\n * Qualifies a single group of items with duplicate prop names\n */\nfunction qualifyGroup<T extends QualifiableItem>(\n group: T[],\n allItems: T[]\n): void {\n if (group.length === 1) {\n cleanupParentPath(group[0]);\n return;\n }\n\n // Step 1: Apply minimal distinguishing paths\n applyMinimalPaths(group);\n\n // Step 2: Iteratively expand paths until all are unique\n expandPathsUntilUnique(group, allItems);\n\n // Step 3: Apply numeric suffixes as last resort\n applyNumericSuffixes(group);\n\n // Step 4: Cleanup temporary properties\n group.forEach(cleanupParentPath);\n}\n\n/**\n * Qualifies duplicate prop names using minimal distinguishing paths.\n *\n * When multiple components have the same prop name, this function\n * finds the shortest parent path segment that makes each name unique.\n *\n * Algorithm:\n * 1. Group items by base prop name\n * 2. For each group with duplicates:\n * a. Find minimal distinguishing paths\n * b. Iteratively expand paths if duplicates remain\n * c. Apply numeric suffixes if paths are identical\n *\n * @param items - Components/inputs to qualify (will be modified in place)\n * @returns The same items array with qualified propName values\n *\n * @example\n * const items = [\n * { id: '1', name: 'Title', propName: 'title', _parentPath: ['Header'] },\n * { id: '2', name: 'Title', propName: 'title', _parentPath: ['Footer'] }\n * ];\n * qualifyPropNames(items);\n * // Result: items[0].propName = 'headerTitle', items[1].propName = 'footerTitle'\n */\nexport function qualifyPropNames<T extends QualifiableItem>(\n items: T[]\n): T[] {\n if (items.length === 0) return items;\n\n const propNameGroups = groupByPropName(items);\n\n propNameGroups.forEach((group) => {\n qualifyGroup(group, items);\n });\n\n return items;\n}\n"],"names":["groupByPropName","items","groups","item","baseName","applyMinimalPaths","group","otherPaths","other","minimalPath","findMinimalDistinguishingPath","generateQualifiedPropName","expandPathsUntilUnique","allItems","hasDuplicates","iteration","maxIterations","qualifiedNameGroups","dupGroup","fullPath","otherFullPaths","commonPrefixLength","maxCommonLength","p","i","thisPart","otherPath","distinguishingSuffix","foundUnique","suffixLength","expandedPath","testQualifiedName","otherItem","d","otherFullPath","otherCommonPrefixLength","otherExpandedPath","otherQualifiedName","applyNumericSuffixes","finalQualifiedNameGroups","finalDupGroup","finalQualifiedName","thisPath","arraysEqual","index","cleanupParentPath","qualifyGroup","qualifyPropNames"],"mappings":";AAuBA,SAASA,EACPC,GACkB;AAClB,QAAMC,wBAAa,IAAA;AAEnB,SAAAD,EAAM,QAAQ,CAACE,MAAS;AACtB,UAAMC,IAAWD,EAAK;AACtB,IAAKD,EAAO,IAAIE,CAAQ,KACtBF,EAAO,IAAIE,GAAU,EAAE,GAEzBF,EAAO,IAAIE,CAAQ,EAAG,KAAKD,CAAI;AAAA,EACjC,CAAC,GAEMD;AACT;AAKA,SAASG,EAA6CC,GAAkB;AACtE,EAAAA,EAAM,QAAQ,CAACH,MAAS;AACtB,UAAMI,IAAaD,EAChB,OAAO,CAACE,MAAUA,EAAM,OAAOL,EAAK,EAAE,EACtC,IAAI,CAACK,MAAUA,EAAM,eAAe,EAAE,GAEnCC,IAAcC;AAAA,MAClBP,EAAK,eAAe,CAAA;AAAA,MACpBI;AAAA,IAAA;AAGF,IAAAJ,EAAK,WAAWQ;AAAA,MACdR,EAAK,QAAQ;AAAA,MACbM;AAAA,IAAA;AAAA,EAEJ,CAAC;AACH;AAKA,SAASG,EACPN,GACAO,GACM;AACN,MAAIC,IAAgB,IAChBC,IAAY;AAChB,QAAMC,IAAgB;AAEtB,SAAOF,KAAiBC,IAAYC,KAAe;AACjD,IAAAD;AAGA,UAAME,wBAA0B,IAAA;AAChC,IAAAX,EAAM,QAAQ,CAACH,MAAS;AACtB,MAAKc,EAAoB,IAAId,EAAK,QAAQ,KACxCc,EAAoB,IAAId,EAAK,UAAU,CAAA,CAAE,GAE3Cc,EAAoB,IAAId,EAAK,QAAQ,EAAG,KAAKA,CAAI;AAAA,IACnD,CAAC,GAEDW,IAAgB,IAGhBG,EAAoB,QAAQ,CAACC,MAAa;AACxC,MAAIA,EAAS,SAAS,MACpBJ,IAAgB,IAEhBI,EAAS,QAAQ,CAACf,MAAS;AACzB,cAAMgB,IAAWhB,EAAK,eAAe,CAAA,GAC/BiB,IAAiBF,EACpB,OAAO,CAACV,MAAUA,EAAM,OAAOL,EAAK,EAAE,EACtC,IAAI,CAACK,MAAUA,EAAM,eAAe,EAAE;AAGzC,YAAIa,IAAqB;AACzB,cAAMC,IAAkB,KAAK;AAAA,UAC3BH,EAAS;AAAA,UACT,GAAGC,EAAe,IAAI,CAACG,MAAMA,EAAE,MAAM;AAAA,QAAA;AAGvC,iBAASC,IAAI,GAAGA,IAAIF,GAAiBE,KAAK;AACxC,gBAAMC,IAAWN,EAASK,CAAC;AAE3B,cADiBJ,EAAe,MAAM,CAACM,MAAcA,EAAUF,CAAC,MAAMC,CAAQ;AAE5E,YAAAJ;AAAA;AAEA;AAAA,QAEJ;AAGA,cAAMM,IAAuBR,EAAS,MAAME,CAAkB;AAG9D,YAAIO,IAAc;AAClB,iBACMC,IAAe,GACnBA,KAAgBF,EAAqB,QACrCE,KACA;AACA,gBAAMC,IAAeH,EAAqB,MAAM,GAAGE,CAAY,GACzDE,IAAoBpB;AAAA,YACxBR,EAAK,QAAQ;AAAA,YACb2B;AAAA,UAAA;AAgCF,cA5BiBjB,EAAS,MAAM,CAACmB,MAAc;AAC7C,gBAAIA,EAAU,OAAO7B,EAAK,GAAI,QAAO;AAGrC,gBAAIe,EAAS,KAAK,CAACe,MAAMA,EAAE,OAAOD,EAAU,EAAE,GAAG;AAC/C,oBAAME,IAAgBF,EAAU,eAAe,CAAA,GACzCG,IAA0B,KAAK;AAAA,gBACnCd;AAAA,gBACAa,EAAc;AAAA,cAAA,GAKVE,IAH4BF,EAAc;AAAA,gBAC9CC;AAAA,cAAA,EAEkD;AAAA,gBAClD;AAAA,gBACAN;AAAA,cAAA,GAEIQ,IAAqB1B;AAAA,gBACzBqB,EAAU,QAAQ;AAAA,gBAClBI;AAAA,cAAA;AAEF,qBAAOL,MAAsBM;AAAA,YAC/B;AAGA,mBAAON,MAAsBC,EAAU;AAAA,UACzC,CAAC,GAEa;AACZ,YAAA7B,EAAK,WAAW4B,GAChBH,IAAc;AACd;AAAA,UACF;AAAA,QACF;AAGA,QAAKA,MACHzB,EAAK,WAAWQ;AAAA,UACdR,EAAK,QAAQ;AAAA,UACbwB,EAAqB,SAAS,IAAIA,IAAuB,CAAA;AAAA,QAAC;AAAA,MAGhE,CAAC;AAAA,IAEL,CAAC;AAAA,EACH;AACF;AAKA,SAASW,EAAgDhC,GAAkB;AAEzE,QAAMiC,wBAA+B,IAAA;AACrC,EAAAjC,EAAM,QAAQ,CAACH,MAAS;AACtB,IAAKoC,EAAyB,IAAIpC,EAAK,QAAQ,KAC7CoC,EAAyB,IAAIpC,EAAK,UAAU,CAAA,CAAE,GAEhDoC,EAAyB,IAAIpC,EAAK,QAAQ,EAAG,KAAKA,CAAI;AAAA,EACxD,CAAC,GAEDoC,EAAyB,QAAQ,CAACC,GAAeC,MAAuB;AACtE,IAAID,EAAc,SAAS,KAECA,EAAc,MAAM,CAACrC,MAAS;AACtD,YAAMuC,IAAWvC,EAAK,eAAe,CAAA;AACrC,aAAOqC,EAAc,MAAM,CAACR,MAAc;AACxC,YAAIA,EAAU,OAAO7B,EAAK,GAAI,QAAO;AACrC,cAAMuB,IAAYM,EAAU,eAAe,CAAA;AAC3C,eAAOW,EAAYD,GAAUhB,CAAS;AAAA,MACxC,CAAC;AAAA,IACH,CAAC,KAICc,EAAc,QAAQ,CAACrC,GAAMyC,MAAU;AACrC,MAAIA,IAAQ,MACVzC,EAAK,WAAW,GAAGsC,CAAkB,GAAGG,IAAQ,CAAC;AAAA,IAErD,CAAC;AAAA,EAGP,CAAC;AACH;AAKA,SAASC,EAA6C1C,GAAe;AACnE,SAAOA,EAAK;AACd;AAKA,SAAS2C,EACPxC,GACAO,GACM;AACN,MAAIP,EAAM,WAAW,GAAG;AACtB,IAAAuC,EAAkBvC,EAAM,CAAC,CAAC;AAC1B;AAAA,EACF;AAGA,EAAAD,EAAkBC,CAAK,GAGvBM,EAAuBN,GAAOO,CAAQ,GAGtCyB,EAAqBhC,CAAK,GAG1BA,EAAM,QAAQuC,CAAiB;AACjC;AA0BO,SAASE,EACd9C,GACK;AACL,SAAIA,EAAM,WAAW,KAEED,EAAgBC,CAAK,EAE7B,QAAQ,CAACK,MAAU;AAChC,IAAAwC,EAAaxC,GAAOL,CAAK;AAAA,EAC3B,CAAC,GAEMA;AACT;"}
@@ -1 +1 @@
1
- {"version":3,"file":"DynamicComponent.js","sources":["../../src/components/DynamicComponent.tsx"],"sourcesContent":["\"use client\";\nimport React, { useMemo, Suspense } from \"react\";\n\ntype Props = {\n name: string;\n children: unknown;\n componentId?: string;\n fallback?: React.ReactNode;\n reloadKey?: string | number;\n componentCode?: string;\n};\n\nconst DynamicComponent: React.FC<Props> = ({\n name,\n children,\n fallback,\n reloadKey,\n componentCode,\n ...props\n}) => {\n const Component = useMemo(() => {\n return React.lazy(async () => {\n if (componentCode) {\n // Use provided code instead of fetching\n const { loadAMDModule } = await import(\"../lib/dynamicModules\");\n return await loadAMDModule(name, componentCode);\n }\n const { fetchDep } = await import(\"../lib/dynamicModules\");\n const r = (await fetchDep(name)) as any;\n return r;\n });\n }, [name, reloadKey, componentCode]); // Include componentCode and reloadKey to force reload when they change\n const thisFallback = fallback || <div>Loading...</div>;\n return (\n <Suspense fallback={thisFallback}>\n <Component {...props}>{children}</Component>\n </Suspense>\n );\n};\n\nexport default React.memo(DynamicComponent);\n"],"names":["DynamicComponent","name","children","fallback","reloadKey","componentCode","props","Component","useMemo","React","loadAMDModule","fetchDep","jsx","Suspense","DynamicComponent$1"],"mappings":";;AAYA,MAAMA,IAAoC,CAAC;AAAA,EACzC,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,eAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAYC,EAAQ,MACjBC,EAAM,KAAK,YAAY;AAC5B,QAAIJ,GAAe;AAEjB,YAAM,EAAE,eAAAK,EAAA,IAAkB,MAAM,OAAO,0BAAuB;AAC9D,aAAO,MAAMA,EAAcT,GAAMI,CAAa;AAAA,IAChD;AACA,UAAM,EAAE,UAAAM,EAAA,IAAa,MAAM,OAAO,0BAAuB;AAEzD,WADW,MAAMA,EAASV,CAAI;AAAA,EAEhC,CAAC,GACA,CAACA,GAAMG,GAAWC,CAAa,CAAC;AAEnC,SACE,gBAAAO,EAACC,KAAS,UAFSV,KAAY,gBAAAS,EAAC,OAAA,EAAI,UAAA,cAAU,GAG5C,4BAACL,GAAA,EAAW,GAAGD,GAAQ,UAAAJ,EAAA,CAAS,EAAA,CAClC;AAEJ,GAEAY,IAAeL,EAAM,KAAKT,CAAgB;"}
1
+ {"version":3,"file":"DynamicComponent.js","sources":["../../src/components/DynamicComponent.tsx"],"sourcesContent":["\"use client\";\nimport React, { useMemo, Suspense } from \"react\";\n\ntype Props = {\n name: string;\n children?: React.ReactNode;\n componentId?: string;\n fallback?: React.ReactNode;\n reloadKey?: string | number;\n componentCode?: string;\n};\n\nconst DynamicComponent: React.FC<Props> = ({\n name,\n children,\n fallback,\n reloadKey,\n componentCode,\n ...props\n}) => {\n const Component = useMemo(() => {\n return React.lazy(async () => {\n if (componentCode) {\n // Use provided code instead of fetching\n const { loadAMDModule } = await import(\"../lib/dynamicModules\");\n return await loadAMDModule(name, componentCode);\n }\n const { fetchDep } = await import(\"../lib/dynamicModules\");\n const r = (await fetchDep(name)) as any;\n return r;\n });\n }, [name, reloadKey, componentCode]); // Include componentCode and reloadKey to force reload when they change\n const thisFallback = fallback || <div>Loading...</div>;\n return (\n <Suspense fallback={thisFallback}>\n <Component {...props}>{children}</Component>\n </Suspense>\n );\n};\n\nexport default React.memo(DynamicComponent);\n"],"names":["DynamicComponent","name","children","fallback","reloadKey","componentCode","props","Component","useMemo","React","loadAMDModule","fetchDep","jsx","Suspense","DynamicComponent$1"],"mappings":";;AAYA,MAAMA,IAAoC,CAAC;AAAA,EACzC,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,eAAAC;AAAA,EACA,GAAGC;AACL,MAAM;AACJ,QAAMC,IAAYC,EAAQ,MACjBC,EAAM,KAAK,YAAY;AAC5B,QAAIJ,GAAe;AAEjB,YAAM,EAAE,eAAAK,EAAA,IAAkB,MAAM,OAAO,0BAAuB;AAC9D,aAAO,MAAMA,EAAcT,GAAMI,CAAa;AAAA,IAChD;AACA,UAAM,EAAE,UAAAM,EAAA,IAAa,MAAM,OAAO,0BAAuB;AAEzD,WADW,MAAMA,EAASV,CAAI;AAAA,EAEhC,CAAC,GACA,CAACA,GAAMG,GAAWC,CAAa,CAAC;AAEnC,SACE,gBAAAO,EAACC,KAAS,UAFSV,KAAY,gBAAAS,EAAC,OAAA,EAAI,UAAA,cAAU,GAG5C,4BAACL,GAAA,EAAW,GAAGD,GAAQ,UAAAJ,EAAA,CAAS,EAAA,CAClC;AAEJ,GAEAY,IAAeL,EAAM,KAAKT,CAAgB;"}