UNPKG

@gmana/email-checker

Version:
439 lines (323 loc) โ€ข 11.1 kB
# @gmana/email-checker A powerful and lightweight TypeScript library to detect disposable email addresses with advanced validation features and comprehensive domain coverage. [![npm version](https://badge.fury.io/js/@gmana%2Femail-checker.svg)](https://badge.fury.io/js/@gmana%2Femail-checker) [![TypeScript](https://img.shields.io/badge/TypeScript-Ready-blue.svg)](https://www.typescriptlang.org/) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) ## โœจ Features - ๐Ÿš€ **Comprehensive Detection**: 286+ disposable email domains (constantly updated) - ๐Ÿ”ง **Highly Configurable**: Custom whitelists, validation modes, and extensible options - ๐Ÿ“Š **Detailed Validation**: Rich validation results with metadata and error reporting - โšก **Performance Optimized**: O(1) lookups with intelligent caching system - ๐ŸŒ **International Support**: Handles international domains and subdomains - ๐Ÿ’ช **TypeScript First**: Full type safety with comprehensive type definitions - ๐Ÿชถ **Zero Dependencies**: Lightweight with no external runtime dependencies - ๐Ÿ“ฆ **Universal**: Works in Node.js, browsers, and supports both ESM & CJS ## ๐Ÿ“ฆ Installation ```bash npm install @gmana/email-checker ``` ```bash yarn add @gmana/email-checker ``` ```bash pnpm add @gmana/email-checker ``` ```bash bun add @gmana/email-checker ``` ## ๐Ÿš€ Quick Start ### Basic Usage ```typescript import { isDisposableEmail } from "@gmana/email-checker" // Simple boolean check console.log(isDisposableEmail("user@10minutemail.com")) // true console.log(isDisposableEmail("user@gmail.com")) // false console.log(isDisposableEmail("user@tempmail.net")) // true ``` ### Advanced Validation with Details ```typescript import { validateEmail } from "@gmana/email-checker" const result = validateEmail("user@tempmail.net") console.log(result) // { // isValid: true, // isDisposable: true, // domain: "tempmail.net", // errors: [], // metadata: { // isInternational: false, // hasSubdomains: false, // isWhitelisted: false // } // } ``` ## ๐Ÿ”ง Configuration ### Global Configuration ```typescript import { configureEmailChecker, isDisposableEmail } from "@gmana/email-checker" // Configure global settings configureEmailChecker({ strictMode: true, // Enable strict email validation whitelistedDomains: ["company.com"], // Always allow these domains customDisposableDomains: [ // Add custom disposable domains "suspicious-temp.com", "fake-emails.net", ], allowInternational: true, // Allow international domains allowSubdomains: false, // Disallow subdomains enableCaching: true, // Enable performance caching maxCacheSize: 1000, // Cache size limit }) // Now all validation uses these settings console.log(isDisposableEmail("user@company.com")) // false (whitelisted) ``` ### Per-Validation Options ```typescript import { isDisposableEmail, validateEmail } from "@gmana/email-checker" // Override global config for specific validations const isDisposable = isDisposableEmail("user@sub.tempmail.com", { allowSubdomains: true, whitelistedDomains: ["tempmail.com"], }) const result = validateEmail("user@mรผnchen-temp.de", { allowInternational: true, strictMode: false, }) ``` ## ๐Ÿ“š Complete API Reference ### Core Functions #### `isDisposableEmail(email: string, options?: EmailValidationOptions): boolean` Simple boolean check for disposable emails. ```typescript isDisposableEmail("test@10minutemail.com") // true isDisposableEmail("user@gmail.com") // false isDisposableEmail("invalid-email") // false ``` #### `validateEmail(email: string, options?: EmailValidationOptions): EmailValidationResult` Comprehensive validation with detailed results. ```typescript const result = validateEmail("user@sub.tempmail.com") // Returns detailed validation information ``` ### Configuration Functions #### `configureEmailChecker(config: Partial<EmailCheckerConfig>): void` Set global configuration options. #### `resetEmailCheckerConfig(): void` Reset configuration to defaults. #### `getEmailCheckerConfig(): EmailCheckerConfig` Get current configuration settings. ### Domain Analysis Functions #### `isDomainDisposable(domain: string): boolean` Check if a specific domain is disposable. ```typescript isDomainDisposable("tempmail.net") // true isDomainDisposable("gmail.com") // false ``` #### `getDomainInfo(domain: string, options?: EmailValidationOptions): DomainInfo` Get detailed information about a domain. ```typescript const info = getDomainInfo("tempmail.net") // { domain: "tempmail.net", isDisposable: true, isWhitelisted: false, isInternational: false } ``` #### `getDisposableDomains(): string[]` Get the complete list of known disposable domains. ```typescript const domains = getDisposableDomains() console.log(`Total domains: ${domains.length}`) // Total domains: 286+ ``` ### Utility Functions #### `extractDomain(email: string): string | null` Extract domain from email address. ```typescript extractDomain("user@example.com") // "example.com" extractDomain("invalid-email") // null ``` #### `isValidEmailFormat(email: string, strictMode?: boolean): boolean` Validate email format. ```typescript isValidEmailFormat("user@example.com") // true isValidEmailFormat("invalid-email") // false ``` ### Cache Management #### `clearCache(): void` Clear the domain validation cache. #### `getCacheStats(): { size: number; maxSize: number }` Get cache statistics. ```typescript const stats = getCacheStats() console.log(`Cache: ${stats.size}/${stats.maxSize}`) ``` ## ๐ŸŽฏ Advanced Usage Examples ### Form Validation with Zod ```typescript import { z } from "zod" import { isDisposableEmail } from "@gmana/email-checker" const signUpSchema = z.object({ email: z .string() .min(1, "Email is required") .email("Invalid email format") .refine((email) => !isDisposableEmail(email), { message: "Disposable emails are not allowed", }), }) type SignUpData = z.infer<typeof signUpSchema> ``` ### Express.js Middleware ```typescript import express from "express" import { validateEmail } from "@gmana/email-checker" const app = express() // Advanced email validation middleware app.post("/signup", (req, res) => { const { email } = req.body const validation = validateEmail(email) if (!validation.isValid) { return res.status(400).json({ error: "Invalid email", details: validation.errors, }) } if (validation.isDisposable) { return res.status(400).json({ error: "Disposable emails are not allowed", domain: validation.domain, }) } // Continue with signup process }) ``` ### React Hook Integration ```typescript import { useState, useEffect } from "react" import { validateEmail } from "@gmana/email-checker" function useEmailValidation(email: string) { const [validation, setValidation] = useState(null) useEffect(() => { if (email) { const result = validateEmail(email) setValidation(result) } }, [email]) return validation } // Usage in component function SignUpForm() { const [email, setEmail] = useState("") const validation = useEmailValidation(email) return ( <div> <input value={email} onChange={(e) => setEmail(e.target.value)} placeholder="Enter email" /> {validation?.isDisposable && ( <p className="error">Disposable emails are not allowed</p> )} </div> ) } ``` ### Bulk Email Processing ```typescript import { isDisposableEmail, configureEmailChecker } from "@gmana/email-checker" // Configure once for optimal performance configureEmailChecker({ enableCaching: true, maxCacheSize: 5000, }) async function processBulkEmails(emails: string[]) { const results = emails.map((email) => ({ email, isDisposable: isDisposableEmail(email), isValid: email.includes("@"), })) const stats = { total: emails.length, disposable: results.filter((r) => r.isDisposable).length, valid: results.filter((r) => r.isValid).length, } return { results, stats } } ``` ## ๐ŸŽ›๏ธ TypeScript Types ```typescript interface EmailValidationOptions { allowInternational?: boolean allowSubdomains?: boolean customDisposableDomains?: string[] whitelistedDomains?: string[] strictMode?: boolean } interface EmailValidationResult { isValid: boolean isDisposable: boolean domain: string | null errors: string[] metadata: { isInternational: boolean hasSubdomains: boolean isWhitelisted: boolean } } interface EmailCheckerConfig extends EmailValidationOptions { enableCaching?: boolean maxCacheSize?: number } interface DomainInfo { domain: string isDisposable: boolean isWhitelisted: boolean isInternational: boolean } ``` ## ๐ŸŒ International Domain Support The library fully supports international domains and provides proper handling for: ```typescript // International domains validateEmail("user@mรผnchen-mail.de") // Properly handled validateEmail("test@ะฒั€ะตะผะตะฝะฝะฐั-ะฟะพั‡ั‚ะฐ.ั€ั„") // International disposable domains // Subdomain analysis validateEmail("user@mail.tempmail.net") // Detects parent domain validateEmail("test@sub.domain.company.com") // Flexible subdomain handling ``` ## ๐ŸŽ๏ธ Performance Characteristics - **O(1) Domain Lookups**: Using Set-based storage for instant domain checking - **Intelligent Caching**: LRU cache with configurable size limits - **Memory Efficient**: Minimal memory footprint with smart data structures - **Bundle Size**: < 10KB minified, < 3KB gzipped ## ๐Ÿ”„ Migration Guide ### From v0.x to v1.x The basic API remains unchanged, but new features are available: ```typescript // v0.x - Still works import { isDisposableEmail } from "@gmana/email-checker" const isDisposable = isDisposableEmail("test@tempmail.com") // v1.x - Enhanced with new features import { validateEmail, configureEmailChecker } from "@gmana/email-checker" // Configure once configureEmailChecker({ whitelistedDomains: ["yourcompany.com"], strictMode: true, }) // Get detailed results const result = validateEmail("test@tempmail.com") ``` ## ๐Ÿค Contributing Contributions are welcome! Here's how you can help: 1. **Add New Disposable Domains**: Submit PRs with new disposable email providers 2. **Report Issues**: Found a legitimate domain being flagged? Let us know! 3. **Feature Requests**: Suggest new features or improvements 4. **Bug Fixes**: Help us squash bugs and improve reliability ## ๐Ÿ“„ License MIT ยฉ [Sun Sreng](https://github.com/sun-sreng) ## ๐Ÿ”— Links - **Homepage**: [https://github.com/sun-sreng/npm-gmana-email-checker](https://github.com/sun-sreng/npm-gmana-email-checker) - **Issues**: [https://github.com/sun-sreng/npm-gmana-email-checker/issues](https://github.com/sun-sreng/npm-gmana-email-checker/issues) - **Sponsor**: [https://github.com/sponsors/sun-sreng](https://github.com/sponsors/sun-sreng) --- <p align="center"> Made with โค๏ธ for the developer community </p>