laraship
Version:
Set sail with Laravel - Docker environment generator for Laravel projects
101 lines (88 loc) • 4.26 kB
JavaScript
const fs = require('fs');
const path = require('path');
async function updateEnvFile(envVars, featurePreferences) {
try {
const envPath = path.join(process.cwd(), '.env');
let envContent = await fs.promises.readFile(envPath, 'utf8');
// If user wants MySQL container
if (featurePreferences.databaseSetup === 'mysql') {
envContent = envContent.replace(/DB_HOST=.*/g, 'DB_HOST=db');
envContent = envContent.replace(/DB_PORT=.*/g, 'DB_PORT=3306');
envContent = envContent.replace(/DB_DATABASE=.*/g, `DB_DATABASE=${featurePreferences.dbName}`);
envContent = envContent.replace(/DB_USERNAME=.*/g, `DB_USERNAME=${featurePreferences.dbUsername}`);
envContent = envContent.replace(/DB_PASSWORD=.*/g, `DB_PASSWORD=${featurePreferences.dbRootPassword}`);
}
// If user wants Redis container
if (featurePreferences.redisSetup === 'redis') {
envContent = envContent.replace(/REDIS_HOST=.*/g, 'REDIS_HOST=redis');
envContent = envContent.replace(/REDIS_PASSWORD=.*/g, 'REDIS_PASSWORD=null');
envContent = envContent.replace(/REDIS_PORT=.*/g, 'REDIS_PORT=6379');
envContent = envContent.replace(/CACHE_DRIVER=.*/g, 'CACHE_DRIVER=redis');
}
// Update backup configuration
if (featurePreferences.backupStorage === 'local') {
addOrUpdateEnv(envContent, {
'BACKUP_DRIVER': 'local',
'BACKUP_PATH': featurePreferences.localBackupPath
});
}
else if (featurePreferences.backupStorage === 's3') {
const prefix = featurePreferences.s3Provider === 'custom' ?
featurePreferences.customS3Name :
featurePreferences.s3Provider.toUpperCase();
const s3Config = {
'BACKUP_DRIVER': 's3',
[`${prefix}_ACCESS_KEY_ID`]: featurePreferences.s3AccessKey,
[`${prefix}_SECRET_ACCESS_KEY`]: featurePreferences.s3SecretKey,
[`${prefix}_DEFAULT_REGION`]: featurePreferences.s3Region || 'us-east-1',
[`${prefix}_BUCKET`]: featurePreferences.s3Bucket
};
if (featurePreferences.s3Provider !== 'aws') {
s3Config[`${prefix}_ENDPOINT`] = featurePreferences.s3Endpoint;
s3Config[`${prefix}_URL`] = featurePreferences.s3Endpoint;
s3Config[`${prefix}_USE_PATH_STYLE_ENDPOINT`] = 'true';
}
addOrUpdateEnv(envContent, s3Config);
}
else if (featurePreferences.backupStorage === 'ftp') {
addOrUpdateEnv(envContent, {
'BACKUP_DRIVER': 'ftp',
'FTP_TYPE': featurePreferences.ftpType,
'FTP_HOST': featurePreferences.ftpHost,
'FTP_PORT': featurePreferences.ftpPort,
'FTP_USERNAME': featurePreferences.ftpUsername,
'FTP_PASSWORD': featurePreferences.ftpPassword,
'FTP_PATH': featurePreferences.ftpPath,
'FTP_SSL': featurePreferences.ftpType === 'ftps' ? 'true' : 'false',
'FTP_PASSIVE': featurePreferences.ftpType === 'ftp' ? 'true' : 'false'
});
}
await fs.promises.writeFile(envPath, envContent);
} catch (error) {
throw new Error(`Failed to update .env file: ${error.message}`);
}
}
function addOrUpdateEnv(content, variables) {
let lines = content.split('\n');
const updated = new Set();
// Update existing variables
lines = lines.map(line => {
const match = line.match(/^([^=]+)=/);
if (match) {
const key = match[1];
if (variables[key] !== undefined) {
updated.add(key);
return `${key}=${variables[key]}`;
}
}
return line;
});
// Add new variables
Object.entries(variables).forEach(([key, value]) => {
if (!updated.has(key)) {
lines.push(`${key}=${value}`);
}
});
return lines.join('\n');
}
module.exports = { updateEnvFile };