UNPKG

wp-host

Version:

Automated WordPress hosting deployment tool for bulk site creation with MySQL database management

262 lines • 10.8 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.ExportManager = void 0; const fs = __importStar(require("fs-extra")); const path = __importStar(require("path")); class ExportManager { constructor(config) { this.config = config; } /** * Generate comprehensive deployment export */ async generateDeploymentExport(deploymentResults, appPasswordResults, exportPath) { console.log('\nšŸ“Š Generating deployment export...'); const exportData = this.prepareExportData(deploymentResults, appPasswordResults); const csvContent = this.generateCSV(exportData); // Determine export file path const defaultFileName = `wordpress-deployment-${new Date().toISOString().split('T')[0]}.csv`; const finalExportPath = exportPath || path.join(process.cwd(), defaultFileName); // Write CSV file await fs.writeFile(finalExportPath, csvContent, 'utf8'); console.log(`āœ… Export saved to: ${finalExportPath}`); this.displayExportSummary(exportData, finalExportPath); return finalExportPath; } /** * Prepare export data by combining all deployment information */ prepareExportData(deploymentResults, appPasswordResults) { const exportData = []; this.config.sites.forEach(site => { const deploymentResult = deploymentResults.find(r => r.site_name === site.site_name); const appPasswordResult = appPasswordResults?.find(r => r.site_name === site.site_name); const siteUrl = this.generateSiteUrl(site.directory_path); const adminLoginUrl = `${siteUrl}/wp-admin/`; const apiEndpoint = `${siteUrl}/wp-json/wp/v2/`; const exportRow = { site_name: site.site_name, site_title: site.wordpress_site_title || 'WordPress Site', site_url: siteUrl, directory_path: site.directory_path, admin_login_url: adminLoginUrl, admin_username: site.wordpress_admin_username || 'admin', admin_password: this.config.wordpress.adminPassword, admin_email: this.config.wordpress.adminEmail, database_name: site.database_name || `${site.site_name}_db`, database_user: site.db_user || `${site.site_name}_user`, database_password: this.config.mysql.sharedDbPassword, database_host: `${this.config.mysql.host}:${this.config.mysql.port}`, deployment_status: deploymentResult?.status || 'unknown', deployment_errors: deploymentResult?.errors?.join('; '), api_endpoint: apiEndpoint, created_date: new Date().toISOString(), }; // Add app password data if available if (appPasswordResult) { exportRow.app_password = appPasswordResult.app_password; exportRow.app_name = appPasswordResult.app_name; } exportData.push(exportRow); }); return exportData; } /** * Generate CSV content from export data */ generateCSV(data) { // Define headers in a user-friendly order const headers = [ 'Site Name', 'Site Title', 'Site URL', 'Admin Login URL', 'Admin Username', 'Admin Password', 'Admin Email', 'Database Name', 'Database User', 'Database Password', 'Database Host', 'App Password', 'App Name', 'API Endpoint', 'Directory Path', 'Deployment Status', 'Deployment Errors', 'Created Date' ]; // Map headers to data keys const headerMap = { 'Site Name': 'site_name', 'Site Title': 'site_title', 'Site URL': 'site_url', 'Admin Login URL': 'admin_login_url', 'Admin Username': 'admin_username', 'Admin Password': 'admin_password', 'Admin Email': 'admin_email', 'Database Name': 'database_name', 'Database User': 'database_user', 'Database Password': 'database_password', 'Database Host': 'database_host', 'App Password': 'app_password', 'App Name': 'app_name', 'API Endpoint': 'api_endpoint', 'Directory Path': 'directory_path', 'Deployment Status': 'deployment_status', 'Deployment Errors': 'deployment_errors', 'Created Date': 'created_date' }; // Generate CSV let csv = headers.join(',') + '\n'; data.forEach(row => { const csvRow = headers.map(header => { const key = headerMap[header]; let value = row[key] || ''; // Handle CSV escaping if (typeof value === 'string') { // Escape quotes and wrap in quotes if contains comma, quote, or newline if (value.includes(',') || value.includes('"') || value.includes('\n')) { value = '"' + value.replace(/"/g, '""') + '"'; } } return value; }); csv += csvRow.join(',') + '\n'; }); return csv; } /** * Generate site URL based on directory path */ generateSiteUrl(targetDir) { if (targetDir.includes('/var/www/html/')) { const sitePath = targetDir.replace('/var/www/html/', ''); return `http://localhost/${sitePath}`; } else if (targetDir.includes('/var/www/')) { const sitePath = targetDir.replace('/var/www/', ''); return `http://localhost/${sitePath}`; } else { return `http://localhost:8080`; } } /** * Display export summary */ displayExportSummary(data, exportPath) { console.log('\nšŸ“‹ Export Summary'); console.log('================'); console.log(`šŸ“ File: ${exportPath}`); console.log(`šŸ“Š Sites: ${data.length}`); const successful = data.filter(d => d.deployment_status === 'success').length; const failed = data.filter(d => d.deployment_status === 'failed').length; console.log(`āœ… Successful: ${successful}`); console.log(`āŒ Failed: ${failed}`); const hasAppPasswords = data.some(d => d.app_password && d.app_password !== 'MANUAL_GENERATION_REQUIRED'); if (hasAppPasswords) { const appPasswordCount = data.filter(d => d.app_password && d.app_password !== 'MANUAL_GENERATION_REQUIRED').length; console.log(`šŸ”‘ App Passwords: ${appPasswordCount}/${data.length}`); } console.log('\nšŸ’” Export includes:'); console.log(' • Site URLs and admin login links'); console.log(' • WordPress admin credentials'); console.log(' • Database connection details'); if (hasAppPasswords) { console.log(' • Application passwords for API access'); } console.log(' • WordPress REST API endpoints'); console.log(' • Deployment status and error details'); console.log('\nšŸ“± Perfect for:'); console.log(' • Client handoff documentation'); console.log(' • Team credential sharing'); console.log(' • Development environment setup'); console.log(' • API integration projects'); } /** * Generate export template */ async generateExportTemplate(templatePath) { const defaultPath = templatePath || path.join(process.cwd(), 'deployment-export-template.csv'); const templateHeaders = [ 'Site Name', 'Site Title', 'Site URL', 'Admin Login URL', 'Admin Username', 'Admin Password', 'Admin Email', 'Database Name', 'Database User', 'Database Password', 'Database Host', 'App Password', 'App Name', 'API Endpoint', 'Directory Path', 'Deployment Status', 'Deployment Errors', 'Created Date' ]; const sampleRow = [ 'example_site', 'Example WordPress Site', 'http://localhost/example', 'http://localhost/example/wp-admin/', 'admin', 'wp_admin_password_123', 'admin@example.com', 'example_site_db', 'example_site_user', 'shared_db_password_123', 'localhost:3306', 'abcd efgh ijkl mnop qrst uvwx', 'example_site_automation', 'http://localhost/example/wp-json/wp/v2/', '/var/www/html/example', 'success', '', '2023-12-07T10:30:00.000Z' ]; const csvContent = templateHeaders.join(',') + '\n' + sampleRow.join(',') + '\n'; await fs.writeFile(defaultPath, csvContent, 'utf8'); console.log(`šŸ“„ Export template saved to: ${defaultPath}`); return defaultPath; } } exports.ExportManager = ExportManager; //# sourceMappingURL=export-manager.js.map