#!/usr/bin/env python3 """ Script to fix compilation issues in the remaining 41 components. This addresses common issues like duplicate module declarations and unsupported props. """ import os import re import subprocess from pathlib import Path # Components that need fixing (excluding the 5 that already work) FAILING_COMPONENTS = [ "accordion", "alert", "alert-dialog", "aspect-ratio", "calendar", "carousel", "checkbox", "collapsible", "combobox", "command", "context-menu", "date-picker", "drawer", "dropdown-menu", "error-boundary", "form", "hover-card", "input-otp", "label", "lazy-loading", "menubar", "navigation-menu", "pagination", "popover", "progress", "radio-group", "resizable", "scroll-area", "select", "sheet", "skeleton", "slider", "switch", "table", "tabs", "textarea", "toast", "toggle", "tooltip" ] def fix_lib_rs_duplicates(component_name): """Fix duplicate mod real_tests declarations in lib.rs""" lib_path = f"packages/leptos/{component_name}/src/lib.rs" if not os.path.exists(lib_path): return False try: with open(lib_path, 'r') as f: content = f.read() # Check for duplicate mod real_tests declarations real_tests_count = content.count('mod real_tests;') if real_tests_count > 1: print(f" Fixing duplicate mod real_tests declarations in {component_name}") # Remove all mod real_tests declarations content = re.sub(r'#\[cfg\(test\)\]\s*\n\s*mod real_tests;', '', content) # Add a single mod real_tests declaration at the end of test modules if '#[cfg(test)]' in content: # Find the last test module and add real_tests after it lines = content.split('\n') insert_index = len(lines) for i, line in enumerate(lines): if line.strip().startswith('#[cfg(test)]'): # Find the next non-empty line that's not a comment for j in range(i + 1, len(lines)): if lines[j].strip() and not lines[j].strip().startswith('//'): insert_index = j break # Insert the real_tests module lines.insert(insert_index, 'mod real_tests;') content = '\n'.join(lines) else: # Add at the end of the file content += '\n\n#[cfg(test)]\nmod real_tests;' with open(lib_path, 'w') as f: f.write(content) return True except Exception as e: print(f" Error fixing lib.rs for {component_name}: {e}") return False def fix_test_file_props(component_name): """Fix unsupported props in test files""" test_path = f"packages/leptos/{component_name}/src/real_tests.rs" if not os.path.exists(test_path): return False try: with open(test_path, 'r') as f: content = f.read() # Remove unsupported props that commonly cause issues # Remove id prop (many components don't support it) content = re.sub(r'id="[^"]*"\s*', '', content) content = re.sub(r'id=\w+\s*', '', content) # Clean up any double spaces content = re.sub(r'\s+', ' ', content) with open(test_path, 'w') as f: f.write(content) return True except Exception as e: print(f" Error fixing test file for {component_name}: {e}") return False def fix_imports(component_name): """Fix import issues in test files""" test_path = f"packages/leptos/{component_name}/src/real_tests.rs" if not os.path.exists(test_path): return False try: with open(test_path, 'r') as f: content = f.read() # Simplify imports to just the main component # Find the use statement and replace it with a simpler version use_pattern = r'use crate::default::\{[^}]+\};' match = re.search(use_pattern, content) if match: # Get the main component name (first one in the list) use_statement = match.group(0) components = re.findall(r'(\w+)(?:,|\})', use_statement) if components: main_component = components[0] new_use = f'use crate::default::{{{main_component}}};' content = content.replace(use_statement, new_use) with open(test_path, 'w') as f: f.write(content) return True except Exception as e: print(f" Error fixing imports for {component_name}: {e}") return False def test_compilation(component_name): """Test if the component compiles successfully""" try: result = subprocess.run( ['cargo', 'test', '-p', f'leptos-shadcn-{component_name}', '--lib', 'real_tests', '--no-run'], capture_output=True, text=True, cwd='.' ) return result.returncode == 0 except Exception as e: print(f" Error testing compilation for {component_name}: {e}") return False def main(): """Main function to fix all failing components""" print("šŸ”§ Fixing compilation issues in remaining components...") print(f"šŸ“¦ Processing {len(FAILING_COMPONENTS)} components") success_count = 0 total_count = len(FAILING_COMPONENTS) for component_name in FAILING_COMPONENTS: print(f"\nšŸ”Ø Fixing {component_name}...") # Skip accordion as we already fixed it if component_name == "accordion": print(f" āœ… {component_name} already fixed") success_count += 1 continue # Apply fixes lib_fixed = fix_lib_rs_duplicates(component_name) props_fixed = fix_test_file_props(component_name) imports_fixed = fix_imports(component_name) if lib_fixed or props_fixed or imports_fixed: print(f" šŸ”§ Applied fixes to {component_name}") # Test compilation if test_compilation(component_name): print(f" āœ… {component_name} compiles successfully") success_count += 1 else: print(f" āŒ {component_name} still has compilation issues") print(f"\nšŸŽ‰ Summary:") print(f"āœ… Successfully fixed: {success_count}/{total_count} components") print(f"šŸ“Š Success rate: {(success_count/total_count)*100:.1f}%") if success_count == total_count: print("šŸŽŠ All components fixed successfully!") return 0 else: print("āš ļø Some components still need manual attention") return 1 if __name__ == "__main__": exit(main())