UNPKG

maildev

Version:

SMTP Server and Web Interface for reading and testing emails during development

148 lines 5.02 kB
/** * MailDev Init Command * * Interactive setup wizard for creating configuration files */ import { existsSync, writeFileSync } from 'node:fs'; import { join } from 'node:path'; import { createInterface } from 'node:readline'; import { DEFAULT_CONFIG } from '../config/defaults.js'; /** * Prompt for user input */ async function prompt(question, defaultValue) { const rl = createInterface({ input: process.stdin, output: process.stdout, }); return new Promise((resolve) => { const displayDefault = defaultValue !== undefined ? ` (${defaultValue})` : ''; rl.question(`${question}${displayDefault}: `, (answer) => { rl.close(); resolve(answer.trim() || defaultValue || ''); }); }); } /** * Prompt for yes/no confirmation */ async function confirm(question, defaultValue = false) { const defaultStr = defaultValue ? 'Y/n' : 'y/N'; const answer = await prompt(`${question} [${defaultStr}]`); if (!answer) return defaultValue; return answer.toLowerCase().startsWith('y'); } /** * Generate JSON configuration content */ function generateJsonConfig(config) { return JSON.stringify(config, null, 2) + '\n'; } /** * Generate JavaScript configuration content */ function generateJsConfig(config) { const entries = Object.entries(config) .map(([key, value]) => { const valueStr = typeof value === 'string' ? `'${value}'` : String(value); return ` ${key}: ${valueStr},`; }) .join('\n'); return `/** * MailDev Configuration * https://maildev.github.io/maildev/ */ export default { ${entries} } `; } /** * Run the init command */ export async function runInit(options) { const cwd = process.cwd(); const filename = options.json ? '.maildevrc.json' : 'maildev.config.js'; const filepath = join(cwd, filename); console.log(); console.log('MailDev Configuration Setup'); console.log('==========================='); console.log(); // Check for existing config if (existsSync(filepath) && !options.force) { console.log(`Configuration file already exists: ${filename}`); const overwrite = await confirm('Overwrite?', false); if (!overwrite) { console.log('Aborted.'); return; } console.log(); } // Gather configuration options const config = {}; // SMTP Port const smtpPort = await prompt('SMTP port', String(DEFAULT_CONFIG.smtp)); if (smtpPort !== String(DEFAULT_CONFIG.smtp)) { config.smtp = parseInt(smtpPort, 10); } // Web Port const webPort = await prompt('Web interface port', String(DEFAULT_CONFIG.web)); if (webPort !== String(DEFAULT_CONFIG.web)) { config.web = parseInt(webPort, 10); } // SMTP Auth const useSmtpAuth = await confirm('Enable SMTP authentication?', false); if (useSmtpAuth) { config.incomingUser = await prompt('SMTP username'); config.incomingPass = await prompt('SMTP password'); } // Web Auth const useWebAuth = await confirm('Enable web interface authentication?', false); if (useWebAuth) { config.webUser = await prompt('Web username'); config.webPass = await prompt('Web password'); } // Mail Directory const useMailDir = await confirm('Persist emails to disk?', false); if (useMailDir) { config.mailDirectory = await prompt('Mail directory path', './maildev-data'); } // MCP const useMcp = await confirm('Enable MCP server for Claude integration?', false); if (useMcp) { config.mcp = true; } // Relay const useRelay = await confirm('Configure email relay?', false); if (useRelay) { config.outgoingHost = await prompt('Relay SMTP host'); const relayPort = await prompt('Relay SMTP port', '587'); config.outgoingPort = parseInt(relayPort, 10); const useRelayAuth = await confirm('Relay requires authentication?', true); if (useRelayAuth) { config.outgoingUser = await prompt('Relay username'); config.outgoingPass = await prompt('Relay password'); } const useAutoRelay = await confirm('Enable auto-relay?', false); if (useAutoRelay) { const defaultRecipient = await prompt('Default recipient email (leave empty for original)'); config.autoRelay = defaultRecipient || true; } } console.log(); // Generate and write config file const content = options.json ? generateJsonConfig(config) : generateJsConfig(config); writeFileSync(filepath, content, 'utf-8'); console.log(`Configuration saved to ${filename}`); console.log(); console.log('To start MailDev with this configuration:'); console.log(' maildev'); console.log(); console.log('Or specify the config file explicitly:'); console.log(` maildev --config ${filename}`); console.log(); } //# sourceMappingURL=init.js.map