Files
low-code-react-app-b/PACKAGES_REMOVAL_COMPLETE_GUIDE.md

7.6 KiB

🎯 Packages Folder Removal - Complete Guide

Status: READY TO REMOVE

All dependencies on the packages folder have been eliminated. The folder can now be safely deleted.

📋 What Changed

Architecture Simplification

  • Before: Monorepo with packages/spark and packages/spark-tools
  • After: Single application with all code in src/

Storage System

  • Default: IndexedDB (browser-native, no backend required)
  • Optional: Flask API backend with automatic IndexedDB fallback
  • Configuration: Environment variable or UI settings

🔧 Migration Summary

Files Migrated

packages/spark/src/*          → src/lib/spark/*
packages/spark-tools/src/*    → (removed, no longer needed)

Key Components

  • src/lib/storage-service.ts - Unified storage with IndexedDB & Flask API
  • src/lib/spark/index.ts - Spark exports
  • src/lib/spark-runtime.ts - Runtime functionality
  • src/hooks/use-kv.ts - Persistent state hook
  • src/components/StorageSettings.tsx - UI for storage configuration

Configuration Files Updated

  • Dockerfile - No packages references
  • .dockerignore - Excludes packages folder
  • package.json - No workspace: protocol
  • README.md - Storage documentation updated

🚀 Usage Guide

For Users

Default (IndexedDB)

# Just start the app - IndexedDB works automatically
npm run dev

With Flask API (Optional)

# Set environment variable
VITE_FLASK_API_URL=http://localhost:5001 npm run dev

# Or configure in Settings UI:
# 1. Open Settings
# 2. Go to Storage Settings
# 3. Enable "Use Flask API Backend"
# 4. Enter Flask API URL
# 5. Click "Test" to verify connection

For Developers

React Hook Usage

import { useKV } from '@/hooks/use-kv'

function MyComponent() {
  // Use just like useState, but with persistence
  const [data, setData, deleteData] = useKV('my-key', defaultValue)
  
  // ⚠️ CRITICAL: Always use functional updates
  setData(current => ({ ...current, newField: 'value' }))
  
  // ❌ WRONG: Don't reference closure value
  // setData({ ...data, newField: 'value' })
}

Direct Storage API

import { getStorage } from '@/lib/storage-service'

const storage = getStorage()

// Get value
const value = await storage.get('key')

// Set value
await storage.set('key', { some: 'data' })

// Delete value
await storage.delete('key')

// List all keys
const keys = await storage.keys()

// Clear all data
await storage.clear()

Configure Backend

import { setFlaskAPI, disableFlaskAPI } from '@/lib/storage-service'

// Enable Flask API
setFlaskAPI('http://localhost:5001')

// Disable Flask API (back to IndexedDB)
disableFlaskAPI()

For DevOps

Docker Build

# Build image (uses IndexedDB by default)
docker build -t codeforge .

# Run with IndexedDB
docker run -p 80:80 codeforge

# Run with Flask API
docker run -p 80:80 \
  -e VITE_FLASK_API_URL=http://backend:5001 \
  codeforge

Docker Compose

version: '3.8'
services:
  frontend:
    build: .
    ports:
      - "80:80"
    environment:
      # Optional: Enable Flask backend
      - VITE_FLASK_API_URL=http://backend:5001
  
  backend:
    build: ./backend
    ports:
      - "5001:5001"

Environment Variables

# Required
PORT=80                    # Server port

# Optional
VITE_FLASK_API_URL=""     # Flask API URL (empty = IndexedDB only)

🧪 Testing & Verification

Automated Verification

# Run verification script
chmod +x scripts/verify-packages-removal.sh
./scripts/verify-packages-removal.sh

Manual Testing

Test IndexedDB (Default)

npm run dev
# Open http://localhost:5000
# Create some data in the app
# Refresh the page
# ✅ Data should persist

Test Flask API (Optional)

# Start Flask backend
cd backend
python app.py

# Start frontend with Flask API
VITE_FLASK_API_URL=http://localhost:5001 npm run dev
# ✅ Data should be stored in Flask backend

Test Automatic Fallback

# Start app with non-existent Flask URL
VITE_FLASK_API_URL=http://localhost:9999 npm run dev
# ✅ Should show warning and use IndexedDB
# ✅ App should work normally

Test Docker Build

# Build
docker build -t codeforge .

# Run
docker run -p 8080:80 codeforge

# Test
curl http://localhost:8080
# ✅ Should return HTML

🔍 Verification Checklist

Before removing packages folder:

  • Run ./scripts/verify-packages-removal.sh
  • Check no imports from @github/spark or @local/spark
  • Verify npm run build succeeds
  • Verify docker build succeeds
  • Test IndexedDB storage in browser
  • Test Flask API connection (if using backend)
  • Test automatic fallback
  • Verify all tests pass: npm test

🗑️ Removing the Packages Folder

Once all checks pass:

# 1. Verify everything
./scripts/verify-packages-removal.sh

# 2. Remove the packages folder
rm -rf packages

# 3. Test build
npm run build

# 4. Test Docker
docker build -t codeforge .

# 5. Commit changes
git add .
git commit -m "Remove packages folder - all functionality migrated to src/lib"
git push

📊 Benefits of Removal

For Development

  • Faster builds (no package compilation)
  • Simpler debugging (all code in one place)
  • Better IDE support (no package resolution)
  • Clearer imports (@/lib/... instead of @github/spark)

For CI/CD

  • Faster CI/CD (simpler dependency tree)
  • Smaller Docker images (no package overhead)
  • No workspace: protocol issues
  • Standard npm install (no special flags)

For Users

  • Works offline (IndexedDB default)
  • Zero configuration needed
  • Optional backend (Flask API)
  • Automatic recovery (fallback on failure)

For Deployment

  • Can run without backend
  • Lower hosting costs
  • Simpler architecture
  • Better reliability (local storage fallback)

🔧 Troubleshooting

Issue: Build fails with "Cannot find module '@github/spark'"

Solution: Run verification script to find remaining old imports

./scripts/verify-packages-removal.sh

Issue: Storage not persisting

Solution: Check browser console for IndexedDB errors

// Open browser console and run:
indexedDB.databases()
// Should show 'codeforge-storage' database

Issue: Flask API not working

Solution: Check network tab and backend logs

# Check if Flask backend is running
curl http://localhost:5001/api/health

# Check browser console for CORS errors
# Enable CORS in Flask backend if needed

Issue: Docker build fails

Solution: Clear Docker cache and rebuild

docker system prune -a
docker build --no-cache -t codeforge .

📚 Additional Documentation

🎉 Next Steps

After removing packages folder:

  1. Clean up documentation - Remove any outdated package references
  2. Update CI/CD - Simplify build pipelines
  3. Test thoroughly - Run full test suite
  4. Deploy - Push to production with confidence

Conclusion

The packages folder has been successfully migrated to the main application structure. All functionality is preserved, with improved:

  • Architecture simplicity
  • Build performance
  • Developer experience
  • Deployment reliability

The packages folder can now be safely deleted! 🎉