# Build Pattern Conversion Plan **Author**: Matthew Raymer **Date**: 2025-07-09 **Status**: **PLANNING** - Ready for Implementation ## Overview Convert TimeSafari's build instruction pattern from the current script-based approach to a new Vite `mode`-based pattern that provides better environment management and consistency across all build targets. ## Why Vite Mode Instead of NODE_ENV? ### Vite's Native Mode System Vite is designed to work with `mode`, which: - Determines the `.env` file to load (e.g. `.env.production`, `.env.test`, etc.) - Is passed to `defineConfig(({ mode }) => {...})` in `vite.config.ts` - Is used to set behavior for dev/prod/test at config level - Provides better integration with Vite's build system ### NODE_ENV Limitations `NODE_ENV` is legacy from Webpack-era tooling: - You can't change `NODE_ENV` manually and expect Vite to adapt - Vite does not map `NODE_ENV` back to `mode` - It's redundant with `mode` and might conflict with assumptions - Limited integration with Vite's environment loading system ### Usage Pattern ```bash # Correct: Use Vite's mode system vite build --mode production vite build --mode development vite build --mode test # Only if third-party libraries require NODE_ENV NODE_ENV=production vite build --mode production ``` ### Development vs Build Environments **Development Environment:** - **Build with defaults**: `npm run build:*` - Uses `--mode development` by default - **Purpose**: Development builds for testing and debugging - **Output**: Bundled files with development optimizations **Testing/Production Environments:** - **Build with explicit mode**: `npm run build:* -- --mode test/production` - **Purpose**: Validate and deploy the bundled application - **Output**: Optimized, bundled files for specific environment ### Mode Override Behavior **How `--mode` Override Works:** ```bash # Base script (no hardcoded mode) "build:electron": "vite build --config vite.config.electron.mts" # Development (uses Vite's default: --mode development) npm run build:electron # Executes: vite build --config vite.config.electron.mts # Testing (explicitly overrides with --mode test) npm run build:electron -- --mode test # Executes: vite build --config vite.config.electron.mts --mode test # Production (explicitly overrides with --mode production) npm run build:electron -- --mode production # Executes: vite build --config vite.config.electron.mts --mode production ``` **Key Points:** - Base scripts have **no hardcoded `--mode`** to allow override - `npm run build:electron` defaults to `--mode development` - `npm run build:electron -- --mode test` overrides to `--mode test` - Vite uses the **last `--mode` argument** if multiple are provided ### Capacitor Platform-Specific Commands Capacitor requires platform-specific sync commands after building: ```bash # General sync (copies web assets to all platforms) npm run build:capacitor && npx cap sync # Platform-specific sync npm run build:capacitor && npx cap sync android npm run build:capacitor && npx cap sync ios # Environment-specific with platform sync npm run build:capacitor -- --mode production && npx cap sync android npm run build:capacitor -- --mode development && npx cap sync ios ``` ### Docker Build Commands Docker builds include both Vite asset generation and Docker image creation: ```bash # General Docker build (Vite build + Docker image) npm run build:web:docker # Environment-specific Docker builds npm run build:web:docker:test # Test environment + Docker image npm run build:web:docker:prod # Production environment + Docker image # Manual mode overrides for Docker builds npm run build:web:docker -- --mode test npm run build:web:docker -- --mode production ``` **Docker Build Process:** 1. **Vite Build**: Creates optimized web assets with environment-specific variables 2. **Docker Build**: Creates Docker image using `Dockerfile` in project root 3. **Image Tagging**: Images are tagged as `timesafari-web` for consistent management **Key Features:** - Complete end-to-end Docker workflow in single command - Environment-aware builds (test/production configurations) - Consistent image tagging for deployment - Mode override flexibility for custom environments ### Electron Platform-Specific Commands Electron requires platform-specific build commands after the Vite build: ```bash # General Electron build (Vite build only) npm run build:electron # Platform-specific builds npm run build:electron:windows # Windows executable npm run build:electron:mac # macOS app bundle npm run build:electron:linux # Linux executable # Package-specific builds npm run build:electron:appimage # Linux AppImage npm run build:electron:dmg # macOS DMG installer # Environment-specific builds npm run build:electron -- --mode development npm run build:electron -- --mode test npm run build:electron -- --mode production # Environment-specific with platform builds npm run build:electron:windows -- --mode development npm run build:electron:windows -- --mode test npm run build:electron:windows -- --mode production npm run build:electron:mac -- --mode development npm run build:electron:mac -- --mode test npm run build:electron:mac -- --mode production npm run build:electron:linux -- --mode development npm run build:electron:linux -- --mode test npm run build:electron:linux -- --mode production # Environment-specific with package builds npm run build:electron:appimage -- --mode development npm run build:electron:appimage -- --mode test npm run build:electron:appimage -- --mode production npm run build:electron:dmg -- --mode development npm run build:electron:dmg -- --mode test npm run build:electron:dmg -- --mode production ``` ## Current State Analysis ### Existing Build Scripts - **Web**: `build:web` - Uses vite.config.web.mts - **Capacitor**: `build:capacitor` - Uses vite.config.capacitor.mts - **Android**: `build:android` - Shell script wrapper - **iOS**: `build:ios` - Shell script wrapper - **Electron**: `build:electron` - Uses vite.config.electron.mts - **Windows**: `build:electron:windows` - Windows executable - **macOS**: `build:electron:mac` - macOS app bundle - **Linux**: `build:electron:linux` - Linux executable - **AppImage**: `build:electron:appimage` - Linux AppImage - **DMG**: `build:electron:dmg` - macOS DMG installer ### Current `package.json` Scripts ```json { "build:capacitor": "VITE_GIT_HASH=`git log -1 --pretty=format:%h` vite build --mode capacitor --config vite.config.capacitor.mts", "build:web": "VITE_GIT_HASH=`git log -1 --pretty=format:%h` vite build --config vite.config.web.mts", "build:electron": "VITE_GIT_HASH=`git log -1 --pretty=format:%h` vite build --mode electron --config vite.config.electron.mts" } ``` ## Target Pattern ### New Vite Mode-Based Pattern ```bash # Development builds (defaults to --mode development) npm run build:web-dev npm run build:capacitor-dev npm run build:electron-dev # Testing builds (bundle required) npm run build:web -- --mode test npm run build:capacitor -- --mode test && npx cap sync npm run build:electron -- --mode test # Production builds (bundle required) npm run build:web -- --mode production npm run build:capacitor -- --mode production && npx cap sync npm run build:electron -- --mode production # Docker builds npm run build:web:docker -- --mode test npm run build:web:docker -- --mode production # Docker environment-specific builds npm run build:web:docker:test npm run build:web:docker:prod # Capacitor platform-specific builds npm run build:capacitor:android -- --mode test npm run build:capacitor:android -- --mode production npm run build:capacitor:ios -- --mode test npm run build:capacitor:ios -- --mode production # Electron platform-specific builds npm run build:electron:windows -- --mode test npm run build:electron:windows -- --mode production npm run build:electron:mac -- --mode test npm run build:electron:mac -- --mode production npm run build:electron:linux -- --mode test npm run build:electron:linux -- --mode production # Electron package-specific builds npm run build:electron:appimage -- --mode test npm run build:electron:appimage -- --mode production npm run build:electron:dmg -- --mode test npm run build:electron:dmg -- --mode production ``` ### New `package.json` Scripts Structure ```json { "build:web": "VITE_GIT_HASH=`git log -1 --pretty=format:%h` vite --mode development --config vite.config.web.mts", "build:web:dev": "npm run build:web", "build:web:build": "VITE_GIT_HASH=`git log -1 --pretty=format:%h` vite build --mode development --config vite.config.web.mts", "build:web:test": "npm run build:web:build -- --mode test", "build:web:prod": "npm run build:web:build -- --mode production", "build:web:docker": "VITE_GIT_HASH=`git log -1 --pretty=format:%h` vite build --config vite.config.web.mts && docker build -t timesafari-web .", "build:web:docker:test": "npm run build:web:docker -- --mode test", "build:web:docker:prod": "npm run build:web:docker -- --mode production", "build:capacitor": "VITE_GIT_HASH=`git log -1 --pretty=format:%h` vite build --mode capacitor --config vite.config.capacitor.mts", "build:capacitor-dev": "npm run build:capacitor", "build:capacitor:sync": "npm run build:capacitor && npx cap sync", "build:capacitor:android": "npm run build:capacitor:sync && npx cap sync android", "build:capacitor:ios": "npm run build:capacitor:sync && npx cap sync ios", "build:electron": "VITE_GIT_HASH=`git log -1 --pretty=format:%h` vite build --config vite.config.electron.mts", "build:electron:dev": "npm run build:electron && cd electron && npm run electron:start", "build:electron:windows": "npm run build:electron && cd electron && npm run build:windows", "build:electron:mac": "npm run build:electron && cd electron && npm run build:mac", "build:electron:linux": "npm run build:electron && cd electron && npm run build:linux", "build:electron:appimage": "npm run build:electron:linux && cd electron && npm run build:appimage", "build:electron:dmg": "npm run build:electron:mac && cd electron && npm run build:dmg" } ``` ## Implementation Plan ### Phase 1: Environment Configuration (Day 1) #### 1.1 Update Vite Configurations - [ ] **vite.config.web.mts**: Add mode-based configuration - [ ] **vite.config.capacitor.mts**: Add mode-based configuration - [ ] **vite.config.electron.mts**: Add mode-based configuration - [ ] **vite.config.common.mts**: Add environment-specific variables #### 1.2 Environment Variables Setup - [ ] Create `.env.development` file for development settings - [ ] Create `.env.test` file for testing settings - [ ] Create `.env.production` file for production settings - [ ] Update `.env.example` with new pattern #### 1.3 Environment Detection Logic ```typescript // vite.config.common.mts export default defineConfig(({ mode }) => { const getEnvironmentConfig = (mode: string) => { switch (mode) { case 'production': return { /* production settings */ }; case 'test': return { /* testing settings */ }; default: return { /* development settings */ }; } }; return { define: { __DEV__: mode === 'development', __TEST__: mode === 'test', __PROD__: mode === 'production' }, // ... other config }; }); ``` ### Phase 2: Package.json Scripts Update (Day 1) #### 2.1 Web Build Scripts ```json { "build:web": "VITE_GIT_HASH=`git log -1 --pretty=format:%h` vite build --config vite.config.web.mts", "build:web-dev": "npm run build:web", "build:web-test": "npm run build:web -- --mode test", "build:web-prod": "npm run build:web -- --mode production" } ``` #### 2.2 Capacitor Build Scripts ```json { "build:capacitor": "VITE_GIT_HASH=`git log -1 --pretty=format:%h` vite build --mode capacitor --config vite.config.capacitor.mts", "build:capacitor-dev": "npm run build:capacitor", "build:capacitor:sync": "npm run build:capacitor && npx cap sync", "build:capacitor:android": "npm run build:capacitor:sync && npx cap sync android", "build:capacitor:ios": "npm run build:capacitor:sync && npx cap sync ios", "build:capacitor-test": "npm run build:capacitor -- --mode test && npx cap sync", "build:capacitor-prod": "npm run build:capacitor -- --mode production && npx cap sync", "build:capacitor:android-test": "npm run build:capacitor -- --mode test && npx cap sync android", "build:capacitor:android-prod": "npm run build:capacitor -- --mode production && npx cap sync android", "build:capacitor:ios-test": "npm run build:capacitor -- --mode test && npx cap sync ios", "build:capacitor:ios-prod": "npm run build:capacitor -- --mode production && npx cap sync ios" } ``` #### 2.3 Electron Build Scripts ```json { "build:electron": "VITE_GIT_HASH=`git log -1 --pretty=format:%h` vite build --config vite.config.electron.mts", "build:electron-dev": "npm run build:electron", "build:electron:windows": "npm run build:electron && cd electron && npm run build:windows", "build:electron:mac": "npm run build:electron && cd electron && npm run build:mac", "build:electron:linux": "npm run build:electron && cd electron && npm run build:linux", "build:electron:appimage": "npm run build:electron:linux && cd electron && npm run build:appimage", "build:electron:dmg": "npm run build:electron:mac && cd electron && npm run build:dmg", "build:electron-test": "npm run build:electron -- --mode test", "build:electron-prod": "npm run build:electron -- --mode production", "build:electron:windows-test": "npm run build:electron -- --mode test && cd electron && npm run build:windows", "build:electron:windows-prod": "npm run build:electron -- --mode production && cd electron && npm run build:windows", "build:electron:mac-dev": "npm run build:electron -- --mode development && cd electron && npm run build:mac", "build:electron:mac-test": "npm run build:electron -- --mode test && cd electron && npm run build:mac", "build:electron:mac-prod": "npm run build:electron -- --mode production && cd electron && npm run build:mac", "build:electron:linux-test": "npm run build:electron -- --mode test && cd electron && npm run build:linux", "build:electron:linux-prod": "npm run build:electron -- --mode production && cd electron && npm run build:linux" } ``` #### 2.4 Docker Build Scripts ```json { "build:web:docker": "VITE_GIT_HASH=`git log -1 --pretty=format:%h` vite build --config vite.config.web.mts && docker build -t timesafari-web .", "build:web:docker:test": "npm run build:web:docker -- --mode test", "build:web:docker:prod": "npm run build:web:docker -- --mode production" } ``` **Docker Build Features:** - Complete Vite build + Docker image creation workflow - Environment-specific configurations (test/production) - Consistent image tagging (`timesafari-web`) - Mode override flexibility for custom environments ### Phase 3: Shell Script Updates (Day 2) #### 3.1 Update build-electron.sh - [ ] Add mode-based environment support - [ ] Update environment loading logic - [ ] Add environment-specific build paths - [ ] Update logging to show environment #### 3.2 Update build-android.sh - [ ] Add mode-based environment support - [ ] Update environment detection - [ ] Add environment-specific configurations #### 3.3 Update build-ios.sh - [ ] Add mode-based environment support - [ ] Update environment detection - [ ] Add environment-specific configurations ### Phase 4: Documentation Updates (Day 2) #### 4.1 Update BUILDING.md - [ ] Document new Vite mode-based pattern - [ ] Update build instructions - [ ] Add environment-specific examples - [ ] Update troubleshooting section #### 4.2 Update scripts/README.md - [ ] Document new Vite mode-based build patterns - [ ] Update usage examples - [ ] Add environment configuration guide #### 4.3 Update CI/CD Documentation - [ ] Update GitHub Actions workflows - [ ] Update Docker build instructions - [ ] Update deployment guides ### Phase 5: Testing & Validation (Day 3) #### 5.1 Environment Testing - [ ] Test dev environment builds - [ ] Test test environment builds - [ ] Test prod environment builds - [ ] Validate environment variables #### 5.2 Platform Testing - [ ] Test web builds across environments - [ ] Test capacitor builds across environments - [ ] Test capacitor android sync across environments - [ ] Test capacitor ios sync across environments - [ ] Test electron builds across environments - [ ] Test electron windows builds across environments - [ ] Test electron mac builds across environments - [ ] Test electron linux builds across environments - [ ] Test electron appimage builds across environments - [ ] Test electron dmg builds across environments - [ ] Test docker builds across environments - [ ] Test docker image creation and tagging - [ ] Test docker environment-specific configurations #### 5.3 Integration Testing - [ ] Test with existing CI/CD pipelines - [ ] Test with existing deployment scripts - [ ] Test with existing development workflows ## Environment-Specific Configurations ### Development Environment (--mode development) ```typescript { VITE_API_URL: 'http://localhost:3000', VITE_DEBUG: 'true', VITE_LOG_LEVEL: 'debug', VITE_ENABLE_DEV_TOOLS: 'true' } ``` ### Testing Environment (--mode test) ```typescript { VITE_API_URL: 'https://test-api.timesafari.com', VITE_DEBUG: 'false', VITE_LOG_LEVEL: 'info', VITE_ENABLE_DEV_TOOLS: 'false' } ``` ### Production Environment (--mode production) ```typescript { VITE_API_URL: 'https://api.timesafari.com', VITE_DEBUG: 'false', VITE_LOG_LEVEL: 'warn', VITE_ENABLE_DEV_TOOLS: 'false' } ``` ## Migration Strategy ### Backward Compatibility - [ ] Keep existing script names as aliases - [ ] Add deprecation warnings for old scripts - [ ] Maintain existing CI/CD compatibility - [ ] Provide migration guide for users ### Gradual Rollout 1. **Week 1**: Implement new scripts alongside existing ones 2. **Week 2**: Update CI/CD to use new pattern 3. **Week 3**: Update documentation and guides 4. **Week 4**: Deprecate old scripts with warnings ## Success Metrics ### Technical Metrics - [ ] All builds work with Vite mode-based pattern - [ ] Environment variables properly loaded - [ ] Build artifacts correctly generated - [ ] No regression in existing functionality ### Process Metrics - [ ] Reduced build script complexity - [ ] Improved environment management - [ ] Better developer experience - [ ] Consistent build patterns ## Risk Assessment ### Low Risk - [ ] Environment variable changes - [ ] Package.json script updates - [ ] Documentation updates ### Medium Risk - [ ] Vite configuration changes (mode-based) - [ ] Shell script modifications - [ ] CI/CD pipeline updates ### High Risk - [ ] Breaking existing build processes - [ ] Environment-specific bugs - [ ] Deployment failures ## Rollback Plan ### Immediate Rollback - [ ] Revert package.json changes - [ ] Restore original vite configs - [ ] Restore original shell scripts ### Gradual Rollback - [ ] Keep old scripts as primary - [ ] Use new scripts as experimental - [ ] Gather feedback before full migration ## Timeline ### Day 1: Foundation - [ ] Environment configuration setup - [ ] Package.json script updates - [ ] Basic testing ### Day 2: Integration - [ ] Shell script updates - [ ] Documentation updates - [ ] Integration testing ### Day 3: Validation - [ ] Comprehensive testing - [ ] Performance validation - [ ] Documentation review ### Day 4: Deployment - [ ] CI/CD updates - [ ] Production validation - [ ] User communication ## Next Steps 1. **Review and approve plan** 2. **Set up development environment** 3. **Begin Phase 1 implementation** 4. **Create test cases** 5. **Start implementation** --- **Status**: Ready for implementation **Priority**: Medium **Estimated Effort**: 3-4 days **Dependencies**: None **Stakeholders**: Development team, DevOps team