UNPKG

@nexim/sanitizer

Version:

A collection of sanitization utilities for phone numbers and numeric inputs with TypeScript type safety.

81 lines 2.99 kB
import { createLogger } from './logger.js'; import { convertDigits } from './unicode-digits.js'; import { isNumber } from './utils.js'; const logger = createLogger('@nexim/sanitizer'); export function sanitizeNumberToEnglish(number) { if (typeof number === 'number') { return number; } if (typeof number === 'string') { let str = number.trim(); if (str === '') { logger.error('sanitizeNumberToEnglish', 'empty_string'); return null; } str = convertDigits(str, 'en'); if (!isNumber(str)) { logger.error('sanitizeNumberToEnglish', 'not_a_number'); return null; } return +str; } logger.error('sanitizeNumberToEnglish', 'invalid_input'); return null; } export function sanitizeNumberStringToEnglish(number) { if (typeof number === 'number') { return String(number); } if (typeof number === 'string') { let str = number.trim(); if (str === '') { logger.error('sanitizeNumberStringToEnglish', 'empty_string'); return null; } str = convertDigits(str, 'en'); if (!isNumber(str)) { logger.error('sanitizeNumberStringToEnglish', 'not_a_number'); return null; } return str; // Return string to preserve leading zeros } logger.error('sanitizeNumberStringToEnglish', 'invalid_input'); return null; } /** * Sanitizes a phone number by converting Unicode digits, removing special characters, * and standardizing the format with country code. * * @param input - The phone number input to sanitize * @param countryCode - The country code to apply (default: '98' for Iran) * @returns The sanitized phone number as a number, or null if invalid * * @example * ```ts * sanitizePhoneNumber('09123456789'); // returns 989123456789 * sanitizePhoneNumber('+98 912 345 6789'); // returns 989123456789 * sanitizePhoneNumber('۰۹۱۲۳۴۵۶۷۸۹'); // returns 989123456789 * sanitizePhoneNumber('invalid'); // returns null * ``` */ export function sanitizePhoneNumber(input, countryCode = '98') { if (input == null) { logger.error('sanitizePhoneNumber', 'null_input'); return null; } const inputStr = typeof input === 'string' ? input.trim() : String(input); if (inputStr === '') { logger.error('sanitizePhoneNumber', 'empty_string'); return null; } const englishDigits = convertDigits(inputStr, 'en'); const withoutSpecialChars = englishDigits.replace(/[ )(-]+/g, ''); const cleanNumber = withoutSpecialChars.replace(new RegExp(`^(\\+${countryCode}|${countryCode}|^0)`), ''); const fullNumber = countryCode + cleanNumber; if (fullNumber.length !== countryCode.length + 10 || !isNumber(fullNumber)) { logger.error('sanitizePhoneNumber', 'invalid_full_number'); return null; } return +fullNumber; } //# sourceMappingURL=main.js.map