// Name: Deduplicate Emails // Description: Accepts a comma-separated list of emails, returns a deduplicated string and lists which emails had duplicates. // Author: zacjones93 // GitHub: zacjones93 import "@johnlindquist/kit" const input = await arg({ placeholder: "Paste comma-separated emails", enter: "Deduplicate", strict: false, }) const tokens = input .replace(/[\n\r;]+/g, ",") .split(",") .map(s => s.trim()) .filter(Boolean) const counts = new Map<string, number>() const firstOriginal = new Map<string, string>() // normalized -> first seen original for (const email of tokens) { const norm = email.toLowerCase() if (!firstOriginal.has(norm)) firstOriginal.set(norm, email) counts.set(norm, (counts.get(norm) || 0) + 1) } const deduped = Array.from(firstOriginal.values()) const dedupedCSV = deduped.join(", ") const duplicates = Array.from(counts.entries()) .filter(([_, c]) => c > 1) .map(([norm, c]) => ({ email: firstOriginal.get(norm) || norm, count: c, })) await copy(dedupedCSV) toast("Copied deduplicated list to clipboard") const summary = md(` # Deduplicated Emails - Total provided: ${tokens.length} - Unique: ${deduped.length} - Duplicates found: ${duplicates.length} ## Deduplicated CSV \`\`\` ${dedupedCSV} \`\`\` ${ duplicates.length ? `## Emails with duplicates ${duplicates.map(d => `- ${d.email} (${d.count} occurrences)`).join("\n")}` : `## Emails with duplicates - None 🎉` } `) await div(summary)