A comprehensive TypeScript library for formatting, validating, and analyzing Ethiopian phone numbers. Supports both mobile and landline numbers with advanced error handling and validation.
- π± Mobile Number Support: 09/07 prefixes and +2519/+2517 formats
- π Landline Number Support: +2511 (Addis Ababa), +2512 (Dire Dawa), etc.
- π Smart Validation: Comprehensive phone number validation with detailed error messages
- π Format Conversion: Convert between local (09/07) and international (+251) formats
- π’ Operator Detection: Identify Safaricom, Ethio Telecom, and landline operators
- π Area Code Extraction: Extract regional area codes from phone numbers
- β‘ TypeScript First: Full TypeScript support with comprehensive type definitions
- π¨ Advanced Error Handling: Specific error types for different validation failures
- π§ͺ Comprehensive Testing: 52+ test cases ensuring reliability
npm install phone-formater-ethyarn add phone-formater-ethpnpm add phone-formater-ethimport {
formatPhone,
isMobile,
isLandline,
checkOperator,
validatePhoneNumber
} from 'phone-formater-eth';
// Format phone numbers
const international = formatPhone("0912345678"); // "+251912345678"
const local = formatPhone("+251912345678", "local"); // "0912345678"
// Check phone type
const isMobileNumber = isMobile("0912345678"); // true
const isLandlineNumber = isLandline("+251112345678"); // true
// Get operator information
const operator = checkOperator("0712345678"); // "Safaricom"
// Comprehensive validation
const validation = validatePhoneNumber("0912345678");
console.log(validation);
// {
// isValid: true,
// errors: [],
// formattedNumber: "+251912345678",
// phoneType: "mobile",
// operator: "Ethio Telecom",
// areaCode: "91"
// }Formats Ethiopian phone numbers to either local or international format.
Parameters:
phone: Phone number to formattype: Output format - "local" (09/07) or "international" (+251) - defaults to "international"
Returns: Formatted phone number
Throws: InvalidFormatError | InvalidLengthError | InvalidCharacterError
import { formatPhone } from 'phone-formater-eth';
// International format (default)
formatPhone("0912345678"); // "+251912345678"
formatPhone("0712345678"); // "+251712345678"
formatPhone("912345678"); // "+251912345678"
formatPhone("712345678"); // "+251712345678"
// Local format
formatPhone("0912345678", "local"); // "0912345678"
formatPhone("+251912345678", "local"); // "0912345678"Converts international format to local format.
Parameters:
phone: Phone number in international format (+251...)
Returns: Phone number in local format (09... or 07...)
Throws: InvalidFormatError
import { formatLocal } from 'phone-formater-eth';
formatLocal("+251912345678"); // "0912345678"
formatLocal("+251712345678"); // "0712345678"Validates if a phone number is valid according to Ethiopian standards.
Parameters:
phone: Phone number to validate
Returns: true if valid, false otherwise
Throws: InvalidFormatError
import { isValid } from 'phone-formater-eth';
isValid("0912345678"); // true
isValid("1234567890"); // false
isValid("+251912345678"); // trueChecks if the phone number is a mobile number.
Parameters:
phone: Phone number to check
Returns: true if mobile, false otherwise
Throws: InvalidFormatError | InvalidLengthError
import { isMobile } from 'phone-formater-eth';
isMobile("0912345678"); // true (Ethio Telecom)
isMobile("0712345678"); // true (Safaricom)
isMobile("+251112345678"); // false (Landline)Checks if the phone number is a landline number.
Parameters:
phone: Phone number to check
Returns: true if landline, false otherwise
Throws: InvalidFormatError | InvalidLengthError
import { isLandline } from 'phone-formater-eth';
isLandline("+251112345678"); // true (Addis Ababa)
isLandline("+251212345678"); // true (Dire Dawa)
isLandline("0912345678"); // false (Mobile)Identifies the mobile operator for a given phone number.
Parameters:
phone: Phone number to check
Returns: 'Safaricom', 'Ethio Telecom', or 'UNKNOWN'
Throws: InvalidFormatError | InvalidLengthError
import { checkOperator } from 'phone-formater-eth';
checkOperator("0912345678"); // "Ethio Telecom"
checkOperator("0712345678"); // "Safaricom"
checkOperator("+251112345678"); // "UNKNOWN" (Landline)Gets the phone number type.
Parameters:
phone: Phone number to check
Returns: 'mobile', 'landline', or 'unknown'
Throws: InvalidFormatError | InvalidLengthError
import { getPhoneType } from 'phone-formater-eth';
getPhoneType("0912345678"); // "mobile"
getPhoneType("+251112345678"); // "landline"
getPhoneType("1234567890"); // "unknown" (invalid)Extracts the area code from a phone number.
Parameters:
phone: Phone number to extract area code from
Returns: Area code (e.g., "11" for Addis Ababa) or empty string if invalid
Throws: InvalidFormatError | InvalidLengthError
import { getAreaCode } from 'phone-formater-eth';
getAreaCode("+251112345678"); // "11" (Addis Ababa)
getAreaCode("+251212345678"); // "21" (Dire Dawa)
getAreaCode("+251912345678"); // "91" (Mobile)Cleans and parses phone numbers by removing special characters.
Parameters:
phone: Phone number to clean
Returns: Cleaned phone number
Throws: InvalidCharacterError
import { parse } from 'phone-formater-eth';
parse("(251) 911-123-456"); // "251911123456"
parse("09 123 456 78"); // "0912345678"
parse("+251-91-234-5678"); // "+251912345678"Comprehensive phone number validation with detailed results.
Parameters:
phone: Phone number to validate
Returns: Validation result object
import { validatePhoneNumber } from 'phone-formater-eth';
const result = validatePhoneNumber("0912345678");
console.log(result);
// {
// isValid: true,
// errors: [],
// formattedNumber: "+251912345678",
// phoneType: "mobile",
// operator: "Ethio Telecom",
// areaCode: "91"
// }
const invalidResult = validatePhoneNumber("1234567890");
console.log(invalidResult);
// {
// isValid: false,
// errors: [InvalidFormatError],
// formattedNumber: undefined,
// phoneType: undefined,
// operator: undefined,
// areaCode: undefined
// }The library uses specific error types for different validation failures:
PhoneNumberError- Base error class for all phone number errorsInvalidFormatError- Invalid phone number formatInvalidLengthError- Wrong phone number lengthInvalidCharacterError- Invalid characters in phone numberUnsupportedTypeError- Unsupported phone number typeOperatorNotFoundError- Operator not foundInvalidPhoneNumberError- Legacy error class (deprecated)
import {
formatPhone,
InvalidFormatError,
InvalidLengthError,
InvalidCharacterError
} from 'phone-formater-eth';
try {
const formatted = formatPhone("0912345678");
console.log("Formatted:", formatted);
} catch (error) {
if (error instanceof InvalidFormatError) {
console.error("Invalid format:", error.message);
console.error("Phone number:", error.phoneNumber);
} else if (error instanceof InvalidLengthError) {
console.error("Invalid length:", error.message);
console.error("Actual length:", error.actualLength);
} else if (error instanceof InvalidCharacterError) {
console.error("Invalid characters:", error.message);
console.error("Invalid chars:", error.invalidCharacters);
} else {
console.error("Unexpected error:", error);
}
}- 09XXXXXXXX β +2519XXXXXXXX (Ethio Telecom)
- 07XXXXXXXX β +2517XXXXXXXX (Safaricom)
- 9XXXXXXXX β +2519XXXXXXXX (Ethio Telecom)
- 7XXXXXXXX β +2517XXXXXXXX (Safaricom)
- +2519XXXXXXXX (Already formatted)
- +2517XXXXXXXX (Already formatted)
- +2511XXXXXXXX (Addis Ababa)
- +2512XXXXXXXX (Dire Dawa)
- +2513XXXXXXXX (Gondar)
- +2514XXXXXXXX (Bahir Dar)
- +2515XXXXXXXX (Dessie)
- +2516XXXXXXXX (Jimma)
- +2518XXXXXXXX (Mekelle)
The library automatically handles:
- Spaces:
"09 123 456 78"β"0912345678" - Dashes:
"09-123-456-78"β"0912345678" - Parentheses:
"(09)123-456-78"β"0912345678" - Plus signs:
"+251-91-234-5678"β"+251912345678"
- Error Handling: Functions now throw errors instead of returning "INVALID_PHONE_NUMBER"
- New Error Types: Specific error classes for different validation failures
- Enhanced Validation: More comprehensive input validation
import { formatPhone } from 'phone-formater-eth';
const result = formatPhone("invalid");
if (result === "INVALID_PHONE_NUMBER") {
console.error("Invalid phone number");
}import { formatPhone, InvalidFormatError } from 'phone-formater-eth';
try {
const result = formatPhone("invalid");
console.log("Formatted:", result);
} catch (error) {
if (error instanceof InvalidFormatError) {
console.error("Invalid format:", error.message);
}
}import { isValid } from 'phone-formater-eth';
if (isValid("invalid")) {
// Process valid phone number
} else {
// Handle invalid phone number
}Run the test suite:
npm testThe library includes 52+ comprehensive test cases covering:
- All supported phone number formats
- Error handling scenarios
- Edge cases and boundary conditions
- Integration tests
- Error type validation
- Node.js 14+
- TypeScript 5.0+
- Jest (for testing)
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
Hulunlante Worku
- GitHub: @HuluWZ
- Project: phone-formater-eth
- β¨ Added
isMobile()andisLandline()functions - β¨ Added
getPhoneType()andgetAreaCode()functions - β¨ Added
validatePhoneNumber()comprehensive validation - π¨ Replaced string error returns with specific error classes
- π§ Enhanced input validation and error handling
- π Improved TypeScript types and documentation
- π§ͺ Added comprehensive test suite (52+ tests)
β οΈ Breaking Changes: Error handling now throws exceptions
- Basic phone number formatting
- Operator detection
- Simple validation
Made with β€οΈ for Ethiopia