Files
leptos-shadcn-ui/docs/remediation/WASM_REMEDIATION_SUMMARY.md
Peter Hanssens 2b99fcc315 feat: Add WASM-optimized ShadCN UI package
🚀 New Features:
- Add leptos-shadcn-ui-wasm package with minimal dependencies
- 10 core components optimized for WebAssembly
- Feature flags for granular bundle control
- WASM-specific utilities and helpers

🔧 Technical Improvements:
- Fix WASM compatibility issues in test-utils package
- Add conditional compilation for native vs WASM targets
- Update contract-testing package for WASM compatibility
- Add comprehensive WASM demo application

📦 Bundle Optimization:
- 70% reduction in dependencies (150+ → 25)
- WASM-compatible only dependencies
- Gzipped bundle size: ~813KB for full demo

📚 Documentation:
- Complete README with examples and migration guide
- Bundle size comparisons and performance metrics
- Comprehensive remediation plan and design docs

 Testing:
- All packages compile for wasm32-unknown-unknown
- Feature flags work correctly
- Demo builds and runs successfully
- Backward compatibility maintained
2025-09-21 19:12:37 +10:00

9.5 KiB

WASM Compatibility Remediation Summary

Complete Solution for leptos-shadcn-ui WASM Support

Document Version: 1.0
Date: 2025-01-27
Status: IMPLEMENTATION READY


🎯 Executive Summary

This document provides a comprehensive solution to the WASM compatibility issues in leptos-shadcn-ui, specifically addressing the mio, uuid, and rustc-serialize dependency conflicts. We present three strategic approaches with detailed implementation plans.

📊 Current Status Analysis

What's Working

  • Core Components: Button, Input, Card, Label are WASM-compatible
  • Working Demos: standalone-demo/ and examples/leptos/ compile for WASM
  • Proper Dependencies: WASM demos use correct UUID and getrandom features

What's Broken

  • test-utils Package: Missing "js" feature in UUID dependency
  • Non-WASM Dependencies: proptest and tempfile incompatible with WASM
  • Mixed Architecture: No conditional compilation for different targets

🚀 Three Strategic Solutions

Priority: HIGH | Effort: MEDIUM | Risk: LOW

Approach: Fix the packages/test-utils/Cargo.toml and add conditional compilation

Key Changes:

# Fix UUID dependency
uuid = { version = "1.0", features = ["v4", "js"] }

# Add conditional dependencies
[target.'cfg(target_arch = "wasm32")'.dependencies]
wasm-bindgen-futures = "0.4"

[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
proptest = "1.4"
tempfile = "3.0"

Benefits:

  • Single codebase for both platforms
  • Minimal breaking changes
  • Maintains existing functionality
  • Quick implementation

Implementation Time: 1-2 weeks

Solution 2: WASM-Only Minimal Package

Priority: MEDIUM | Effort: HIGH | Risk: MEDIUM

Approach: Create dedicated leptos-shadcn-ui-wasm package

Key Features:

  • Minimal WASM-only dependencies
  • Optimized bundle size (< 50KB for essential components)
  • WASM-specific utilities and optimizations
  • No conditional compilation complexity

Benefits:

  • Smallest possible bundle size
  • WASM-optimized from ground up
  • No native compatibility concerns
  • Faster build times

Implementation Time: 3-4 weeks

Solution 3: Full Conditional Compilation

Priority: HIGH | Effort: HIGH | Risk: LOW

Approach: Implement comprehensive conditional compilation across all packages

Key Features:

  • Target-specific feature flags
  • Platform-optimized implementations
  • Unified API with conditional backends
  • Comprehensive cross-platform testing

Benefits:

  • Optimal performance on both platforms
  • Single codebase maintenance
  • Platform-specific optimizations
  • Comprehensive testing coverage

Implementation Time: 4-6 weeks

Phase 1: Immediate Fix (Week 1)

Solution 1 - Fix Existing Package

  1. Fix test-utils dependencies:

    # Update packages/test-utils/Cargo.toml
    uuid = { version = "1.0", features = ["v4", "js"] }
    
  2. Add conditional compilation:

    [target.'cfg(target_arch = "wasm32")'.dependencies]
    wasm-bindgen-futures = "0.4"
    
    [target.'cfg(not(target_arch = "wasm32"))'.dependencies]
    proptest = "1.4"
    tempfile = "3.0"
    
  3. Test WASM compilation:

    cargo check --target wasm32-unknown-unknown
    

Phase 2: Enhanced Support (Week 2-3)

Solution 3 - Conditional Compilation

  1. Implement conditional testing modules
  2. Add platform-specific utilities
  3. Create cross-platform test suite
  4. Update CI/CD for dual-platform testing

Phase 3: Optional Optimization (Week 4+)

Solution 2 - WASM-Only Package

  1. Create minimal WASM package
  2. Implement bundle size optimization
  3. Add WASM-specific performance monitoring
  4. Create WASM-focused documentation

🛠️ Implementation Details

Quick Fix Implementation

# packages/test-utils/Cargo.toml - IMMEDIATE FIX
[package]
name = "shadcn-ui-test-utils"
version = "0.2.0"

[dependencies]
# Core dependencies
wasm-bindgen-test = "0.3"
web-sys = { workspace = true, features = ["console", "Document", "Element", "HtmlElement", "Window", "Performance", "PerformanceTiming"] }
js-sys = "0.3"
console_error_panic_hook = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }

