#!/usr/bin/env node /** * Script de déploiement automatique pour Firebase Hosting * - Bascule en mode PRODUCTION * - Incrémente la version * - Build l'application Flutter pour le web * - Vérifie que version.json est bien présent * - Déploie sur Firebase Hosting (avec en-têtes CORS pour version.json) * - Vérifie que version.json est accessible avec CORS * - Rebascule en mode DÉVELOPPEMENT */ const { execSync } = require('child_process'); const { incrementVersion } = require('./increment_version'); const { setProductionMode, setDevelopmentMode } = require('./toggle_env'); const fs = require('fs'); const path = require('path'); const https = require('https'); console.log('🚀 Démarrage du déploiement Firebase Hosting...\n'); // Étape 0: Basculer en mode production console.log('🔒 Étape 0/5: Basculement en mode PRODUCTION'); if (!setProductionMode()) { console.error('❌ Impossible de basculer en mode production'); process.exit(1); } console.log(''); // Étape 1: Incrémenter la version console.log('📝 Étape 1/5: Incrémentation de la version'); const newVersion = incrementVersion(); console.log(''); // Étape 2: Build Flutter pour le web console.log('🔨 Étape 2/5: Build Flutter Web'); try { execSync('flutter build web --release', { stdio: 'inherit', cwd: process.cwd() }); console.log('✅ Build terminé avec succès\n'); } catch (error) { console.error('❌ Erreur lors du build Flutter'); // Rebascule en mode dev avant de quitter setDevelopmentMode(); process.exit(1); } // Étape 2.5: Vérifier que version.json est bien présent dans build/web console.log('🔍 Étape 2.5/5: Vérification de version.json'); const versionJsonPath = path.join(process.cwd(), 'build', 'web', 'version.json'); if (!fs.existsSync(versionJsonPath)) { console.warn('⚠️ version.json n\'a pas été copié dans build/web/'); // Copier manuellement depuis web/version.json const sourceVersionJsonPath = path.join(process.cwd(), 'web', 'version.json'); if (fs.existsSync(sourceVersionJsonPath)) { console.log(' → Copie de web/version.json vers build/web/...'); fs.copyFileSync(sourceVersionJsonPath, versionJsonPath); console.log('✅ Fichier version.json copié avec succès'); } else { console.error('❌ Impossible de trouver web/version.json'); setDevelopmentMode(); process.exit(1); } } else { console.log('✅ version.json est présent dans build/web/'); } // Afficher la version qui va être déployée try { const versionContent = JSON.parse(fs.readFileSync(versionJsonPath, 'utf8')); console.log(` 📦 Version: ${versionContent.version}`); console.log(` 🔒 Force update: ${versionContent.forceUpdate}`); } catch (error) { console.warn('⚠️ Impossible de lire version.json'); } console.log(''); // Étape 3: Déploiement Firebase console.log('🌐 Étape 3/5: Déploiement sur Firebase Hosting'); console.log(' ℹ️ Les en-têtes CORS pour version.json seront appliqués automatiquement'); try { execSync('firebase deploy --only hosting', { stdio: 'inherit', cwd: process.cwd() }); console.log('\n✅ Déploiement terminé avec succès!'); console.log(`🎉 Version ${newVersion} déployée sur Firebase Hosting`); } catch (error) { console.error('❌ Erreur lors du déploiement Firebase'); // Rebascule en mode dev avant de quitter setDevelopmentMode(); process.exit(1); } // Étape 4: Vérifier que version.json est accessible avec CORS console.log('\n🔍 Étape 4/5: Vérification de l\'accès à version.json'); setTimeout(() => { https.get('https://app.em2events.fr/version.json', { headers: { 'Origin': 'http://localhost' } }, (res) => { if (res.statusCode === 200) { console.log('✅ version.json est accessible (statut 200)'); // Vérifier les en-têtes CORS const corsHeader = res.headers['access-control-allow-origin']; if (corsHeader) { console.log(`✅ En-têtes CORS configurés: ${corsHeader}`); } else { console.warn('⚠️ En-têtes CORS non détectés (peuvent prendre quelques minutes pour se propager)'); } // Lire et afficher la version déployée let body = ''; res.on('data', chunk => body += chunk); res.on('end', () => { try { const deployed = JSON.parse(body); console.log(`📦 Version déployée: ${deployed.version}`); } catch (e) { // Ignore } }); } else { console.warn(`⚠️ Statut HTTP: ${res.statusCode}`); } }).on('error', (err) => { console.warn('⚠️ Impossible de vérifier l\'accès à version.json'); console.warn(` ${err.message}`); console.warn(' Le fichier peut prendre quelques minutes pour être accessible'); }); }, 2000); // Attendre 2 secondes pour que le déploiement se propage // Étape 5: Rebascule en mode développement console.log('\n🔓 Étape 5/5: Retour en mode DÉVELOPPEMENT'); if (!setDevelopmentMode()) { console.warn('⚠️ Impossible de rebascule en mode développement'); console.warn('⚠️ Exécutez manuellement: npm run env:dev'); } else { console.log('✅ Mode développement restauré'); } console.log('\n✨ Processus de déploiement terminé!'); console.log('📝 Les utilisateurs recevront une notification de mise à jour au prochain chargement.');