@gmana/email-checker
Version:
439 lines (323 loc) โข 11.1 kB
Markdown
# @gmana/email-checker
A powerful and lightweight TypeScript library to detect disposable email addresses with advanced validation features and comprehensive domain coverage.
[](https://badge.fury.io/js/@gmana%2Femail-checker)
[](https://www.typescriptlang.org/)
[](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>