# ✅ FIXED: Add "js" feature for WASM compatibility
uuid = { version = "1.0", features = ["v4", "js"] }

# Framework-specific testing
leptos = { workspace = true }

# ✅ ADDED: WASM-compatible random generation
getrandom = { version = "0.2", features = ["js"] }

[features]
default = []
wasm-testing = []
native-testing = []

# Conditional dependencies
[target.'cfg(target_arch = "wasm32")'.dependencies]
wasm-bindgen-futures = "0.4"

[target.'cfg(not(target_arch = "wasm32"))'.dependencies]
proptest = "1.4"
tempfile = "3.0"

Code Changes Required

// packages/test-utils/src/dom_testing.rs - Conditional Implementation
use leptos::prelude::*;
use wasm_bindgen_test::*;

// Conditional imports
#[cfg(target_arch = "wasm32")]
use wasm_bindgen_futures::JsFuture;

#[cfg(not(target_arch = "wasm32"))]
use std::fs::File;
use std::io::Write;

impl ComponentTestHarness {
    pub fn new() -> Self {
        // ✅ FIXED: WASM-compatible UUID generation
        let mount_id = format!("test-mount-{}", uuid::Uuid::new_v4().to_string());
        Self { mount_point: mount_id }
    }
    
    // Conditional testing methods
    #[cfg(target_arch = "wasm32")]
    pub fn run_wasm_test<F>(&self, test_fn: F) 
    where
        F: FnOnce() + 'static,
    {
        wasm_bindgen_test_configure!(run_in_browser);
        test_fn();
    }
    
    #[cfg(not(target_arch = "wasm32"))]
    pub fn run_native_test<F>(&self, test_fn: F) 
    where
        F: FnOnce() + 'static,
    {
        // Native testing implementation
        test_fn();
    }
}

🧪 Testing Strategy

WASM Testing Setup

# Install WASM target
rustup target add wasm32-unknown-unknown

# Install wasm-pack
curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh

# Test WASM compilation
cargo check --target wasm32-unknown-unknown

# Run WASM tests
wasm-pack test --headless --firefox

CI/CD Integration

# .github/workflows/wasm-tests.yml
name: WASM Compatibility Tests

on: [push, pull_request]

jobs:
  wasm-tests:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Setup Rust with WASM target
        uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          target: wasm32-unknown-unknown
          
      - name: Test WASM compilation
        run: cargo check --target wasm32-unknown-unknown
        
      - name: Test WASM demos
        run: |
          cd standalone-demo
          wasm-pack build --target web

📊 Success Metrics

Technical Metrics

  • 100% WASM compilation success rate
  • < 2MB total WASM bundle size
  • < 100ms component initialization time
  • 0 WASM-specific runtime errors

Quality Metrics

  • All core components work in WASM
  • WASM tests pass in all supported browsers
  • Performance within 10% of native benchmarks
  • Documentation coverage > 90%

🚨 Risk Assessment

High Risk

  • Breaking Changes: Conditional compilation may require code changes
  • Testing Coverage: WASM testing infrastructure needs validation

Medium Risk

  • Performance: WASM bundle size optimization required
  • Browser Compatibility: Need to test across all target browsers

Low Risk

  • Dependency Conflicts: Well-understood and documented
  • Backward Compatibility: Native functionality preserved

📚 Documentation References

🎯 Next Steps

Immediate Actions (This Week)

  1. Fix test-utils UUID dependency - Add "js" feature
  2. Test WASM compilation - Verify fix works
  3. Update workspace dependencies - Ensure consistency
  4. Create WASM test suite - Basic functionality testing

Short Term (Next 2 Weeks)

  1. Implement conditional compilation - Full platform support
  2. Add WASM-specific utilities - Performance monitoring
  3. Update CI/CD - Automated WASM testing
  4. Create migration guide - User documentation

Long Term (Next Month)

  1. Create WASM-only package - Optional optimization
  2. Performance optimization - Bundle size reduction
  3. Comprehensive testing - Cross-browser validation
  4. Documentation completion - Full user guides

💡 Recommendations

For Immediate Implementation

Start with Solution 1 (Fix Existing Package) - This provides the quickest path to WASM compatibility with minimal risk and effort.

For Long-term Strategy

Implement Solution 3 (Conditional Compilation) - This provides the most comprehensive solution with optimal performance on both platforms.

For Specialized Use Cases

Consider Solution 2 (WASM-Only Package) - This is ideal for projects that only need WASM support and want the smallest possible bundle size.


Status: READY FOR IMPLEMENTATION
Priority: 🔥 HIGH
Estimated Completion: 2-4 weeks depending on chosen approach