const archiver = require('archiver'); const fs = require('fs'); const path = require('path'); async function assemblePacket(config, clientDir) { const zipPath = path.join(clientDir, 'compliance-packet.zip'); const output = fs.createWriteStream(zipPath); const archive = archiver('zip', { zlib: { level: 9 } }); return new Promise((resolve, reject) => { output.on('close', () => { console.log(` → Zip created: ${archive.pointer()} bytes`); resolve(zipPath); }); archive.on('error', (err) => reject(err)); archive.pipe(output); // Add screenshots const screenshotsDir = path.join(clientDir, 'screenshots'); if (fs.existsSync(screenshotsDir)) { archive.directory(screenshotsDir, 'screenshots'); } // Create compliance packet text file const packetText = generatePacketText(config); archive.append(packetText, { name: 'compliance-packet.txt' }); // Create a formatted HTML version const packetHtml = generatePacketHtml(config); archive.append(packetHtml, { name: 'compliance-packet.html' }); // Add config archive.append(JSON.stringify(config, null, 2), { name: 'config.json' }); archive.finalize(); }); } function generatePacketText(config) { const p = config.a2pPacket; const siteUrl = config.siteUrl; return `═══════════════════════════════════════════════════════ A2P 10DLC COMPLIANCE PACKET ${config.businessName} Generated: ${new Date().toLocaleDateString()} ═══════════════════════════════════════════════════════ CAMPAIGN DESCRIPTION ───────────────────── ${p.campaignDescription} SAMPLE MESSAGES ───────────────────── Message 1: ${p.sampleMessages[0]} Message 2: ${p.sampleMessages[1]} Message 3: ${p.sampleMessages[2]} OPT-IN FLOW DESCRIPTION ───────────────────── ${p.optInFlowDescription} Website URL: ${siteUrl} Contact/Opt-in Page: ${siteUrl}/contact Privacy Policy: ${siteUrl}/privacy-policy Terms of Service: ${siteUrl}/terms OPT-IN CONFIRMATION MESSAGE ───────────────────── ${p.optInConfirmation} OPT-OUT CONFIRMATION MESSAGE ───────────────────── ${p.optOutConfirmation} HELP MESSAGE ───────────────────── ${p.helpMessage} KEYWORDS ───────────────────── Opt-in Keywords: ${p.optInKeywords} Opt-out Keywords: ${p.optOutKeywords} Help Keywords: ${p.helpKeywords} CONSENT TEXT (on website form) ───────────────────── ${p.consentText} SCREENSHOTS INCLUDED ───────────────────── 1. homepage.png - Full homepage screenshot 2. contact-optin.png - Opt-in form with consent checkbox 3. privacy-policy.png - Privacy Policy page 4. terms-of-service.png - Terms of Service page ═══════════════════════════════════════════════════════ Generated by A2P Compliance Wizard ═══════════════════════════════════════════════════════ `; } function generatePacketHtml(config) { const p = config.a2pPacket; const siteUrl = config.siteUrl; return `